Differential D19247 Diff 46086 src/applications/diffusion/protocol/DiffusionRepositoryClusterEngine.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/diffusion/protocol/DiffusionRepositoryClusterEngine.php
Show First 20 Lines • Show All 145 Lines • ▼ Show 20 Lines | public function synchronizeWorkingCopyBeforeRead() { | ||||
$read_lock = PhabricatorRepositoryWorkingCopyVersion::getReadLock( | $read_lock = PhabricatorRepositoryWorkingCopyVersion::getReadLock( | ||||
$repository_phid, | $repository_phid, | ||||
$device_phid); | $device_phid); | ||||
$lock_wait = phutil_units('2 minutes in seconds'); | $lock_wait = phutil_units('2 minutes in seconds'); | ||||
$this->logLine( | $this->logLine( | ||||
pht( | pht( | ||||
'Waiting up to %s second(s) for a cluster read lock on "%s"...', | 'Acquiring read lock for repository "%s" on device "%s"...', | ||||
new PhutilNumber($lock_wait), | $repository->getDisplayName(), | ||||
$device->getName())); | $device->getName())); | ||||
try { | try { | ||||
$start = PhabricatorTime::getNow(); | $start = PhabricatorTime::getNow(); | ||||
$read_lock->lock($lock_wait); | $read_lock->lock($lock_wait); | ||||
$waited = (PhabricatorTime::getNow() - $start); | $waited = (PhabricatorTime::getNow() - $start); | ||||
if ($waited) { | if ($waited) { | ||||
▲ Show 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | public function synchronizeWorkingCopyBeforeWrite() { | ||||
$table = new PhabricatorRepositoryWorkingCopyVersion(); | $table = new PhabricatorRepositoryWorkingCopyVersion(); | ||||
$locked_connection = $table->establishConnection('w'); | $locked_connection = $table->establishConnection('w'); | ||||
$write_lock = PhabricatorRepositoryWorkingCopyVersion::getWriteLock( | $write_lock = PhabricatorRepositoryWorkingCopyVersion::getWriteLock( | ||||
$repository_phid); | $repository_phid); | ||||
$write_lock->useSpecificConnection($locked_connection); | $write_lock->useSpecificConnection($locked_connection); | ||||
$lock_wait = phutil_units('2 minutes in seconds'); | |||||
$this->logLine( | $this->logLine( | ||||
pht( | pht( | ||||
'Waiting up to %s second(s) for a cluster write lock...', | 'Acquiring write lock for repository "%s"...', | ||||
new PhutilNumber($lock_wait))); | $repository->getDisplayName())); | ||||
$lock_wait = phutil_units('2 minutes in seconds'); | |||||
try { | try { | ||||
$start = PhabricatorTime::getNow(); | $start = PhabricatorTime::getNow(); | ||||
$write_lock->lock($lock_wait); | $step_wait = 1; | ||||
while (true) { | |||||
try { | |||||
$write_lock->lock((int)floor($step_wait)); | |||||
break; | |||||
} catch (PhutilLockException $ex) { | |||||
$waited = (PhabricatorTime::getNow() - $start); | $waited = (PhabricatorTime::getNow() - $start); | ||||
if ($waited > $lock_wait) { | |||||
throw $ex; | |||||
} | |||||
$this->logActiveWriter($viewer, $repository); | |||||
} | |||||
// Wait a little longer before the next message we print. | |||||
$step_wait = $step_wait + 0.5; | |||||
$step_wait = min($step_wait, 3); | |||||
} | |||||
$waited = (PhabricatorTime::getNow() - $start); | |||||
if ($waited) { | if ($waited) { | ||||
$this->logLine( | $this->logLine( | ||||
pht( | pht( | ||||
'Acquired write lock after %s second(s).', | 'Acquired write lock after %s second(s).', | ||||
new PhutilNumber($waited))); | new PhutilNumber($waited))); | ||||
} else { | } else { | ||||
$this->logLine( | $this->logLine( | ||||
pht( | pht( | ||||
▲ Show 20 Lines • Show All 427 Lines • ▼ Show 20 Lines | if (!Filesystem::pathExists($local_path)) { | ||||
'construct one or run `bin/repository update %s` on this host '. | 'construct one or run `bin/repository update %s` on this host '. | ||||
'("%s") to build it explicitly.', | '("%s") to build it explicitly.', | ||||
$repository->getDisplayName(), | $repository->getDisplayName(), | ||||
$repository->getMonogram(), | $repository->getMonogram(), | ||||
$device->getName())); | $device->getName())); | ||||
} | } | ||||
} | } | ||||
private function logActiveWriter( | |||||
PhabricatorUser $viewer, | |||||
PhabricatorRepository $repository) { | |||||
$writer = PhabricatorRepositoryWorkingCopyVersion::loadWriter( | |||||
$repository->getPHID()); | |||||
if (!$writer) { | |||||
$this->logLine(pht('Waiting on another user to finish writing...')); | |||||
asherkin: Missing `return`? | |||||
return; | |||||
} | |||||
$user_phid = $writer->getWriteProperty('userPHID'); | |||||
$device_phid = $writer->getWriteProperty('devicePHID'); | |||||
$epoch = $writer->getWriteProperty('epoch'); | |||||
$phids = array($user_phid, $device_phid); | |||||
$handles = $viewer->loadHandles($phids); | |||||
$duration = (PhabricatorTime::getNow() - $epoch) + 1; | |||||
$this->logLine( | |||||
pht( | |||||
'Waiting for %s to finish writing (on device "%s" for %ss)...', | |||||
$handles[$user_phid]->getName(), | |||||
$handles[$device_phid]->getName(), | |||||
new PhutilNumber($duration))); | |||||
} | |||||
} | } |
Missing return?