From 99512fd3d60d98116c872a2e63dff4b1a4500f09 Mon Sep 17 00:00:00 2001 From: Reedy Date: Thu, 28 Feb 2013 01:22:49 +0000 Subject: [PATCH] Move LoadBalancer::pickRandom() to wfPickRandom() Code is copypaste reused in other extensions Change-Id: I4c677ddc01ee264f3b72bb17135972adc96144ae --- includes/GlobalFunctions.php | 34 ++++++++++++++++++++++++++++++++++ includes/db/LoadBalancer.php | 26 +++----------------------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index a2b882ff89..121d6caef2 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -329,6 +329,40 @@ function wfRandomString( $length = 32 ) { return substr( $str, 0, $length ); } +/** + * Given an array of non-normalised probabilities, this function will select + * an element and return the appropriate key + * + * @param $weights array + * + * @return int|string + */ +function wfPickRandom( $weights ){ + if ( !is_array( $weights ) || count( $weights ) == 0 ) { + return false; + } + + $sum = array_sum( $weights ); + if ( $sum == 0 ) { + # No loads on any of them + # In previous versions, this triggered an unweighted random selection, + # but this feature has been removed as of April 2006 to allow for strict + # separation of query groups. + return false; + } + $max = mt_getrandmax(); + $rand = mt_rand( 0, $max ) / $max * $sum; + + $sum = 0; + foreach ( $weights as $i => $w ) { + $sum += $w; + if ( $sum >= $rand ) { + break; + } + } + return $i; +} + /** * We want some things to be included as literal characters in our title URLs * for prettiness, which urlencode encodes by default. According to RFC 1738, diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php index 13fa466523..d249c27d64 100644 --- a/includes/db/LoadBalancer.php +++ b/includes/db/LoadBalancer.php @@ -117,34 +117,14 @@ class LoadBalancer { * Given an array of non-normalised probabilities, this function will select * an element and return the appropriate key * + * @deprecated 1.21, use wfPickRandom() + * * @param $weights array * * @return int */ function pickRandom( $weights ) { - if ( !is_array( $weights ) || count( $weights ) == 0 ) { - return false; - } - - $sum = array_sum( $weights ); - if ( $sum == 0 ) { - # No loads on any of them - # In previous versions, this triggered an unweighted random selection, - # but this feature has been removed as of April 2006 to allow for strict - # separation of query groups. - return false; - } - $max = mt_getrandmax(); - $rand = mt_rand( 0, $max ) / $max * $sum; - - $sum = 0; - foreach ( $weights as $i => $w ) { - $sum += $w; - if ( $sum >= $rand ) { - break; - } - } - return $i; + return wfPickRandom( $weights ); } /** -- 2.20.1