MediaWiki REL1_34
|
Convenience class for weighted consistent hash rings. More...
Public Member Functions | |
__construct (array $map, $algo='sha1', array $ejections=[]) | |
Make a consistent hash ring given a set of locations and their weight values. | |
ejectFromLiveRing ( $location, $ttl) | |
Remove a location from the "live" hash ring. | |
getLiveLocation ( $item) | |
Get the location of an item on the "live" ring. | |
getLiveLocations ( $item, $limit) | |
Get the location of an item on the "live" ring, as well as the next locations. | |
getLiveLocationWeights () | |
Get the map of "live" locations to weight (does not include zero weight items) | |
getLocation ( $item) | |
Get the location of an item on the ring. | |
getLocations ( $item, $limit, $from=self::RING_ALL) | |
Get the location of an item on the ring followed by the next ring locations. | |
getLocationWeights () | |
Get the map of locations to weight (does not include zero weight items) | |
serialize () | |
unserialize ( $serialized) | |
Public Attributes | |
const | KEY_LOCATION = 1 |
const | KEY_POS = 0 |
Protected Member Functions | |
getCurrentTime () | |
getLiveRing () | |
Get the "live" hash ring (which does not include ejected locations) | |
init (array $map, $algo, array $ejections) | |
Protected Attributes | |
string | $algo |
Hashing algorithm for hash() | |
array[] | $baseRing |
Non-empty position-ordered list of (position, location name) | |
int[] | $ejectExpiryByLocation |
Map of (location => UNIX timestamp) | |
array[] | $liveRing |
Non-empty position-ordered list of (position, location name) | |
int[] | $weightByLocation |
Non-empty (location => integer weight) | |
Private Member Functions | |
buildLocationRing (array $weightByLocation) | |
findNodeIndexForPosition ( $position, $ring) | |
getItemPosition ( $item) | |
getNextClockwiseNodeIndex ( $i, $ring) | |
getNodePositionQuartet ( $nodeGroupName) | |
Convenience class for weighted consistent hash rings.
This deterministically maps "keys" to a set of "locations" while avoiding clumping
Each location is represented by a number of nodes on a ring proportionate to the ratio of its weight compared to the total location weight. Note positions are deterministically derived from the hash of the location name. Nodes are responsible for the portion of the ring, counter-clockwise, up until the next node. Locations are responsible for all portions of the ring that the location's nodes are responsible for.
A location that is temporarily "ejected" is said to be absent from the "live" ring. If no location ejections are active, then the base ring and live ring are identical.
Definition at line 39 of file HashRing.php.
HashRing::__construct | ( | array | $map, |
$algo = 'sha1' , |
|||
array | $ejections = [] |
||
) |
Make a consistent hash ring given a set of locations and their weight values.
int[] | $map | Map of (location => weight) |
string | $algo | Hashing algorithm listed in hash_algos() [optional] |
int[] | $ejections | Map of (location => UNIX timestamp) for ejection expiries |
Definition at line 75 of file HashRing.php.
|
private |
int[] | $weightByLocation |
Definition at line 282 of file HashRing.php.
References $weightByLocation, and getNodePositionQuartet().
Referenced by init().
HashRing::ejectFromLiveRing | ( | $location, | |
$ttl | |||
) |
Remove a location from the "live" hash ring.
string | $location | |
int | $ttl | Seconds |
UnexpectedValueException |
Definition at line 222 of file HashRing.php.
References getCurrentTime().
Referenced by JobQueueFederated\tryJobInsertions().
|
private |
float | $position | |
array[] | $ring | Either the base or live ring |
Definition at line 167 of file HashRing.php.
References KEY_POS.
Referenced by getLocations().
|
protected |
Definition at line 433 of file HashRing.php.
Referenced by ejectFromLiveRing(), getLiveLocationWeights(), and getLiveRing().
|
private |
string | $item | Key |
Definition at line 334 of file HashRing.php.
Referenced by getLocations().
|
final |
Get the location of an item on the "live" ring.
string | $item |
UnexpectedValueException |
Definition at line 242 of file HashRing.php.
References getLocations().
Referenced by JobQueueFederated\tryJobInsertions().
|
final |
Get the location of an item on the "live" ring, as well as the next locations.
string | $item | |
int | $limit | Maximum number of locations to return |
UnexpectedValueException |
Definition at line 254 of file HashRing.php.
References getLocations().
HashRing::getLiveLocationWeights | ( | ) |
Get the map of "live" locations to weight (does not include zero weight items)
UnexpectedValueException |
Definition at line 264 of file HashRing.php.
References getCurrentTime().
Referenced by JobQueueFederated\doBatchPush(), and JobQueueFederated\tryJobInsertions().
|
protected |
Get the "live" hash ring (which does not include ejected locations)
UnexpectedValueException |
Definition at line 391 of file HashRing.php.
References $baseRing, $liveRing, getCurrentTime(), and KEY_LOCATION.
Referenced by getLocations().
|
final |
Get the location of an item on the ring.
string | $item |
UnexpectedValueException |
Definition at line 109 of file HashRing.php.
References getLocations().
HashRing::getLocations | ( | $item, | |
$limit, | |||
$from = self::RING_ALL |
|||
) |
Get the location of an item on the ring followed by the next ring locations.
string | $item | |
int | $limit | Maximum number of locations to return |
int | $from | One of the RING_* class constants |
InvalidArgumentException | |
UnexpectedValueException |
Definition at line 123 of file HashRing.php.
References $baseRing, findNodeIndexForPosition(), getItemPosition(), getLiveRing(), getNextClockwiseNodeIndex(), and KEY_LOCATION.
Referenced by getLiveLocation(), getLiveLocations(), and getLocation().
HashRing::getLocationWeights | ( | ) |
Get the map of locations to weight (does not include zero weight items)
Definition at line 210 of file HashRing.php.
References $weightByLocation.
|
private |
int | $i | Valid index for a node in the ring |
array[] | $ring | Either the base or live ring |
Definition at line 375 of file HashRing.php.
Referenced by getLocations().
|
private |
string | $nodeGroupName |
Definition at line 356 of file HashRing.php.
Referenced by buildLocationRing().
|
protected |
int[] | $map | Map of (location => integer) |
string | $algo | Hashing algorithm |
int[] | $ejections | Map of (location => UNIX timestamp) for ejection expires |
Definition at line 84 of file HashRing.php.
References $algo, $weightByLocation, and buildLocationRing().
Referenced by __construct(), and unserialize().
HashRing::serialize | ( | ) |
HashRing::unserialize | ( | $serialized | ) |
Definition at line 445 of file HashRing.php.
References $serialized, init(), and unserialize().
Referenced by unserialize().
|
protected |
Hashing algorithm for hash()
Definition at line 41 of file HashRing.php.
Referenced by __construct(), and init().
|
protected |
Non-empty position-ordered list of (position, location name)
Definition at line 48 of file HashRing.php.
Referenced by getLiveRing(), and getLocations().
|
protected |
Map of (location => UNIX timestamp)
Definition at line 45 of file HashRing.php.
|
protected |
Non-empty position-ordered list of (position, location name)
Definition at line 50 of file HashRing.php.
Referenced by getLiveRing().
|
protected |
Non-empty (location => integer weight)
Definition at line 43 of file HashRing.php.
Referenced by buildLocationRing(), getLocationWeights(), and init().
const HashRing::KEY_LOCATION = 1 |
Definition at line 60 of file HashRing.php.
Referenced by getLiveRing(), and getLocations().
const HashRing::KEY_POS = 0 |
Definition at line 59 of file HashRing.php.
Referenced by findNodeIndexForPosition().