@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add "bin/worker delay" and "bin/worker priority" utilities for managing task queues

Summary: Ref T13591. Support delaying selected tasks until a later time and bulk-adjustment of task priority.

Test Plan: Ran `bin/worker delay` and `bin/worker priority` to delay and reprioritize tasks. Confirmed outcomes with daemon console.

Maniphest Tasks: T13591

Differential Revision: https://secure.phabricator.com/D21535

+233
+4
src/__phutil_library_map__.php
··· 5145 5145 'PhabricatorWorkerDestructionEngineExtension' => 'infrastructure/daemon/workers/engineextension/PhabricatorWorkerDestructionEngineExtension.php', 5146 5146 'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php', 5147 5147 'PhabricatorWorkerManagementCancelWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php', 5148 + 'PhabricatorWorkerManagementDelayWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementDelayWorkflow.php', 5148 5149 'PhabricatorWorkerManagementExecuteWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php', 5149 5150 'PhabricatorWorkerManagementFloodWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFloodWorkflow.php', 5150 5151 'PhabricatorWorkerManagementFreeWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php', 5152 + 'PhabricatorWorkerManagementPriorityWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementPriorityWorkflow.php', 5151 5153 'PhabricatorWorkerManagementRetryWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php', 5152 5154 'PhabricatorWorkerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php', 5153 5155 'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.php', ··· 11973 11975 'PhabricatorWorkerDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 11974 11976 'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery', 11975 11977 'PhabricatorWorkerManagementCancelWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11978 + 'PhabricatorWorkerManagementDelayWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11976 11979 'PhabricatorWorkerManagementExecuteWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11977 11980 'PhabricatorWorkerManagementFloodWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11978 11981 'PhabricatorWorkerManagementFreeWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11982 + 'PhabricatorWorkerManagementPriorityWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11979 11983 'PhabricatorWorkerManagementRetryWorkflow' => 'PhabricatorWorkerManagementWorkflow', 11980 11984 'PhabricatorWorkerManagementWorkflow' => 'PhabricatorManagementWorkflow', 11981 11985 'PhabricatorWorkerPermanentFailureException' => 'Exception',
+97
src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementDelayWorkflow.php
··· 1 + <?php 2 + 3 + final class PhabricatorWorkerManagementDelayWorkflow 4 + extends PhabricatorWorkerManagementWorkflow { 5 + 6 + protected function didConstruct() { 7 + $this 8 + ->setName('delay') 9 + ->setExamples( 10 + implode( 11 + "\n", 12 + array( 13 + '**delay** __selectors__ --until __date__', 14 + '**delay** __selectors__ --until __YYYY-MM-DD__', 15 + '**delay** __selectors__ --until "6 hours"', 16 + '**delay** __selectors__ --until now', 17 + ))) 18 + ->setSynopsis( 19 + pht( 20 + 'Delay execution of selected tasks until the specified time.')) 21 + ->setArguments( 22 + array_merge( 23 + array( 24 + array( 25 + 'name' => 'until', 26 + 'param' => 'date', 27 + 'help' => pht( 28 + 'Select the date or time to delay the selected tasks until.'), 29 + ), 30 + ), 31 + $this->getTaskSelectionArguments())); 32 + } 33 + 34 + public function execute(PhutilArgumentParser $args) { 35 + $viewer = $this->getViewer(); 36 + 37 + $until = $args->getArg('until'); 38 + $until = $this->parseTimeArgument($until); 39 + 40 + if ($until === null) { 41 + throw new PhutilArgumentUsageException( 42 + pht( 43 + 'Specify how long to delay tasks for with "--until".')); 44 + } 45 + 46 + $tasks = $this->loadTasks($args); 47 + 48 + if (!$tasks) { 49 + $this->logWarn( 50 + pht('NO TASKS'), 51 + pht('No tasks selected to delay.')); 52 + 53 + return 0; 54 + } 55 + 56 + $delay_count = 0; 57 + foreach ($tasks as $task) { 58 + if ($task->isArchived()) { 59 + $this->logWarn( 60 + pht('ARCHIVED'), 61 + pht( 62 + '%s is already archived, and can not be delayed.', 63 + $this->describeTask($task))); 64 + continue; 65 + } 66 + 67 + if ($task->getLeaseOwner()) { 68 + $this->logWarn( 69 + pht('LEASED'), 70 + pht( 71 + '% is already leased, and can not be delayed.', 72 + $this->describeTask($task))); 73 + continue; 74 + } 75 + 76 + $task 77 + ->setLeaseExpires($until) 78 + ->save(); 79 + 80 + $this->logInfo( 81 + pht('DELAY'), 82 + pht( 83 + '%s was delayed until "%s".', 84 + $this->describeTask($task), 85 + phabricator_datetime($until, $viewer))); 86 + 87 + $delay_count++; 88 + } 89 + 90 + $this->logOkay( 91 + pht('DONE'), 92 + pht('Delayed %s task(s).', new PhutilNumber($delay_count))); 93 + 94 + return 0; 95 + } 96 + 97 + }
+102
src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementPriorityWorkflow.php
··· 1 + <?php 2 + 3 + final class PhabricatorWorkerManagementPriorityWorkflow 4 + extends PhabricatorWorkerManagementWorkflow { 5 + 6 + protected function didConstruct() { 7 + $this 8 + ->setName('priority') 9 + ->setExamples('**priority** __selectors__ --priority __value__') 10 + ->setSynopsis( 11 + pht( 12 + 'Change the priority of selected tasks, causing them to execute '. 13 + 'before or after other tasks.')) 14 + ->setArguments( 15 + array_merge( 16 + array( 17 + array( 18 + 'name' => 'priority', 19 + 'param' => 'int', 20 + 'help' => pht( 21 + 'Set tasks to this priority. Tasks with a smaller priority '. 22 + 'value execute before tasks with a larger priority value.'), 23 + ), 24 + ), 25 + $this->getTaskSelectionArguments())); 26 + } 27 + 28 + public function execute(PhutilArgumentParser $args) { 29 + $new_priority = $args->getArg('priority'); 30 + 31 + if ($new_priority === null) { 32 + throw new PhutilArgumentUsageException( 33 + pht( 34 + 'Select a new priority for selected tasks with "--priority".')); 35 + } 36 + 37 + $new_priority = (int)$new_priority; 38 + if ($new_priority <= 0) { 39 + throw new PhutilArgumentUsageException( 40 + pht( 41 + 'Priority must be a positive integer.')); 42 + } 43 + 44 + $tasks = $this->loadTasks($args); 45 + 46 + if (!$tasks) { 47 + $this->logWarn( 48 + pht('NO TASKS'), 49 + pht('No tasks selected to reprioritize.')); 50 + 51 + return 0; 52 + } 53 + 54 + $priority_count = 0; 55 + foreach ($tasks as $task) { 56 + $can_reprioritize = !$task->isArchived(); 57 + if (!$can_reprioritize) { 58 + $this->logWarn( 59 + pht('ARCHIVED'), 60 + pht( 61 + '%s is already archived, and can not be reprioritized.', 62 + $this->describeTask($task))); 63 + continue; 64 + } 65 + 66 + 67 + $old_priority = (int)$task->getPriority(); 68 + 69 + if ($old_priority === $new_priority) { 70 + $this->logWarn( 71 + pht('UNCHANGED'), 72 + pht( 73 + '%s already has priority "%s".', 74 + $this->describeTask($task), 75 + $new_priority)); 76 + continue; 77 + } 78 + 79 + 80 + $task 81 + ->setPriority($new_priority) 82 + ->save(); 83 + 84 + $this->logInfo( 85 + pht('PRIORITY'), 86 + pht( 87 + '%s was reprioritized (from "%d" to "%d").', 88 + $this->describeTask($task), 89 + $old_priority, 90 + $new_priority)); 91 + 92 + $priority_count++; 93 + } 94 + 95 + $this->logOkay( 96 + pht('DONE'), 97 + pht('Reprioritized %s task(s).', new PhutilNumber($priority_count))); 98 + 99 + return 0; 100 + } 101 + 102 + }
+30
src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php
··· 1759 1759 'These inline comments will be saved and published.', 1760 1760 ), 1761 1761 1762 + 'Delayed %s task(s).' => array( 1763 + 'Delayed 1 task.', 1764 + 'Delayed %s tasks.', 1765 + ), 1766 + 1767 + 'Freed %s task lease(s).' => array( 1768 + 'Freed 1 task lease.', 1769 + 'Freed %s task leases.', 1770 + ), 1771 + 1772 + 'Cancelled %s task(s).' => array( 1773 + 'Cancelled 1 task.', 1774 + 'Cancelled %s tasks.', 1775 + ), 1776 + 1777 + 'Queued %s task(s) for retry.' => array( 1778 + 'Queued 1 task for retry.', 1779 + 'Queued %s tasks for retry.', 1780 + ), 1781 + 1782 + 'Reprioritized %s task(s).' => array( 1783 + 'Reprioritized one task.', 1784 + 'Reprioritized %s tasks.', 1785 + ), 1786 + 1787 + 'Executed %s task(s).' => array( 1788 + 'Executed 1 task.', 1789 + 'Executed %s tasks.', 1790 + ), 1791 + 1762 1792 ); 1763 1793 } 1764 1794