Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15416611
D10939.id26274.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
17 KB
Referenced Files
None
Subscribers
None
D10939.id26274.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2518,13 +2518,15 @@
'PhabricatorWorkerArchiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerArchiveTask.php',
'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php',
'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php',
+ 'PhabricatorWorkerManagementCancelWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php',
'PhabricatorWorkerManagementFloodWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFloodWorkflow.php',
+ 'PhabricatorWorkerManagementFreeWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php',
+ 'PhabricatorWorkerManagementRetryWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php',
'PhabricatorWorkerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php',
'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.php',
'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTask.php',
'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTaskData.php',
'PhabricatorWorkerTaskDetailController' => 'applications/daemon/controller/PhabricatorWorkerTaskDetailController.php',
- 'PhabricatorWorkerTaskUpdateController' => 'applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php',
'PhabricatorWorkerTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerTestCase.php',
'PhabricatorWorkerYieldException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerYieldException.php',
'PhabricatorWorkingCopyDiscoveryTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyDiscoveryTestCase.php',
@@ -5702,13 +5704,15 @@
'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask',
'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO',
'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery',
+ 'PhabricatorWorkerManagementCancelWorkflow' => 'PhabricatorWorkerManagementWorkflow',
'PhabricatorWorkerManagementFloodWorkflow' => 'PhabricatorWorkerManagementWorkflow',
+ 'PhabricatorWorkerManagementFreeWorkflow' => 'PhabricatorWorkerManagementWorkflow',
+ 'PhabricatorWorkerManagementRetryWorkflow' => 'PhabricatorWorkerManagementWorkflow',
'PhabricatorWorkerManagementWorkflow' => 'PhabricatorManagementWorkflow',
'PhabricatorWorkerPermanentFailureException' => 'Exception',
'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO',
'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO',
'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController',
- 'PhabricatorWorkerTaskUpdateController' => 'PhabricatorDaemonController',
'PhabricatorWorkerTestCase' => 'PhabricatorTestCase',
'PhabricatorWorkerYieldException' => 'Exception',
'PhabricatorWorkingCopyDiscoveryTestCase' => 'PhabricatorWorkingCopyTestCase',
diff --git a/src/applications/daemon/application/PhabricatorDaemonsApplication.php b/src/applications/daemon/application/PhabricatorDaemonsApplication.php
--- a/src/applications/daemon/application/PhabricatorDaemonsApplication.php
+++ b/src/applications/daemon/application/PhabricatorDaemonsApplication.php
@@ -41,8 +41,6 @@
'/daemon/' => array(
'' => 'PhabricatorDaemonConsoleController',
'task/(?P<id>[1-9]\d*)/' => 'PhabricatorWorkerTaskDetailController',
- 'task/(?P<id>[1-9]\d*)/(?P<action>[^/]+)/'
- => 'PhabricatorWorkerTaskUpdateController',
'log/' => array(
'' => 'PhabricatorDaemonLogListController',
'(?P<id>[1-9]\d*)/' => 'PhabricatorDaemonLogViewController',
diff --git a/src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php b/src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php
--- a/src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php
+++ b/src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php
@@ -38,8 +38,7 @@
$task->getID(),
$task->getTaskClass()));
- $actions = $this->buildActionListView($task);
- $properties = $this->buildPropertyListView($task, $actions);
+ $properties = $this->buildPropertyListView($task);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
@@ -74,57 +73,12 @@
));
}
- private function buildActionListView(PhabricatorWorkerTask $task) {
- $request = $this->getRequest();
- $user = $request->getUser();
- $id = $task->getID();
-
- $view = id(new PhabricatorActionListView())
- ->setUser($user)
- ->setObjectURI($request->getRequestURI());
-
- if ($task->isArchived()) {
- $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
- $can_retry = ($task->getResult() != $result_success);
-
- $view->addAction(
- id(new PhabricatorActionView())
- ->setName(pht('Retry Task'))
- ->setHref($this->getApplicationURI('/task/'.$id.'/retry/'))
- ->setIcon('fa-refresh')
- ->setWorkflow(true)
- ->setDisabled(!$can_retry));
- } else {
- $view->addAction(
- id(new PhabricatorActionView())
- ->setName(pht('Cancel Task'))
- ->setHref($this->getApplicationURI('/task/'.$id.'/cancel/'))
- ->setIcon('fa-times')
- ->setWorkflow(true));
- }
-
- $can_release = (!$task->isArchived()) &&
- ($task->getLeaseOwner());
-
- $view->addAction(
- id(new PhabricatorActionView())
- ->setName(pht('Free Lease'))
- ->setHref($this->getApplicationURI('/task/'.$id.'/release/'))
- ->setIcon('fa-unlock')
- ->setWorkflow(true)
- ->setDisabled(!$can_release));
-
- return $view;
- }
-
private function buildPropertyListView(
- PhabricatorWorkerTask $task,
- PhabricatorActionListView $actions) {
+ PhabricatorWorkerTask $task) {
$viewer = $this->getRequest()->getUser();
$view = new PHUIPropertyListView();
- $view->setActionList($actions);
if ($task->isArchived()) {
switch ($task->getResult()) {
diff --git a/src/applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php b/src/applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php
deleted file mode 100644
--- a/src/applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-final class PhabricatorWorkerTaskUpdateController
- extends PhabricatorDaemonController {
-
- private $id;
- private $action;
-
- public function willProcessRequest(array $data) {
- $this->id = $data['id'];
- $this->action = $data['action'];
- }
-
- public function processRequest() {
- $request = $this->getRequest();
- $user = $request->getUser();
-
- $task = id(new PhabricatorWorkerActiveTask())->load($this->id);
- if (!$task) {
- $task = id(new PhabricatorWorkerArchiveTask())->load($this->id);
- }
-
- if (!$task) {
- return new Aphront404Response();
- }
-
- $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
- $can_retry = ($task->isArchived()) &&
- ($task->getResult() != $result_success);
-
- $can_cancel = !$task->isArchived();
- $can_release = (!$task->isArchived()) &&
- ($task->getLeaseOwner());
-
- $next_uri = $this->getApplicationURI('/task/'.$task->getID().'/');
-
- if ($request->isFormPost()) {
- switch ($this->action) {
- case 'retry':
- if ($can_retry) {
- $task->unarchiveTask();
- }
- break;
- case 'cancel':
- if ($can_cancel) {
- // Forcibly break the lease if one exists, so we can archive the
- // task.
- $task->setLeaseOwner(null);
- $task->setLeaseExpires(time());
-
- $task->archiveTask(
- PhabricatorWorkerArchiveTask::RESULT_CANCELLED,
- 0);
- }
- break;
- case 'release':
- if ($can_release) {
- $task->setLeaseOwner(null);
- $task->setLeaseExpires(time());
- $task->save();
- }
- break;
- }
- return id(new AphrontRedirectResponse())
- ->setURI($next_uri);
- }
-
- $dialog = new AphrontDialogView();
- $dialog->setUser($user);
-
- switch ($this->action) {
- case 'retry':
- if ($can_retry) {
- $dialog->setTitle(pht('Really retry task?'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'The task will be put back in the queue and executed again.')));
- $dialog->addSubmitButton('Retry Task');
- } else {
- $dialog->setTitle(pht('Can Not Retry'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'Only archived, unsuccessful tasks can be retried.')));
- }
- break;
- case 'cancel':
- if ($can_cancel) {
- $dialog->setTitle(pht('Really cancel task?'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'The work this task represents will never be performed if you '.
- 'cancel it. Are you sure you want to cancel it?')));
- $dialog->addSubmitButton(pht('Cancel Task'));
- } else {
- $dialog->setTitle(pht('Cannot Cancel'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'Only active tasks can be cancelled.')));
- }
- break;
- case 'release':
- if ($can_release) {
- $dialog->setTitle(pht('Really free task lease?'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'If the process which owns the task lease is still doing work '.
- 'on it, the work may be performed twice. Are you sure you '.
- 'want to free the lease?')));
- $dialog->addSubmitButton(pht('Free Lease'));
- } else {
- $dialog->setTitle(pht('Cannot Free Lease'));
- $dialog->appendChild(phutil_tag('p', array(), pht(
- 'Only active, leased tasks may have their leases freed.')));
- }
- break;
- default:
- return new Aphront404Response();
- }
-
- $dialog->addCancelButton($next_uri);
-
- return id(new AphrontDialogResponse())->setDialog($dialog);
- }
-
-}
diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php
@@ -0,0 +1,52 @@
+<?php
+
+final class PhabricatorWorkerManagementCancelWorkflow
+ extends PhabricatorWorkerManagementWorkflow {
+
+ public function didConstruct() {
+ $this
+ ->setName('cancel')
+ ->setExamples('**cancel** --id __id__')
+ ->setSynopsis(
+ pht(
+ 'Cancel selected tasks. The work these tasks represent will never '.
+ 'be performed.'))
+ ->setArguments($this->getTaskSelectionArguments());
+ }
+
+ public function execute(PhutilArgumentParser $args) {
+ $console = PhutilConsole::getConsole();
+ $tasks = $this->loadTasks($args);
+
+ foreach ($tasks as $task) {
+ $can_cancel = !$task->isArchived();
+ if (!$can_cancel) {
+ $console->writeOut(
+ "**<bg:yellow> %s </bg>** %s\n",
+ pht('ARCHIVED'),
+ pht(
+ '%s is already archived, and can not be cancelled.',
+ $this->describeTask($task)));
+ continue;
+ }
+
+ // Forcibly break the lease if one exists, so we can archive the
+ // task.
+ $task->setLeaseOwner(null);
+ $task->setLeaseExpires(PhabricatorTime::getNow());
+ $task->archiveTask(
+ PhabricatorWorkerArchiveTask::RESULT_CANCELLED,
+ 0);
+
+ $console->writeOut(
+ "**<bg:green> %s </bg>** %s\n",
+ pht('CANCELLED'),
+ pht(
+ '%s was cancelled.',
+ $this->describeTask($task)));
+ }
+
+ return 0;
+ }
+
+}
diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php
@@ -0,0 +1,58 @@
+<?php
+
+final class PhabricatorWorkerManagementFreeWorkflow
+ extends PhabricatorWorkerManagementWorkflow {
+
+ public function didConstruct() {
+ $this
+ ->setName('free')
+ ->setExamples('**free** --id __id__')
+ ->setSynopsis(
+ pht(
+ 'Free leases on selected tasks. If the daemon holding the lease is '.
+ 'still working on the task, this may cause the task to execute '.
+ 'twice.'))
+ ->setArguments($this->getTaskSelectionArguments());
+ }
+
+ public function execute(PhutilArgumentParser $args) {
+ $console = PhutilConsole::getConsole();
+ $tasks = $this->loadTasks($args);
+
+ foreach ($tasks as $task) {
+ if ($task->isArchived()) {
+ $console->writeOut(
+ "**<bg:yellow> %s </bg>** %s\n",
+ pht('ARCHIVED'),
+ pht(
+ '%s is archived; archived tasks do not have leases.',
+ $this->describeTask($task)));
+ continue;
+ }
+
+ if ($task->getLeaseOwner() === null) {
+ $console->writeOut(
+ "**<bg:yellow> %s </bg>** %s\n",
+ pht('FREE'),
+ pht(
+ '%s has no active lease.',
+ $this->describeTask($task)));
+ continue;
+ }
+
+ $task->setLeaseOwner(null);
+ $task->setLeaseExpires(PhabricatorTime::getNow());
+ $task->save();
+
+ $console->writeOut(
+ "**<bg:green> %s </bg>** %s\n",
+ pht('LEASE FREED'),
+ pht(
+ '%s was freed from its lease.',
+ $this->describeTask($task)));
+ }
+
+ return 0;
+ }
+
+}
diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php
new file mode 100644
--- /dev/null
+++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php
@@ -0,0 +1,57 @@
+<?php
+
+final class PhabricatorWorkerManagementRetryWorkflow
+ extends PhabricatorWorkerManagementWorkflow {
+
+ public function didConstruct() {
+ $this
+ ->setName('retry')
+ ->setExamples('**retry** --id __id__')
+ ->setSynopsis(
+ pht(
+ 'Retry selected tasks which previously failed permanently or '.
+ 'were cancelled. Only archived, unsuccessful tasks can be '.
+ 'retried.'))
+ ->setArguments($this->getTaskSelectionArguments());
+ }
+
+ public function execute(PhutilArgumentParser $args) {
+ $console = PhutilConsole::getConsole();
+ $tasks = $this->loadTasks($args);
+
+ foreach ($tasks as $task) {
+ if (!$task->isArchived()) {
+ $console->writeOut(
+ "**<bg:yellow> %s </bg>** %s\n",
+ pht('ACTIVE'),
+ pht(
+ '%s is already in the active task queue.',
+ $this->describeTask($task)));
+ continue;
+ }
+
+ $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS;
+ if ($task->getResult() == $result_success) {
+ $console->writeOut(
+ "**<bg:yellow> %s </bg>** %s\n",
+ pht('SUCCEEDED'),
+ pht(
+ '%s has already succeeded, and can not be retried.',
+ $this->describeTask($task)));
+ continue;
+ }
+
+ $task->unarchiveTask();
+
+ $console->writeOut(
+ "**<bg:green> %s </bg>** %s\n",
+ pht('QUEUED'),
+ pht(
+ '%s was queued for retry.',
+ $this->describeTask($task)));
+ }
+
+ return 0;
+ }
+
+}
diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php
--- a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php
+++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php
@@ -1,4 +1,49 @@
<?php
abstract class PhabricatorWorkerManagementWorkflow
- extends PhabricatorManagementWorkflow {}
+ extends PhabricatorManagementWorkflow {
+
+ protected function getTaskSelectionArguments() {
+ return array(
+ array(
+ 'name' => 'id',
+ 'param' => 'id',
+ 'repeat' => true,
+ 'help' => pht('Select one or more tasks by ID.'),
+ ),
+ );
+ }
+
+ protected function loadTasks(PhutilArgumentParser $args) {
+ $ids = $args->getArg('id');
+ if (!$ids) {
+ throw new PhutilArgumentUsageException(
+ pht('Use --id to select tasks by ID.'));
+ }
+
+ $active_tasks = id(new PhabricatorWorkerActiveTask())->loadAllWhere(
+ 'id IN (%Ls)',
+ $ids);
+ $archive_tasks = id(new PhabricatorWorkerArchiveTask())->loadAllWhere(
+ 'id IN (%Ls)',
+ $ids);
+
+ $tasks =
+ mpull($active_tasks, null, 'getID') +
+ mpull($archive_tasks, null, 'getID');
+
+ foreach ($ids as $id) {
+ if (empty($tasks[$id])) {
+ throw new PhutilArgumentUsageException(
+ pht('No task exists with id "%s"!', $id));
+ }
+ }
+
+ return $tasks;
+ }
+
+ protected function describeTask(PhabricatorWorkerTask $task) {
+ return pht('Task %d (%s)', $task->getID(), $task->getTaskClass());
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 21, 12:25 PM (1 w, 4 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7685091
Default Alt Text
D10939.id26274.diff (17 KB)
Attached To
Mode
D10939: Move cancel/retry/free task queue actions to bin/worker
Attached
Detach File
Event Timeline
Log In to Comment