From f6122547d77444a027119c3c2b7f2602a5acde53 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 24 Oct 2018 09:26:24 -0700 Subject: [PATCH] When a lease triggers a resource allocation for a resource which must activate, awaken the lease task after the resource activates Summary: Depends on D19753. Ref T13210. This is a small optimization that saves us from waiting up to 15 seconds for a yield. When there are no Working Copy resources and a new lease comes in, we'll allocate one and yield until it activates. If activating it (SSH'ing and running `git clone`) takes less than 15 seconds, the resource will activate (say, at T+4) but the lease won't update again for a while (say, until T+15). This leaves us with a pointless wait (in this example, we're sitting around for 9 seconds when we could move forward). To improve this a little bit, let resources wake up the lease update tasks that triggered allocation after they activate. In the best case, that task runs ~15 seconds sooner. In the worst case, the awaken is just a no-op. With a more-full queue, this has a smaller effect (it's likely something else will run and be able to use the resource in those 9 seconds). With already-activated resources, this has no effect (when resources are already activated, we can lease immediately). Test Plan: - Cleaned up all working copy resources. - Requested a new "A" working copy. - Before patch: got a working copy after 17-18 seconds, most of which was spent yielded. - After patch: got a working copy after 3-4 seconds. Reviewers: amckinley Reviewed By: amckinley Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13210 Differential Revision: https://secure.phabricator.com/D19754 --- .../drydock/worker/DrydockLeaseUpdateWorker.php | 7 +++++++ .../drydock/worker/DrydockResourceUpdateWorker.php | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php b/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php index 5506e3cb9f..3ff9900239 100644 --- a/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php +++ b/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php @@ -599,6 +599,13 @@ final class DrydockLeaseUpdateWorker extends DrydockWorker { 'DrydockResourceUpdateWorker', array( 'resourcePHID' => $resource->getPHID(), + + // This task will generally yield while the resource activates, so + // wake it back up once the resource comes online. Most of the time, + // we'll be able to lease the newly activated resource. + 'awakenOnActivation' => array( + $this->getCurrentWorkerTaskID(), + ), ), array( 'objectPHID' => $resource->getPHID(), diff --git a/src/applications/drydock/worker/DrydockResourceUpdateWorker.php b/src/applications/drydock/worker/DrydockResourceUpdateWorker.php index 817fbaddee..14ef8e4936 100644 --- a/src/applications/drydock/worker/DrydockResourceUpdateWorker.php +++ b/src/applications/drydock/worker/DrydockResourceUpdateWorker.php @@ -170,6 +170,11 @@ final class DrydockResourceUpdateWorker extends DrydockWorker { $blueprint = $resource->getBlueprint(); $blueprint->activateResource($resource); $this->validateActivatedResource($blueprint, $resource); + + $awaken_ids = $this->getTaskDataValue('awakenOnActivation'); + if (is_array($awaken_ids) && $awaken_ids) { + PhabricatorWorker::awakenTaskIDs($awaken_ids); + } }