X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flibs%2Flockmanager%2FQuorumLockManager.php;h=1d2e21aa0d70a3c99be8f71f8f8720426ce048cc;hb=c2adecb31b16a36efdb509a575533c7f103a0576;hp=a89d864ac208420999c1e4df22cb89fd4dcd5586;hpb=7c6d2a0fa28746b49d79345b609d9c7605ed4d63;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/lockmanager/QuorumLockManager.php b/includes/libs/lockmanager/QuorumLockManager.php index a89d864ac2..1d2e21aa0d 100644 --- a/includes/libs/lockmanager/QuorumLockManager.php +++ b/includes/libs/lockmanager/QuorumLockManager.php @@ -127,6 +127,39 @@ abstract class QuorumLockManager extends LockManager { * @return StatusValue */ final protected function doLockingRequestBucket( $bucket, array $pathsByType ) { + return $this->collectPledgeQuorum( + $bucket, + function ( $lockSrv ) use ( $pathsByType ) { + return $this->getLocksOnServer( $lockSrv, $pathsByType ); + } + ); + } + + /** + * Attempt to release locks with the peers for a bucket + * + * @param int $bucket + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths + * @return StatusValue + */ + final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) { + return $this->releasePledges( + $bucket, + function ( $lockSrv ) use ( $pathsByType ) { + return $this->freeLocksOnServer( $lockSrv, $pathsByType ); + } + ); + } + + /** + * Attempt to acquire pledges with the peers for a bucket. + * This is all or nothing; if any key is already pledged then this totally fails. + * + * @param int $bucket + * @param callable $callback Pledge method taking a server name and yeilding a StatusValue + * @return StatusValue + */ + final protected function collectPledgeQuorum( $bucket, callable $callback ) { $status = StatusValue::newGood(); $yesVotes = 0; // locks made on trustable servers @@ -141,7 +174,7 @@ abstract class QuorumLockManager extends LockManager { continue; // server down? } // Attempt to acquire the lock on this peer - $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) ); + $status->merge( $callback( $lockSrv ) ); if ( !$status->isOK() ) { return $status; // vetoed; resource locked } @@ -162,13 +195,13 @@ abstract class QuorumLockManager extends LockManager { } /** - * Attempt to release locks with the peers for a bucket + * Attempt to release pledges with the peers for a bucket * * @param int $bucket - * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths + * @param callable $callback Pledge method taking a server name and yeilding a StatusValue * @return StatusValue */ - final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) { + final protected function releasePledges( $bucket, callable $callback ) { $status = StatusValue::newGood(); $yesVotes = 0; // locks freed on trustable servers @@ -180,7 +213,7 @@ abstract class QuorumLockManager extends LockManager { $status->warning( 'lockmanager-fail-svr-release', $lockSrv ); } else { // Attempt to release the lock on this peer - $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) ); + $status->merge( $callback( $lockSrv ) ); ++$yesVotes; // success for this peer // Normally the first peers form the quorum, and the others are ignored. // Ignore them in this case, but not when an alternative quorum was used.