mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-28 01:32:42 +01:00
When bin/drydock lease
is interrupted, release leases
Summary: Depends on D19072. Ref T13073. Currently, you can leave leases stranded by using `^C` to interrupt the script. Handle signals and release leases on destruction if they haven't activated yet. Also, print out more useful information before and after activation. Test Plan: Mashed ^C while runnning `bin/drydock lease ... --trace`, saw the lease release. Subscribers: yelirekim, PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13073 Differential Revision: https://secure.phabricator.com/D19073
This commit is contained in:
parent
b833e324bd
commit
07028cfc30
6 changed files with 54 additions and 8 deletions
|
@ -2,7 +2,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
$root = dirname(dirname(dirname(__FILE__)));
|
$root = dirname(dirname(dirname(__FILE__)));
|
||||||
require_once $root.'/scripts/__init_script__.php';
|
require_once $root.'/scripts/init/init-script-with-signals.php';
|
||||||
|
|
||||||
$args = new PhutilArgumentParser($argv);
|
$args = new PhutilArgumentParser($argv);
|
||||||
$args->setTagline(pht('manage drydock software resources'));
|
$args->setTagline(pht('manage drydock software resources'));
|
||||||
|
|
11
scripts/init/init-script-with-signals.php
Normal file
11
scripts/init/init-script-with-signals.php
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Initialize a script that will handle signals.
|
||||||
|
|
||||||
|
if (function_exists('pcntl_async_signals')) {
|
||||||
|
pcntl_async_signals(true);
|
||||||
|
} else {
|
||||||
|
declare(ticks = 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once dirname(__FILE__).'/init-script.php';
|
|
@ -206,7 +206,7 @@ final class DrydockWorkingCopyBlueprintImplementation
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroy the lease on the host.
|
// Destroy the lease on the host.
|
||||||
$lease->releaseOnDestruction();
|
$lease->setReleaseOnDestruction(true);
|
||||||
|
|
||||||
if ($lease->isActive()) {
|
if ($lease->isActive()) {
|
||||||
// Destroy the working copy on disk.
|
// Destroy the working copy on disk.
|
||||||
|
|
|
@ -84,21 +84,51 @@ final class DrydockManagementLeaseWorkflow
|
||||||
$lease->setUntil($until);
|
$lease->setUntil($until);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If something fatals or the user interrupts the process (for example,
|
||||||
|
// with "^C"), release the lease. We'll cancel this below, if the lease
|
||||||
|
// actually activates.
|
||||||
|
$lease->setReleaseOnDestruction(true);
|
||||||
|
|
||||||
|
// TODO: This would probably be better handled with PhutilSignalRouter,
|
||||||
|
// but it currently doesn't route SIGINT. We're initializing it to setup
|
||||||
|
// SIGTERM handling and make eventual migration easier.
|
||||||
|
$router = PhutilSignalRouter::getRouter();
|
||||||
|
pcntl_signal(SIGINT, array($this, 'didReceiveInterrupt'));
|
||||||
|
|
||||||
|
$t_start = microtime(true);
|
||||||
$lease->queueForActivation();
|
$lease->queueForActivation();
|
||||||
|
|
||||||
echo tsprintf(
|
echo tsprintf(
|
||||||
"%s\n",
|
"%s\n\n __%s__\n\n%s\n",
|
||||||
|
pht('Queued lease for activation:'),
|
||||||
|
PhabricatorEnv::getProductionURI($lease->getURI()),
|
||||||
pht('Waiting for daemons to activate lease...'));
|
pht('Waiting for daemons to activate lease...'));
|
||||||
|
|
||||||
$this->waitUntilActive($lease);
|
$this->waitUntilActive($lease);
|
||||||
|
|
||||||
|
// Now that we've survived activation and the lease is good, make it
|
||||||
|
// durable.
|
||||||
|
$lease->setReleaseOnDestruction(false);
|
||||||
|
$t_end = microtime(true);
|
||||||
|
|
||||||
echo tsprintf(
|
echo tsprintf(
|
||||||
"%s\n",
|
"%s\n\n %s\n\n%s\n",
|
||||||
pht('Activated lease "%s".', $lease->getID()));
|
pht(
|
||||||
|
'Activation complete. This lease is permanent until manually '.
|
||||||
|
'released with:'),
|
||||||
|
pht('$ ./bin/drydock release-lease --id %d', $lease->getID()),
|
||||||
|
pht(
|
||||||
|
'Lease activated in %sms.',
|
||||||
|
new PhutilNumber((int)(($t_end - $t_start) * 1000))));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function didReceiveInterrupt($signo) {
|
||||||
|
// Doing this makes us run destructors, particularly the "release on
|
||||||
|
// destruction" trigger on the lease.
|
||||||
|
exit(128 + $signo);
|
||||||
|
}
|
||||||
|
|
||||||
private function waitUntilActive(DrydockLease $lease) {
|
private function waitUntilActive(DrydockLease $lease) {
|
||||||
$viewer = $this->getViewer();
|
$viewer = $this->getViewer();
|
||||||
|
|
|
@ -36,8 +36,8 @@ final class DrydockLease extends DrydockDAO
|
||||||
* a lease, as you don't need to explicitly handle exceptions to properly
|
* a lease, as you don't need to explicitly handle exceptions to properly
|
||||||
* release the lease.
|
* release the lease.
|
||||||
*/
|
*/
|
||||||
public function releaseOnDestruction() {
|
public function setReleaseOnDestruction($release) {
|
||||||
$this->releaseOnDestruction = true;
|
$this->releaseOnDestruction = $release;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,6 +436,11 @@ final class DrydockLease extends DrydockDAO
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getURI() {
|
||||||
|
$id = $this->getID();
|
||||||
|
return "/drydock/lease/{$id}/";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ final class DrydockRepositoryOperationUpdateWorker
|
||||||
DrydockCommandInterface::INTERFACE_TYPE);
|
DrydockCommandInterface::INTERFACE_TYPE);
|
||||||
|
|
||||||
// No matter what happens here, destroy the lease away once we're done.
|
// No matter what happens here, destroy the lease away once we're done.
|
||||||
$lease->releaseOnDestruction(true);
|
$lease->setReleaseOnDestruction(true);
|
||||||
|
|
||||||
$operation->applyOperation($interface);
|
$operation->applyOperation($interface);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue