X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/fa90ece530c124df72ad1fa4645892b62b107be6..661338ff25cce922834bd9941de22713bb990a3e:/lib/lib.php diff --git a/lib/lib.php b/lib/lib.php index 91fe21b2..efe941b0 100644 --- a/lib/lib.php +++ b/lib/lib.php @@ -916,126 +916,3 @@ } return true; } - - function getBucketMemcache() - { - static $m; - - if (!CONST_ConnectionBucket_MemcacheServerAddress) return null; - if (!isset($m)) - { - $m = new Memcached(); - $m->addServer(CONST_ConnectionBucket_MemcacheServerAddress, CONST_ConnectionBucket_MemcacheServerPort); - } - return $m; - } - - function doBucket($asKey, $iRequestCost, $iLeakPerSecond, $iThreshold) - { - $m = getBucketMemcache(); - if (!$m) return 0; - - $iMaxVal = 0; - $t = time(); - - foreach($asKey as $sKey) - { - $aCurrentBlock = $m->get($sKey); - if (!$aCurrentBlock) - { - $aCurrentBlock = array($iRequestCost, $t); - } - else - { - // add RequestCost - // remove leak * the time since the last request - $aCurrentBlock[0] += $iRequestCost - ($t - $aCurrentBlock[1])*$iLeakPerSecond; - $aCurrentBlock[1] = $t; - } - - if ($aCurrentBlock[0] <= 0) - { - $m->delete($sKey); - } - else - { - // If we have hit the threshold stop and record this to the block list - if ($aCurrentBlock[0] >= $iThreshold) - { - $aCurrentBlock[0] = $iThreshold; - - // Make up to 10 attempts to record this to memcache (with locking to prevent conflicts) - $i = 10; - for($i = 0; $i < 10; $i++) - { - $aBlockedList = $m->get('blockedList', null, $hCasToken); - if (!$aBlockedList) - { - $aBlockedList = array(); - $m->add('blockedList', $aBlockedList); - $aBlockedList = $m->get('blockedList', null, $hCasToken); - } - if (!isset($aBlockedList[$sKey])) - { - $aBlockedList[$sKey] = array(1, $t); - } - else - { - $aBlockedList[$sKey][0]++; - $aBlockedList[$sKey][1] = $t; - } - $x = $m->cas($hCasToken, 'blockedList', $aBlockedList); - if ($x) break; - } - } - // Only keep in memcache until the time it would have expired (to avoid clutering memcache) - $m->set($sKey, $aCurrentBlock, $t + 1 + $aCurrentBlock[0]/$iLeakPerSecond); - } - - // Bucket result in the largest bucket we find - $iMaxVal = max($iMaxVal, $aCurrentBlock[0]); - } - - return $iMaxVal; - } - - function byLastBlockTime($a, $b) - { - if ($a['lastBlockTimestamp'] == $b['lastBlockTimestamp']) - { - return 0; - } - return ($a['lastBlockTimestamp'] > $b['lastBlockTimestamp']) ? -1 : 1; - } - - function getBucketBlocks() - { - $m = getBucketMemcache(); - if (!$m) return null; - $t = time(); - $aBlockedList = $m->get('blockedList', null, $hCasToken); - if (!$aBlockedList) $aBlockedList = array(); - foreach($aBlockedList as $sKey => $aDetails) - { - $aCurrentBlock = $m->get($sKey); - if (!$aCurrentBlock) $aCurrentBlock = array(0, $t); - $iCurrentBucketSize = max(0, $aCurrentBlock[0] - ($t - $aCurrentBlock[1])*CONST_ConnectionBucket_LeakRate); - $aBlockedList[$sKey] = array( - 'totalBlocks' => $aDetails[0], - 'lastBlockTimestamp' => $aDetails[1], - 'currentBucketSize' => $iCurrentBucketSize, - 'lastRequestBlocked' => $aCurrentBlock[0] >= CONST_ConnectionBucket_BlockLimit, - 'currentlyBlocked' => $iCurrentBucketSize + (CONST_ConnectionBucket_Cost_Reverse) >= CONST_ConnectionBucket_BlockLimit, - ); - } - uasort($aBlockedList, 'byLastBlockTime'); - return $aBlockedList; - } - - function clearBucketBlocks() - { - $m = getBucketMemcache(); - if (!$m) return false; - $m->delete('blockedList'); - return true; - }