X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/274f38105249c24d355b1f46749c3841ffff6ff0..fa7730d4af7c330d5443c6ae32f5ab73c48bf7a3:/lib/leakybucket.php?ds=sidebyside diff --git a/lib/leakybucket.php b/lib/leakybucket.php index 778fe580..47e84477 100644 --- a/lib/leakybucket.php +++ b/lib/leakybucket.php @@ -7,39 +7,39 @@ 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 @@ -77,7 +77,7 @@ } } // 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 @@ -85,7 +85,37 @@ } 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) { @@ -107,9 +137,9 @@ 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) @@ -120,6 +150,7 @@ $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, ); @@ -130,7 +161,7 @@ function clearBucketBlocks() { - $m = getBucketMemcache(); + $m = getBucketMemcache(); if (!$m) return false; $m->delete('blockedList'); return true;