1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-26 23:40:57 +01:00

Improve messaging around repository locks

Summary:
Fixes T6958. Ref T7484.

  - When we collide on a lock in `bin/repository update`, explain what that means.
  - GlobalLock currently uses a "lock name" which is different from the lock's actual name. Don't do this. There's a small chance this fixes T7484, but I don't have high hopes.

Test Plan: Ran `bin/repository update X` in two windows really fast, got the new message in one of them.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T6958, T7484

Differential Revision: https://secure.phabricator.com/D12574
This commit is contained in:
epriestley 2015-04-27 10:25:53 -07:00
parent 12dc865a00
commit fad75f939d
2 changed files with 18 additions and 6 deletions

View file

@ -56,7 +56,21 @@ final class PhabricatorRepositoryManagementUpdateWorkflow
$lock_name = 'repository.update:'.$repository->getID(); $lock_name = 'repository.update:'.$repository->getID();
$lock = PhabricatorGlobalLock::newLock($lock_name); $lock = PhabricatorGlobalLock::newLock($lock_name);
try {
$lock->lock(); $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 { try {
$no_discovery = $args->getArg('no-discovery'); $no_discovery = $args->getArg('no-discovery');

View file

@ -28,7 +28,6 @@
*/ */
final class PhabricatorGlobalLock extends PhutilLock { final class PhabricatorGlobalLock extends PhutilLock {
private $lockname;
private $conn; private $conn;
private static $pool = array(); private static $pool = array();
@ -41,7 +40,7 @@ final class PhabricatorGlobalLock extends PhutilLock {
$namespace = PhabricatorLiskDAO::getStorageNamespace(); $namespace = PhabricatorLiskDAO::getStorageNamespace();
$namespace = PhabricatorHash::digestToLength($namespace, 20); $namespace = PhabricatorHash::digestToLength($namespace, 20);
$full_name = $namespace.'-g:'.$name; $full_name = 'ph:'.$namespace.':'.$name;
$length_limit = 64; $length_limit = 64;
if (strlen($full_name) > $length_limit) { if (strlen($full_name) > $length_limit) {
@ -57,7 +56,6 @@ final class PhabricatorGlobalLock extends PhutilLock {
$lock = self::getLock($full_name); $lock = self::getLock($full_name);
if (!$lock) { if (!$lock) {
$lock = new PhabricatorGlobalLock($full_name); $lock = new PhabricatorGlobalLock($full_name);
$lock->lockname = $name;
self::registerLock($lock); self::registerLock($lock);
} }
@ -99,7 +97,7 @@ final class PhabricatorGlobalLock extends PhutilLock {
$result = queryfx_one( $result = queryfx_one(
$conn, $conn,
'SELECT GET_LOCK(%s, %f)', 'SELECT GET_LOCK(%s, %f)',
'phabricator:'.$this->lockname, $this->getName(),
$wait); $wait);
$ok = head($result); $ok = head($result);
@ -114,7 +112,7 @@ final class PhabricatorGlobalLock extends PhutilLock {
queryfx( queryfx(
$this->conn, $this->conn,
'SELECT RELEASE_LOCK(%s)', 'SELECT RELEASE_LOCK(%s)',
'phabricator:'.$this->lockname); $this->getName());
$this->conn->close(); $this->conn->close();
self::$pool[] = $this->conn; self::$pool[] = $this->conn;