Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13179502
D20601.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Referenced Files
None
Subscribers
None
D20601.diff
View Options
diff --git a/src/applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php b/src/applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php
--- a/src/applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php
+++ b/src/applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php
@@ -35,7 +35,6 @@
public function execute(PhutilArgumentParser $args) {
$err = $this->executeStopCommand(
- array(),
array(
'graceful' => $args->getArg('graceful'),
'force' => $args->getArg('force'),
diff --git a/src/applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php b/src/applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php
--- a/src/applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php
+++ b/src/applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php
@@ -42,7 +42,6 @@
public function execute(PhutilArgumentParser $args) {
return $this->executeStopCommand(
- $args->getArg('pids'),
array(
'graceful' => $args->getArg('graceful'),
'force' => $args->getArg('force'),
diff --git a/src/applications/daemon/management/PhabricatorDaemonManagementWorkflow.php b/src/applications/daemon/management/PhabricatorDaemonManagementWorkflow.php
--- a/src/applications/daemon/management/PhabricatorDaemonManagementWorkflow.php
+++ b/src/applications/daemon/management/PhabricatorDaemonManagementWorkflow.php
@@ -386,78 +386,86 @@
return 0;
}
- final protected function executeStopCommand(
- array $pids,
- array $options) {
-
- $console = PhutilConsole::getConsole();
-
+ final protected function executeStopCommand(array $options) {
$grace_period = idx($options, 'graceful', 15);
$force = idx($options, 'force');
- $gently = idx($options, 'gently');
- if ($gently && $force) {
- throw new PhutilArgumentUsageException(
- pht(
- 'You can not specify conflicting options %s and %s together.',
- '--gently',
- '--force'));
+ $query = id(new PhutilProcessQuery())
+ ->withIsOverseer(true);
+
+ $instance = PhabricatorEnv::getEnvConfig('cluster.instance');
+ if ($instance !== null && !$force) {
+ $query->withInstances(array($instance));
}
- $daemons = $this->loadRunningDaemons();
- if (!$daemons) {
- $survivors = array();
- if (!$pids && !$gently) {
- $survivors = $this->processRogueDaemons(
- $grace_period,
- $warn = true,
- $force);
- }
- if (!$survivors) {
- $console->writeErr(
- "%s\n",
- pht('There are no running Phabricator daemons.'));
- }
- return 0;
+ try {
+ $process_refs = $query->execute();
+ } catch (Exception $ex) {
+ // See T13321. If this fails for some reason, just continue for now so
+ // that daemon management still works. In the long run, we don't expect
+ // this to fail, but I don't want to break this workflow while we iron
+ // bugs out.
+
+ // See T12827. Particularly, this is likely to fail on Solaris.
+
+ phlog($ex);
+
+ $process_refs = array();
}
- $stop_pids = $this->selectDaemonPIDs($daemons, $pids);
+ if (!$process_refs) {
+ if ($instance !== null && !$force) {
+ $this->logInfo(
+ pht('NO DAEMONS'),
+ pht(
+ 'There are no running daemons for the current instance ("%s"). '.
+ 'Use "--force" to stop daemons for all instances.',
+ $instance));
+ } else {
+ $this->logInfo(
+ pht('NO DAEMONS'),
+ pht('There are no running daemons.'));
+ }
- if (!$stop_pids) {
- $console->writeErr("%s\n", pht('No daemons to kill.'));
return 0;
}
- $survivors = $this->sendStopSignals($stop_pids, $grace_period);
+ $process_refs = mpull($process_refs, null, 'getPID');
- // Try to clean up PID files for daemons we killed.
- $remove = array();
- foreach ($daemons as $daemon) {
- $pid = $daemon->getPID();
- if (empty($stop_pids[$pid])) {
- // We did not try to stop this overseer.
- continue;
- }
+ $stop_pids = array_keys($process_refs);
+ $live_pids = $this->sendStopSignals($stop_pids, $grace_period);
- if (isset($survivors[$pid])) {
- // We weren't able to stop this overseer.
- continue;
- }
+ $stop_pids = array_fuse($stop_pids);
+ $live_pids = array_fuse($live_pids);
- if (!$daemon->getPIDFile()) {
- // We don't know where the PID file is.
- continue;
- }
+ $dead_pids = array_diff_key($stop_pids, $live_pids);
- $remove[] = $daemon->getPIDFile();
+ foreach ($dead_pids as $dead_pid) {
+ $dead_ref = $process_refs[$dead_pid];
+ $this->logOkay(
+ pht('STOP'),
+ pht(
+ 'Stopped PID %d ("%s")',
+ $dead_pid,
+ $dead_ref->getCommand()));
}
- foreach (array_unique($remove) as $remove_file) {
- Filesystem::remove($remove_file);
+ foreach ($live_pids as $live_pid) {
+ $live_ref = $process_refs[$live_pid];
+ $this->logFail(
+ pht('SURVIVED'),
+ pht(
+ 'Unable to stop PID %d ("%s").',
+ $live_pid,
+ $live_ref->getCommand()));
}
- if (!$gently) {
- $this->processRogueDaemons($grace_period, !$pids, $force);
+ if ($live_pids) {
+ $this->logWarn(
+ pht('SURVIVORS'),
+ pht(
+ 'Unable to stop all daemon processes. You may need to run this '.
+ 'command as root with "sudo".'));
}
return 0;
@@ -492,42 +500,6 @@
return 0;
}
- private function processRogueDaemons($grace_period, $warn, $force_stop) {
- $console = PhutilConsole::getConsole();
-
- $rogue_daemons = PhutilDaemonOverseer::findRunningDaemons();
- if ($rogue_daemons) {
- if ($force_stop) {
- $rogue_pids = ipull($rogue_daemons, 'pid');
- $survivors = $this->sendStopSignals($rogue_pids, $grace_period);
- if ($survivors) {
- $console->writeErr(
- "%s\n",
- pht(
- 'Unable to stop processes running without PID files. '.
- 'Try running this command again with sudo.'));
- }
- } else if ($warn) {
- $console->writeErr("%s\n", $this->getForceStopHint($rogue_daemons));
- }
- }
-
- return $rogue_daemons;
- }
-
- private function getForceStopHint($rogue_daemons) {
- $debug_output = '';
- foreach ($rogue_daemons as $rogue) {
- $debug_output .= $rogue['pid'].' '.$rogue['command']."\n";
- }
- return pht(
- "There are processes running that look like Phabricator daemons but ".
- "have no corresponding PID files:\n\n%s\n\n".
- "Stop these processes by re-running this command with the %s parameter.",
- $debug_output,
- '--force');
- }
-
private function sendStopSignals($pids, $grace_period) {
// If we're doing a graceful shutdown, try SIGINT first.
if ($grace_period) {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, May 9, 9:14 PM (3 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6277703
Default Alt Text
D20601.diff (6 KB)
Attached To
Mode
D20601: Drive "phd stop" entirely from the process list, not PID files on disk
Attached
Detach File
Event Timeline
Log In to Comment