diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php --- a/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php +++ b/src/applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php @@ -56,7 +56,21 @@ $lock_name = 'repository.update:'.$repository->getID(); $lock = PhabricatorGlobalLock::newLock($lock_name); - $lock->lock(); + try { + $lock->lock(); + } catch (PhutilLockException $ex) { + throw new PhutilProxyException( + pht( + 'Another process is currently holding the update lock for '. + 'repository "%s". Repositories may only be updated by one '. + 'process at a time. This can happen if you are running multiple '. + 'copies of the daemons. This can also happen if you manually '. + 'update a repository while the daemons are also updating it '. + '(in this case, just try again in a few moments).', + $repository->getMonogram()), + $ex); + } + try { $no_discovery = $args->getArg('no-discovery'); diff --git a/src/infrastructure/util/PhabricatorGlobalLock.php b/src/infrastructure/util/PhabricatorGlobalLock.php --- a/src/infrastructure/util/PhabricatorGlobalLock.php +++ b/src/infrastructure/util/PhabricatorGlobalLock.php @@ -28,7 +28,6 @@ */ final class PhabricatorGlobalLock extends PhutilLock { - private $lockname; private $conn; private static $pool = array(); @@ -41,7 +40,7 @@ $namespace = PhabricatorLiskDAO::getStorageNamespace(); $namespace = PhabricatorHash::digestToLength($namespace, 20); - $full_name = $namespace.'-g:'.$name; + $full_name = 'ph:'.$namespace.':'.$name; $length_limit = 64; if (strlen($full_name) > $length_limit) { @@ -57,7 +56,6 @@ $lock = self::getLock($full_name); if (!$lock) { $lock = new PhabricatorGlobalLock($full_name); - $lock->lockname = $name; self::registerLock($lock); } @@ -99,7 +97,7 @@ $result = queryfx_one( $conn, 'SELECT GET_LOCK(%s, %f)', - 'phabricator:'.$this->lockname, + $this->getName(), $wait); $ok = head($result); @@ -114,7 +112,7 @@ queryfx( $this->conn, 'SELECT RELEASE_LOCK(%s)', - 'phabricator:'.$this->lockname); + $this->getName()); $this->conn->close(); self::$pool[] = $this->conn;