1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 17:28:51 +02:00

Give "bin/worker" flags to repeat and retry tasks

Summary:
See PHI1063. See PHI1114. Ref T13253. Currently, you can't `bin/worker execute` an archived task and can't `bin/worker retry` a successful task.

Although it's good not to do these things by default (particularly, retrying a successful task will double its effects), there are plenty of cases where you want to re-run something for testing/development/debugging and don't care that the effect will repeat (you're in a dev environment, the effect doesn't matter, etc).

Test Plan: Ran `bin/worker execute/retry` against archived/successful tasks. Got prompted to add more flags, then got re-execution.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13253

Differential Revision: https://secure.phabricator.com/D20246
This commit is contained in:
epriestley 2019-03-04 16:48:01 -08:00
parent e15fff00a6
commit 9b0b50fbf4
2 changed files with 67 additions and 14 deletions

View file

@ -11,25 +11,66 @@ final class PhabricatorWorkerManagementExecuteWorkflow
pht(
'Execute a task explicitly. This command ignores leases, is '.
'dangerous, and may cause work to be performed twice.'))
->setArguments($this->getTaskSelectionArguments());
->setArguments(
array_merge(
array(
array(
'name' => 'retry',
'help' => pht('Retry archived tasks.'),
),
array(
'name' => 'repeat',
'help' => pht('Repeat archived, successful tasks.'),
),
),
$this->getTaskSelectionArguments()));
}
public function execute(PhutilArgumentParser $args) {
$console = PhutilConsole::getConsole();
$tasks = $this->loadTasks($args);
$is_retry = $args->getArg('retry');
$is_repeat = $args->getArg('repeat');
foreach ($tasks as $task) {
$can_execute = !$task->isArchived();
if (!$can_execute) {
if (!$is_retry) {
$console->writeOut(
"**<bg:yellow> %s </bg>** %s\n",
pht('ARCHIVED'),
pht(
'%s is already archived, and can not be executed.',
'%s is already archived, and will not be executed. '.
'Use "--retry" to execute archived tasks.',
$this->describeTask($task)));
continue;
}
$result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
if ($task->getResult() == $result_success) {
if (!$is_repeat) {
$console->writeOut(
"**<bg:yellow> %s </bg>** %s\n",
pht('SUCCEEDED'),
pht(
'%s has already succeeded, and will not be retried. '.
'Use "--repeat" to repeat successful tasks.',
$this->describeTask($task)));
continue;
}
}
echo tsprintf(
"**<bg:yellow> %s </bg>** %s\n",
pht('ARCHIVED'),
pht(
'Unarchiving %s.',
$this->describeTask($task)));
$task = $task->unarchiveTask();
}
// NOTE: This ignores leases, maybe it should respect them without
// a parameter like --force?

View file

@ -10,15 +10,24 @@ final class PhabricatorWorkerManagementRetryWorkflow
->setSynopsis(
pht(
'Retry selected tasks which previously failed permanently or '.
'were cancelled. Only archived, unsuccessful tasks can be '.
'retried.'))
->setArguments($this->getTaskSelectionArguments());
'were cancelled. Only archived tasks can be retried.'))
->setArguments(
array_merge(
array(
array(
'name' => 'repeat',
'help' => pht(
'Repeat tasks which already completed successfully.'),
),
),
$this->getTaskSelectionArguments()));
}
public function execute(PhutilArgumentParser $args) {
$console = PhutilConsole::getConsole();
$tasks = $this->loadTasks($args);
$is_repeat = $args->getArg('repeat');
foreach ($tasks as $task) {
if (!$task->isArchived()) {
$console->writeOut(
@ -32,14 +41,17 @@ final class PhabricatorWorkerManagementRetryWorkflow
$result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
if ($task->getResult() == $result_success) {
if (!$is_repeat) {
$console->writeOut(
"**<bg:yellow> %s </bg>** %s\n",
pht('SUCCEEDED'),
pht(
'%s has already succeeded, and can not be retried.',
'%s has already succeeded, and will not be repeated. '.
'Use "--repeat" to repeat successful tasks.',
$this->describeTask($task)));
continue;
}
}
$task->unarchiveTask();