if (!CONST_ConnectionBucket_MemcacheServerAddress) return null;
if (!isset($m))
{
- $m = new Memcached();
- $m->addServer(CONST_ConnectionBucket_MemcacheServerAddress, CONST_ConnectionBucket_MemcacheServerPort);
+ $m = new Memcached();
+ $m->addServer(CONST_ConnectionBucket_MemcacheServerAddress, CONST_ConnectionBucket_MemcacheServerPort);
}
return $m;
}
function doBucket($asKey, $iRequestCost, $iLeakPerSecond, $iThreshold)
{
- $m = getBucketMemcache();
+ $m = getBucketMemcache();
if (!$m) return 0;
$iMaxVal = 0;
- $t = time();
+ $t = time();
foreach($asKey as $sKey)
{
- $aCurrentBlock = $m->get($sKey);
- if (!$aCurrentBlock)
+ $aCurrentBlock = $m->get($sKey);
+ if (!$aCurrentBlock)
{
- $aCurrentBlock = array($iRequestCost, $t);
- }
+ $aCurrentBlock = array($iRequestCost, $t, false);
+ }
else
{
// add RequestCost
// remove leak * the time since the last request
- $aCurrentBlock[0] += $iRequestCost - ($t - $aCurrentBlock[1])*$iLeakPerSecond;
- $aCurrentBlock[1] = $t;
+ $aCurrentBlock[0] += $iRequestCost - ($t - $aCurrentBlock[1])*$iLeakPerSecond;
+ $aCurrentBlock[1] = $t;
}
- if ($aCurrentBlock[0] <= 0)
+ if ($aCurrentBlock[0] <= 0)
{
- $m->delete($sKey);
- }
+ $m->delete($sKey);
+ }
else
{
// If we have hit the threshold stop and record this to the block list
}
}
// Only keep in memcache until the time it would have expired (to avoid clutering memcache)
- $m->set($sKey, $aCurrentBlock, $t + 1 + $aCurrentBlock[0]/$iLeakPerSecond);
+ $m->set($sKey, $aCurrentBlock, $t + 1 + $aCurrentBlock[0]/$iLeakPerSecond);
}
// Bucket result in the largest bucket we find
}
return $iMaxVal;
- }
+ }
+
+ function isBucketSleeping($asKey)
+ {
+ $m = getBucketMemcache();
+ if (!$m) return false;
+
+ foreach($asKey as $sKey)
+ {
+ $aCurrentBlock = $m->get($sKey);
+ if ($aCurrentBlock[2]) return true;
+ }
+ return false;
+ }
+
+ function setBucketSleeping($asKey, $bVal)
+ {
+ $m = getBucketMemcache();
+ if (!$m) return false;
+
+ $iMaxVal = 0;
+ $t = time();
+
+ foreach($asKey as $sKey)
+ {
+ $aCurrentBlock = $m->get($sKey);
+ $aCurrentBlock[2] = $bVal;
+ $m->set($sKey, $aCurrentBlock, $t + 1 + $aCurrentBlock[0]/CONST_ConnectionBucket_LeakRate);
+ }
+ return true;
+ }
function byValue1($a, $b)
{
function getBucketBlocks()
{
- $m = getBucketMemcache();
+ $m = getBucketMemcache();
if (!$m) return null;
- $t = time();
+ $t = time();
$aBlockedList = $m->get('blockedList', null, $hCasToken);
if (!$aBlockedList) $aBlockedList = array();
foreach($aBlockedList as $sKey => $aDetails)
$aBlockedList[$sKey] = array(
'totalBlocks' => $aDetails[0],
'lastBlockTimestamp' => $aDetails[1],
+ 'isSleeping' => (isset($aCurrentBlock[2])?$aCurrentBlock[2]:false),
'currentBucketSize' => $iCurrentBucketSize,
'currentlyBlocked' => $iCurrentBucketSize + (CONST_ConnectionBucket_Cost_Reverse) >= CONST_ConnectionBucket_BlockLimit,
);
function clearBucketBlocks()
{
- $m = getBucketMemcache();
+ $m = getBucketMemcache();
if (!$m) return false;
$m->delete('blockedList');
return true;