Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15308897
D19850.id47400.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Referenced Files
None
Subscribers
None
D19850.id47400.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D19850: Allow "bin/repository thaw --demote" to demote an entire service, not just a single device
Attached
Detach File
Event Timeline
Log In to Comment