Page MenuHomePhabricator

D19076.diff
No OneTemporary

D19076.diff

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
@@ -1000,6 +1000,7 @@
'DoorkeeperSchemaSpec' => 'applications/doorkeeper/storage/DoorkeeperSchemaSpec.php',
'DoorkeeperTagView' => 'applications/doorkeeper/view/DoorkeeperTagView.php',
'DoorkeeperTagsController' => 'applications/doorkeeper/controller/DoorkeeperTagsController.php',
+ 'DrydockAcquiredBrokenResourceException' => 'applications/drydock/exception/DrydockAcquiredBrokenResourceException.php',
'DrydockAlmanacServiceHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php',
'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php',
'DrydockAuthorization' => 'applications/drydock/storage/DrydockAuthorization.php',
@@ -1065,6 +1066,7 @@
'DrydockLeasePHIDType' => 'applications/drydock/phid/DrydockLeasePHIDType.php',
'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php',
'DrydockLeaseQueuedLogType' => 'applications/drydock/logtype/DrydockLeaseQueuedLogType.php',
+ 'DrydockLeaseReacquireLogType' => 'applications/drydock/logtype/DrydockLeaseReacquireLogType.php',
'DrydockLeaseReclaimLogType' => 'applications/drydock/logtype/DrydockLeaseReclaimLogType.php',
'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php',
'DrydockLeaseReleasedLogType' => 'applications/drydock/logtype/DrydockLeaseReleasedLogType.php',
@@ -6199,6 +6201,7 @@
'DoorkeeperSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'DoorkeeperTagView' => 'AphrontView',
'DoorkeeperTagsController' => 'PhabricatorController',
+ 'DrydockAcquiredBrokenResourceException' => 'Exception',
'DrydockAlmanacServiceHostBlueprintImplementation' => 'DrydockBlueprintImplementation',
'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface',
'DrydockAuthorization' => array(
@@ -6285,6 +6288,7 @@
'DrydockLeasePHIDType' => 'PhabricatorPHIDType',
'DrydockLeaseQuery' => 'DrydockQuery',
'DrydockLeaseQueuedLogType' => 'DrydockLogType',
+ 'DrydockLeaseReacquireLogType' => 'DrydockLogType',
'DrydockLeaseReclaimLogType' => 'DrydockLogType',
'DrydockLeaseReleaseController' => 'DrydockLeaseController',
'DrydockLeaseReleasedLogType' => 'DrydockLogType',
diff --git a/src/applications/drydock/exception/DrydockAcquiredBrokenResourceException.php b/src/applications/drydock/exception/DrydockAcquiredBrokenResourceException.php
new file mode 100644
--- /dev/null
+++ b/src/applications/drydock/exception/DrydockAcquiredBrokenResourceException.php
@@ -0,0 +1,4 @@
+<?php
+
+final class DrydockAcquiredBrokenResourceException
+ extends Exception {}
diff --git a/src/applications/drydock/logtype/DrydockLeaseReacquireLogType.php b/src/applications/drydock/logtype/DrydockLeaseReacquireLogType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/drydock/logtype/DrydockLeaseReacquireLogType.php
@@ -0,0 +1,26 @@
+<?php
+
+final class DrydockLeaseReacquireLogType extends DrydockLogType {
+
+ const LOGCONST = 'core.lease.reacquire';
+
+ public function getLogTypeName() {
+ return pht('Reacquiring Resource');
+ }
+
+ public function getLogTypeIcon(array $data) {
+ return 'fa-refresh yellow';
+ }
+
+ public function renderLog(array $data) {
+ $class = idx($data, 'class');
+ $message = idx($data, 'message');
+
+ return pht(
+ 'Lease acquired a resource but failed to activate; acquisition '.
+ 'will be retried: [%s] %s',
+ $class,
+ $message);
+ }
+
+}
diff --git a/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php b/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php
--- a/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php
+++ b/src/applications/drydock/worker/DrydockLeaseUpdateWorker.php
@@ -43,6 +43,26 @@
private function handleUpdate(DrydockLease $lease) {
try {
$this->updateLease($lease);
+ } catch (DrydockAcquiredBrokenResourceException $ex) {
+ // If this lease acquired a resource but failed to activate, we don't
+ // need to break the lease. We can throw it back in the pool and let
+ // it take another shot at acquiring a new resource.
+
+ // Before we throw it back, release any locks the lease is holding.
+ DrydockSlotLock::releaseLocks($lease->getPHID());
+
+ $lease
+ ->setStatus(DrydockLeaseStatus::STATUS_PENDING)
+ ->save();
+
+ $lease->logEvent(
+ DrydockLeaseReacquireLogType::LOGCONST,
+ array(
+ 'class' => get_class($ex),
+ 'message' => $ex->getMessage(),
+ ));
+
+ $this->yieldLease($lease, $ex);
} catch (Exception $ex) {
if ($this->isTemporaryException($ex)) {
$this->yieldLease($lease, $ex);
@@ -749,9 +769,12 @@
}
if ($resource_status != DrydockResourceStatus::STATUS_ACTIVE) {
- throw new Exception(
+ throw new DrydockAcquiredBrokenResourceException(
pht(
- 'Trying to activate lease on a dead resource (in status "%s").',
+ 'Trying to activate lease ("%s") on a resource ("%s") in '.
+ 'the wrong status ("%s").',
+ $lease->getPHID(),
+ $resource->getPHID(),
$resource_status));
}

File Metadata

Mime Type
text/plain
Expires
Thu, May 9, 9:25 PM (1 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6273671
Default Alt Text
D19076.diff (5 KB)

Event Timeline