Page MenuHomePhabricator

D10517.diff
No OneTemporary

D10517.diff

diff --git a/src/applications/drydock/blueprint/DrydockAmazonEC2HostBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockAmazonEC2HostBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockAmazonEC2HostBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockAmazonEC2HostBlueprintImplementation.php
@@ -71,6 +71,19 @@
return $platform_match && $custom_match;
}
+ protected function executeInitializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease) {
+
+ // We must set the platform so that other allocators will lease
+ // against it successfully.
+ $resource
+ ->setAttribute(
+ 'platform',
+ $this->getDetail('platform'))
+ ->save();
+ }
+
protected function executeAllocateResource(
DrydockResource $resource,
DrydockLease $lease) {
diff --git a/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php
@@ -366,6 +366,10 @@
return true;
}
+ abstract protected function executeInitializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease);
+
abstract protected function executeAllocateResource(
DrydockResource $resource,
DrydockLease $lease);
@@ -440,6 +444,25 @@
$resource->saveTransaction();
}
+ final public function initializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease) {
+
+ $scope = $this->pushActiveScope($resource, $lease);
+
+ $this->log(pht(
+ 'Blueprint \'%s\': Initializing Resource for \'%s\'',
+ $this->getBlueprintClass(),
+ $lease->getLeaseName()));
+
+ try {
+ $this->executeInitializePendingResource($resource, $lease);
+ } catch (Exception $ex) {
+ $this->logException($ex);
+ throw $ex;
+ }
+ }
+
final public function allocateResource(
DrydockResource $resource,
DrydockLease $lease) {
@@ -572,7 +595,7 @@
}
}
- private function pushActiveScope(
+ public function pushActiveScope(
DrydockResource $resource = null,
DrydockLease $lease = null) {
diff --git a/src/applications/drydock/blueprint/DrydockMinMaxBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockMinMaxBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockMinMaxBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockMinMaxBlueprintImplementation.php
@@ -50,12 +50,14 @@
'of %d.',
count($pool),
$max_count));
+ return true;
} else {
$this->log(pht(
'Will deny resource allocation because %d is less than the maximum '.
'of %d.',
count($pool),
$max_count));
+ return false;
}
}
diff --git a/src/applications/drydock/blueprint/DrydockMinMaxExpiryBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockMinMaxExpiryBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockMinMaxExpiryBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockMinMaxExpiryBlueprintImplementation.php
@@ -28,7 +28,7 @@
$pool_copy = array();
foreach ($pool as $resource) {
$lifetime = $now - $resource->getDateCreated();
- if ($lifetime > $expiry) {
+ if ($lifetime <= $expiry) {
$pool_copy[] = $resource;
}
}
diff --git a/src/applications/drydock/blueprint/DrydockMinMaxTestBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockMinMaxTestBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockMinMaxTestBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockMinMaxTestBlueprintImplementation.php
@@ -19,6 +19,10 @@
return pht('Used to test min / max counts.');
}
+ protected function executeInitializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease) {}
+
protected function executeAllocateResource(
DrydockResource $resource,
DrydockLease $lease) {
diff --git a/src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
@@ -19,6 +19,10 @@
return false;
}
+ protected function executeInitializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease) {}
+
protected function executeAllocateResource(
DrydockResource $resource,
DrydockLease $lease) {
diff --git a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php
--- a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php
+++ b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php
@@ -33,6 +33,10 @@
return $context->getCurrentResourceLeaseCount() === 0;
}
+ protected function executeInitializePendingResource(
+ DrydockResource $resource,
+ DrydockLease $lease) {}
+
protected function executeAllocateResource(
DrydockResource $resource,
DrydockLease $lease) {
diff --git a/src/applications/drydock/controller/DrydockLeaseViewController.php b/src/applications/drydock/controller/DrydockLeaseViewController.php
--- a/src/applications/drydock/controller/DrydockLeaseViewController.php
+++ b/src/applications/drydock/controller/DrydockLeaseViewController.php
@@ -37,7 +37,8 @@
$logs = id(new DrydockLogQuery())
->setViewer($viewer)
->withLeaseIDs(array($lease->getID()))
- ->executeWithOffsetPager($pager);
+ ->execute();
+// ->executeWithOffsetPager($pager);
$log_table = id(new DrydockLogListView())
->setUser($viewer)
diff --git a/src/applications/drydock/worker/DrydockAllocatorWorker.php b/src/applications/drydock/worker/DrydockAllocatorWorker.php
--- a/src/applications/drydock/worker/DrydockAllocatorWorker.php
+++ b/src/applications/drydock/worker/DrydockAllocatorWorker.php
@@ -82,7 +82,7 @@
$blueprints = $this->loadAllBlueprints();
$lock = PhabricatorGlobalLock::newLock('drydockallocation');
- $lock->lock(10000);
+ $lock->lock(1000000);
// TODO: Policy stuff.
$pool = id(new DrydockResource())->loadAllWhere(
@@ -216,6 +216,8 @@
try {
foreach ($blueprints as $key => $candidate_blueprint) {
+ $scope = $candidate_blueprint->pushActiveScope(null, $lease);
+
$rpool = idx($resources_per_blueprint, $key, array());
if (!$candidate_blueprint->canAllocateMoreResources($rpool)) {
$this->logToDrydock(
@@ -326,6 +328,17 @@
$this->logToDrydock(
pht('Moved the resource to the pending status.'));
+ // We must allow some initial set up of resource attributes within the
+ // lock such that when we exit, method calls to canAllocateLease will
+ // succeed even for pending resources.
+ $this->logToDrydock(
+ pht('Started initialization of pending resource.'));
+
+ $blueprint->initializePendingResource($resource, $lease);
+
+ $this->logToDrydock(
+ pht('Finished initialization of pending resource.'));
+
$lock->unlock();
} catch (Exception $ex) {
$lock->unlock();

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 20, 8:54 AM (4 w, 5 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7709485
Default Alt Text
D10517.diff (7 KB)

Event Timeline