diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2012-05-03 13:01:35 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2012-05-03 13:01:35 +0200 |
commit | d9022f63880ce039446fba8364f68e656b7bf4cb (patch) | |
tree | 16b40fbf17bf7c9ee6f4ead25b16dd192378050a /includes/PoolCounter.php | |
parent | 27cf83d177256813e2e802241085fce5dd0f3fb9 (diff) |
Update to MediaWiki 1.19.0
Diffstat (limited to 'includes/PoolCounter.php')
-rw-r--r-- | includes/PoolCounter.php | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php index 182520e1..83ae0abe 100644 --- a/includes/PoolCounter.php +++ b/includes/PoolCounter.php @@ -1,11 +1,11 @@ <?php /** - * When you have many workers (threads/servers) giving service, and a + * When you have many workers (threads/servers) giving service, and a * cached item expensive to produce expires, you may get several workers * doing the job at the same time. * - * Given enough requests and the item expiring fast (non-cacheable, + * Given enough requests and the item expiring fast (non-cacheable, * lots of edits...) that single work can end up unfairly using most (all) * of the cpu of the pool. This is also known as 'Michael Jackson effect' * since this effect triggered on the english wikipedia on the day Michael @@ -15,16 +15,16 @@ * The PoolCounter provides semaphore semantics for restricting the number * of workers that may be concurrently performing such single task. * - * By default PoolCounter_Stub is used, which provides no locking. You + * By default PoolCounter_Stub is used, which provides no locking. You * can get a useful one in the PoolCounter extension. */ abstract class PoolCounter { - + /* Return codes */ const LOCKED = 1; /* Lock acquired */ const RELEASED = 2; /* Lock released */ const DONE = 3; /* Another worker did the work for you */ - + const ERROR = -1; /* Indeterminate error */ const NOT_LOCKED = -2; /* Called release() with no lock held */ const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */ @@ -33,38 +33,38 @@ abstract class PoolCounter { /** * I want to do this task and I need to do it myself. - * + * * @return Locked/Error */ abstract function acquireForMe(); /** - * I want to do this task, but if anyone else does it + * I want to do this task, but if anyone else does it * instead, it's also fine for me. I will read its cached data. - * + * * @return Locked/Done/Error */ abstract function acquireForAnyone(); /** * I have successfully finished my task. - * Lets another one grab the lock, and returns the workers + * Lets another one grab the lock, and returns the workers * waiting on acquireForAnyone() - * + * * @return Released/NotLocked/Error */ abstract function release(); - + /** * $key: All workers with the same key share the lock. - * $workers: It wouldn't be a good idea to have more than this number of + * $workers: It wouldn't be a good idea to have more than this number of * workers doing the task simultaneously. - * $maxqueue: If this number of workers are already working/waiting, + * $maxqueue: If this number of workers are already working/waiting, * fail instead of wait. * $timeout: Maximum time in seconds to wait for the lock. */ protected $key, $workers, $maxqueue, $timeout; - + /** * Create a Pool counter. This should only be called from the PoolWorks. * @@ -80,10 +80,10 @@ abstract class PoolCounter { } $conf = $wgPoolCounterConf[$type]; $class = $conf['class']; - + return new $class( $conf, $type, $key ); } - + protected function __construct( $conf, $type, $key ) { $this->key = $key; $this->workers = $conf['workers']; @@ -125,7 +125,7 @@ class PoolCounter_Stub extends PoolCounter { */ abstract class PoolCounterWork { protected $cacheable = false; //Does this override getCachedWork() ? - + /** * Actually perform the work, caching it if needed. */ @@ -140,30 +140,34 @@ abstract class PoolCounterWork { } /** - * A work not so good (eg. expired one) but better than an error + * A work not so good (eg. expired one) but better than an error * message. * @return mixed work result or false */ function fallback() { return false; } - + /** * Do something with the error, like showing it to the user. */ - function error( $status ) { + function error( $status ) { return false; } /** * Log an error + * + * @param $status Status */ function logError( $status ) { wfDebugLog( 'poolcounter', $status->getWikiText() ); } - + /** * Get the result of the work (whatever it is), or false. + * @param $skipcache bool + * @return bool|mixed */ function execute( $skipcache = false ) { if ( $this->cacheable && !$skipcache ) { @@ -183,7 +187,7 @@ abstract class PoolCounterWork { $result = $this->doWork(); $this->poolCounter->release(); return $result; - + case PoolCounter::DONE: $result = $this->getCachedWork(); if ( $result === false ) { @@ -193,27 +197,27 @@ abstract class PoolCounterWork { return $this->execute( true ); } return $result; - + case PoolCounter::QUEUE_FULL: case PoolCounter::TIMEOUT: $result = $this->fallback(); - + if ( $result !== false ) { return $result; } /* no break */ - + /* These two cases should never be hit... */ case PoolCounter::ERROR: default: $errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' ); - - $status = Status::newFatal( isset($errors[$status->value]) ? $errors[$status->value] : 'pool-errorunknown' ); + + $status = Status::newFatal( isset( $errors[$status->value] ) ? $errors[$status->value] : 'pool-errorunknown' ); $this->logError( $status ); return $this->error( $status ); } } - + function __construct( $type, $key ) { $this->poolCounter = PoolCounter::factory( $type, $key ); } |