Skip to content

Commit 5903ed6

Browse files
author
epriestley
committed
Move completed tasks to an "archive" table and delete them in the GC
Summary: Currently, when taskmasters complete a task it is immediately deleted. This prevents us from doing some general things, like: - Supporting the idea of permanent failure (e.g., after N failures just stop trying). - Showing the user how fast taskmasters are completing tasks. - Showing the user how long tasks took to complete. Having better visibility into this is important to Drydock, which builds on the task system. Also, generally buff debug output for task execution. Test Plan: Ran `bin/phd debug taskmaster`. Ran `bin/phd debug garbage`. Queued some tasks via various systems. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2015 Differential Revision: https://secure.phabricator.com/D3852
1 parent 4edf8ae commit 5903ed6

24 files changed

+292
-102
lines changed

conf/default.conf.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,7 @@
11261126
'gcdaemon.ttl.daemon-logs' => 7 * (24 * 60 * 60),
11271127
'gcdaemon.ttl.differential-parse-cache' => 14 * (24 * 60 * 60),
11281128
'gcdaemon.ttl.markup-cache' => 30 * (24 * 60 * 60),
1129+
'gcdaemon.ttl.task-archive' => 14 * (24 * 60 * 60),
11291130

11301131

11311132
// -- Feed ------------------------------------------------------------------ //
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CREATE TABLE {$NAMESPACE}_worker.worker_archivetask (
2+
id INT UNSIGNED PRIMARY KEY,
3+
taskClass VARCHAR(255) NOT NULL COLLATE utf8_bin,
4+
leaseOwner VARCHAR(255) COLLATE utf8_bin,
5+
leaseExpires INT UNSIGNED,
6+
failureCount INT UNSIGNED NOT NULL,
7+
dataID INT UNSIGNED NOT NULL,
8+
result INT UNSIGNED NOT NULL,
9+
duration BIGINT UNSIGNED NOT NULL,
10+
dateCreated INT UNSIGNED NOT NULL,
11+
dateModified INT UNSIGNED NOT NULL,
12+
key(dateCreated)
13+
) ENGINE=InnoDB, COLLATE utf8_general_ci;

scripts/mail/create_worker_tasks.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@
3333

3434
foreach ($messages as $message) {
3535
if (!$message->getWorkerTaskID()) {
36-
$mailer_task = new PhabricatorWorkerTask();
37-
$mailer_task->setTaskClass('PhabricatorMetaMTAWorker');
38-
$mailer_task->setData($message->getID());
39-
$mailer_task->save();
36+
$mailer_task = PhabricatorWorker::scheduleTask(
37+
'PhabricatorMetaMTAWorker',
38+
$message->getID());
4039

4140
$message->setWorkerTaskID($mailer_task->getID());
4241
$message->save();

scripts/repository/reparse.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,7 @@
224224

225225
if ($all_from_repo && !$force_local) {
226226
foreach ($classes as $class) {
227-
$task = new PhabricatorWorkerTask();
228-
$task->setTaskClass($class);
229-
$task->setData($spec);
230-
$task->save();
227+
PhabricatorWorker::scheduleTask($class, $spec);
231228

232229
$commit_name = 'r'.$callsign.$commit->getCommitIdentifier();
233230
echo " Queued '{$class}' for commit '{$commit_name}'.\n";

src/__phutil_library_map__.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,8 @@
11401140
'PhabricatorUserStatusOverlapException' => 'applications/people/exception/PhabricatorUserStatusOverlapException.php',
11411141
'PhabricatorUserTestCase' => 'applications/people/storage/__tests__/PhabricatorUserTestCase.php',
11421142
'PhabricatorWorker' => 'infrastructure/daemon/workers/PhabricatorWorker.php',
1143+
'PhabricatorWorkerActiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerActiveTask.php',
1144+
'PhabricatorWorkerArchiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerArchiveTask.php',
11431145
'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php',
11441146
'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTask.php',
11451147
'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTaskData.php',
@@ -2300,6 +2302,8 @@
23002302
'PhabricatorUserStatusInvalidEpochException' => 'Exception',
23012303
'PhabricatorUserStatusOverlapException' => 'Exception',
23022304
'PhabricatorUserTestCase' => 'PhabricatorTestCase',
2305+
'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask',
2306+
'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask',
23032307
'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO',
23042308
'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO',
23052309
'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO',

src/applications/daemon/controller/PhabricatorDaemonConsoleController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function processRequest() {
3434
$daemon_panel->setHeader('Recently Launched Daemons');
3535
$daemon_panel->appendChild($daemon_table);
3636

37-
$tasks = id(new PhabricatorWorkerTask())->loadAllWhere(
37+
$tasks = id(new PhabricatorWorkerActiveTask())->loadAllWhere(
3838
'leaseOwner IS NOT NULL');
3939

4040
$rows = array();
@@ -80,7 +80,7 @@ public function processRequest() {
8080
$leased_panel->setHeader('Leased Tasks');
8181
$leased_panel->appendChild($leased_table);
8282

83-
$task_table = new PhabricatorWorkerTask();
83+
$task_table = new PhabricatorWorkerActiveTask();
8484
$queued = queryfx_all(
8585
$task_table->establishConnection('r'),
8686
'SELECT taskClass, count(*) N FROM %T GROUP BY taskClass

src/applications/daemon/controller/PhabricatorWorkerTaskDetailController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function processRequest() {
2929
$request = $this->getRequest();
3030
$user = $request->getUser();
3131

32-
$task = id(new PhabricatorWorkerTask())->load($this->id);
32+
$task = id(new PhabricatorWorkerActiveTask())->load($this->id);
3333
if (!$task) {
3434
$error_view = new AphrontErrorView();
3535
$error_view->setTitle('No Such Task');

src/applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function processRequest() {
3131
$request = $this->getRequest();
3232
$user = $request->getUser();
3333

34-
$task = id(new PhabricatorWorkerTask())->load($this->id);
34+
$task = id(new PhabricatorWorkerActiveTask())->load($this->id);
3535
if (!$task) {
3636
return new Aphront404Response();
3737
}

src/applications/drydock/allocator/DrydockAllocator.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,7 @@ public function allocate() {
5959
$worker = new DrydockAllocatorWorker($data);
6060
$worker->executeTask();
6161
} else {
62-
$task = new PhabricatorWorkerTask();
63-
$task->setTaskClass('DrydockAllocatorWorker');
64-
$task->setData($data);
65-
$task->save();
62+
PhabricatorWorker::scheduleTask('DrydockAllocatorWorker', $data);
6663
}
6764

6865
return $lease;

src/applications/metamta/storage/PhabricatorMetaMTAMail.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,10 @@ protected function didWriteData() {
298298
parent::didWriteData();
299299

300300
if (!$this->getWorkerTaskID()) {
301-
$mailer_task = new PhabricatorWorkerTask();
302-
$mailer_task->setTaskClass('PhabricatorMetaMTAWorker');
303-
$mailer_task->setData($this->getID());
304-
$mailer_task->save();
301+
$mailer_task = PhabricatorWorker::scheduleTask(
302+
'PhabricatorMetaMTAWorker',
303+
$this->getID());
304+
305305
$this->setWorkerTaskID($mailer_task->getID());
306306
$this->save();
307307
}

0 commit comments

Comments
 (0)