Page MenuHomePhabricator

D19850.id47400.diff
No OneTemporary

D19850.id47400.diff

diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php
--- a/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php
+++ b/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php
@@ -15,10 +15,11 @@
array(
array(
'name' => 'demote',
- 'param' => 'device',
+ 'param' => 'device/service',
'help' => pht(
- 'Demote a device, discarding local changes. Clears stuck '.
- 'write locks and recovers from lost leaders.'),
+ 'Demote a device (or all devices in a service) discarding '.
+ 'local changes. Clears stuck write locks and recovers from '.
+ 'lost leaders.'),
),
array(
'name' => 'promote',
@@ -61,15 +62,53 @@
pht('Specify either --promote or --demote, but not both.'));
}
- $device_name = nonempty($promote, $demote);
+ $target_name = nonempty($promote, $demote);
- $device = id(new AlmanacDeviceQuery())
+ $devices = id(new AlmanacDeviceQuery())
->setViewer($viewer)
- ->withNames(array($device_name))
- ->executeOne();
- if (!$device) {
- throw new PhutilArgumentUsageException(
- pht('No device "%s" exists.', $device_name));
+ ->withNames(array($target_name))
+ ->execute();
+ if (!$devices) {
+ $service = id(new AlmanacServiceQuery())
+ ->setViewer($viewer)
+ ->withNames(array($target_name))
+ ->executeOne();
+
+ if (!$service) {
+ throw new PhutilArgumentUsageException(
+ pht('No device or service named "%s" exists.', $target_name));
+ }
+
+ if ($promote) {
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'You can not "--promote" an entire service ("%s"). Only a single '.
+ 'device may be promoted.',
+ $target_name));
+ }
+
+ $bindings = id(new AlmanacBindingQuery())
+ ->setViewer($viewer)
+ ->withServicePHIDs(array($service->getPHID()))
+ ->execute();
+ if (!$bindings) {
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Service "%s" is not bound to any devices.',
+ $target_name));
+ }
+
+ $interfaces = id(new AlmanacInterfaceQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(mpull($bindings, 'getInterfacePHID'))
+ ->execute();
+
+ $device_phids = mpull($interfaces, 'getDevicePHID');
+
+ $devices = id(new AlmanacDeviceQuery())
+ ->setViewer($viewer)
+ ->withPHIDs($device_phids)
+ ->execute();
}
$repository_names = $args->getArg('repositories');
@@ -97,7 +136,7 @@
$services = id(new AlmanacServiceQuery())
->setViewer($viewer)
- ->withDevicePHIDs(array($device->getPHID()))
+ ->withDevicePHIDs(mpull($devices, 'getPHID'))
->execute();
if ($services) {
$repositories = id(new PhabricatorRepositoryQuery())
@@ -108,7 +147,7 @@
if (!$repositories) {
throw new PhutilArgumentUsageException(
- pht('There are no repositories on the selected device.'));
+ pht('There are no repositories on the selected device or service.'));
}
}
@@ -150,126 +189,128 @@
pht('User aborted the workflow.'));
}
- foreach ($repositories as $repository) {
- $repository_phid = $repository->getPHID();
+ foreach ($devices as $device) {
+ foreach ($repositories as $repository) {
+ $repository_phid = $repository->getPHID();
- $write_lock = PhabricatorRepositoryWorkingCopyVersion::getWriteLock(
- $repository_phid);
+ $write_lock = PhabricatorRepositoryWorkingCopyVersion::getWriteLock(
+ $repository_phid);
- echo tsprintf(
- "%s\n",
- pht(
- 'Waiting to acquire write lock for "%s"...',
- $repository->getDisplayName()));
-
- $write_lock->lock(phutil_units('5 minutes in seconds'));
- try {
-
- $service = $repository->loadAlmanacService();
- if (!$service) {
- throw new PhutilArgumentUsageException(
- pht(
- 'Repository "%s" is not a cluster repository: it is not '.
- 'bound to an Almanac service.',
- $repository->getDisplayName()));
- }
+ echo tsprintf(
+ "%s\n",
+ pht(
+ 'Waiting to acquire write lock for "%s"...',
+ $repository->getDisplayName()));
+
+ $write_lock->lock(phutil_units('5 minutes in seconds'));
+ try {
- if ($promote) {
- // You can only promote active devices. (You may demote active or
- // inactive devices.)
- $bindings = $service->getActiveBindings();
- $bindings = mpull($bindings, null, 'getDevicePHID');
- if (empty($bindings[$device->getPHID()])) {
+ $service = $repository->loadAlmanacService();
+ if (!$service) {
throw new PhutilArgumentUsageException(
pht(
- 'Repository "%s" has no active binding to device "%s". Only '.
- 'actively bound devices can be promoted.',
- $repository->getDisplayName(),
- $device->getName()));
+ 'Repository "%s" is not a cluster repository: it is not '.
+ 'bound to an Almanac service.',
+ $repository->getDisplayName()));
}
- $versions = PhabricatorRepositoryWorkingCopyVersion::loadVersions(
- $repository->getPHID());
- $versions = mpull($versions, null, 'getDevicePHID');
-
- // Before we promote, make sure there are no outstanding versions on
- // devices with inactive bindings. If there are, you need to demote
- // these first.
- $inactive = array();
- foreach ($versions as $device_phid => $version) {
- if (isset($bindings[$device_phid])) {
- continue;
+ if ($promote) {
+ // You can only promote active devices. (You may demote active or
+ // inactive devices.)
+ $bindings = $service->getActiveBindings();
+ $bindings = mpull($bindings, null, 'getDevicePHID');
+ if (empty($bindings[$device->getPHID()])) {
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Repository "%s" has no active binding to device "%s". '.
+ 'Only actively bound devices can be promoted.',
+ $repository->getDisplayName(),
+ $device->getName()));
}
- $inactive[$device_phid] = $version;
- }
- if ($inactive) {
- $handles = $viewer->loadHandles(array_keys($inactive));
+ $versions = PhabricatorRepositoryWorkingCopyVersion::loadVersions(
+ $repository->getPHID());
+ $versions = mpull($versions, null, 'getDevicePHID');
+
+ // Before we promote, make sure there are no outstanding versions
+ // on devices with inactive bindings. If there are, you need to
+ // demote these first.
+ $inactive = array();
+ foreach ($versions as $device_phid => $version) {
+ if (isset($bindings[$device_phid])) {
+ continue;
+ }
+ $inactive[$device_phid] = $version;
+ }
- $handle_list = iterator_to_array($handles);
- $handle_list = mpull($handle_list, 'getName');
- $handle_list = implode(', ', $handle_list);
+ if ($inactive) {
+ $handles = $viewer->loadHandles(array_keys($inactive));
- throw new PhutilArgumentUsageException(
- pht(
- 'Repository "%s" has versions on inactive devices. Demote '.
- '(or reactivate) these devices before promoting a new '.
- 'leader: %s.',
- $repository->getDisplayName(),
- $handle_list));
- }
+ $handle_list = iterator_to_array($handles);
+ $handle_list = mpull($handle_list, 'getName');
+ $handle_list = implode(', ', $handle_list);
- // Now, make sure there are no outstanding versions on devices with
- // active bindings. These also need to be demoted (or promoting is a
- // mistake or already happened).
- $active = array_select_keys($versions, array_keys($bindings));
- if ($active) {
- $handles = $viewer->loadHandles(array_keys($active));
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Repository "%s" has versions on inactive devices. Demote '.
+ '(or reactivate) these devices before promoting a new '.
+ 'leader: %s.',
+ $repository->getDisplayName(),
+ $handle_list));
+ }
- $handle_list = iterator_to_array($handles);
- $handle_list = mpull($handle_list, 'getName');
- $handle_list = implode(', ', $handle_list);
+ // Now, make sure there are no outstanding versions on devices with
+ // active bindings. These also need to be demoted (or promoting is
+ // a mistake or already happened).
+ $active = array_select_keys($versions, array_keys($bindings));
+ if ($active) {
+ $handles = $viewer->loadHandles(array_keys($active));
+
+ $handle_list = iterator_to_array($handles);
+ $handle_list = mpull($handle_list, 'getName');
+ $handle_list = implode(', ', $handle_list);
+
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Unable to promote "%s" for repository "%s" because this '.
+ 'cluster already has one or more unambiguous leaders: %s.',
+ $device->getName(),
+ $repository->getDisplayName(),
+ $handle_list));
+ }
- throw new PhutilArgumentUsageException(
+ PhabricatorRepositoryWorkingCopyVersion::updateVersion(
+ $repository->getPHID(),
+ $device->getPHID(),
+ 0);
+
+ echo tsprintf(
+ "%s\n",
pht(
- 'Unable to promote "%s" for repository "%s" because this '.
- 'cluster already has one or more unambiguous leaders: %s.',
+ 'Promoted "%s" to become a leader for "%s".',
$device->getName(),
- $repository->getDisplayName(),
- $handle_list));
+ $repository->getDisplayName()));
}
- PhabricatorRepositoryWorkingCopyVersion::updateVersion(
- $repository->getPHID(),
- $device->getPHID(),
- 0);
-
- echo tsprintf(
- "%s\n",
- pht(
- 'Promoted "%s" to become a leader for "%s".',
- $device->getName(),
- $repository->getDisplayName()));
- }
+ if ($demote) {
+ PhabricatorRepositoryWorkingCopyVersion::demoteDevice(
+ $repository->getPHID(),
+ $device->getPHID());
- if ($demote) {
- PhabricatorRepositoryWorkingCopyVersion::demoteDevice(
- $repository->getPHID(),
- $device->getPHID());
-
- echo tsprintf(
- "%s\n",
- pht(
- 'Demoted "%s" from leadership of repository "%s".',
- $device->getName(),
- $repository->getDisplayName()));
+ echo tsprintf(
+ "%s\n",
+ pht(
+ 'Demoted "%s" from leadership of repository "%s".',
+ $device->getName(),
+ $repository->getDisplayName()));
+ }
+ } catch (Exception $ex) {
+ $write_lock->unlock();
+ throw $ex;
}
- } catch (Exception $ex) {
+
$write_lock->unlock();
- throw $ex;
}
-
- $write_lock->unlock();
}
return 0;

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 7, 6:45 AM (2 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7324760
Default Alt Text
D19850.id47400.diff (12 KB)

Event Timeline