From: Aaron Schulz Date: Wed, 29 Mar 2017 20:45:31 +0000 (-0700) Subject: Split out some internal methods in QuorumLockManager for readability X-Git-Tag: 1.31.0-rc.0~3619^2 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=d4b06eb2082dda7ef493e42916d4650ea773ae40 Split out some internal methods in QuorumLockManager for readability Change-Id: I74930b930b18110c9f20b945c87790f898258ad5 --- 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.