Changeset View
Changeset View
Standalone View
Standalone View
src/applications/drydock/worker/DrydockWorker.php
Show First 20 Lines • Show All 197 Lines • ▼ Show 20 Lines | abstract class DrydockWorker extends PhabricatorWorker { | ||||
protected function canReclaimResource(DrydockResource $resource) { | protected function canReclaimResource(DrydockResource $resource) { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
// Don't reclaim a resource if it has been updated recently. If two | // Don't reclaim a resource if it has been updated recently. If two | ||||
// leases are fighting, we don't want them to keep reclaiming resources | // leases are fighting, we don't want them to keep reclaiming resources | ||||
// from one another forever without making progress, so make resources | // from one another forever without making progress, so make resources | ||||
// immune to reclamation for a little while after they activate or update. | // immune to reclamation for a little while after they activate or update. | ||||
$now = PhabricatorTime::getNow(); | |||||
$max_epoch = ($now - phutil_units('3 minutes in seconds')); | |||||
// TODO: It would be nice to use a more narrow time here, like "last | // TODO: It would be nice to use a more narrow time here, like "last | ||||
// activation or lease release", but we don't currently store that | // activation or lease release", but we don't currently store that | ||||
// anywhere. | // anywhere. | ||||
$updated = $resource->getDateModified(); | $updated = $resource->getDateModified(); | ||||
$now = PhabricatorTime::getNow(); | if ($updated > $max_epoch) { | ||||
$ago = ($now - $updated); | |||||
if ($ago < phutil_units('3 minutes in seconds')) { | |||||
return false; | return false; | ||||
} | } | ||||
$statuses = array( | $statuses = array( | ||||
DrydockLeaseStatus::STATUS_PENDING, | DrydockLeaseStatus::STATUS_PENDING, | ||||
DrydockLeaseStatus::STATUS_ACQUIRED, | DrydockLeaseStatus::STATUS_ACQUIRED, | ||||
DrydockLeaseStatus::STATUS_ACTIVE, | DrydockLeaseStatus::STATUS_ACTIVE, | ||||
DrydockLeaseStatus::STATUS_RELEASED, | DrydockLeaseStatus::STATUS_RELEASED, | ||||
DrydockLeaseStatus::STATUS_BROKEN, | DrydockLeaseStatus::STATUS_BROKEN, | ||||
); | ); | ||||
// Don't reclaim resources that have any active leases. | // Don't reclaim resources that have any active leases. | ||||
$leases = id(new DrydockLeaseQuery()) | $leases = id(new DrydockLeaseQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withResourcePHIDs(array($resource->getPHID())) | ->withResourcePHIDs(array($resource->getPHID())) | ||||
->withStatuses($statuses) | ->withStatuses($statuses) | ||||
->setLimit(1) | ->setLimit(1) | ||||
->execute(); | ->execute(); | ||||
if ($leases) { | if ($leases) { | ||||
return false; | return false; | ||||
} | } | ||||
// See T13676. Don't reclaim a resource if a lease recently released. | |||||
$leases = id(new DrydockLeaseQuery()) | |||||
->setViewer($viewer) | |||||
->withResourcePHIDs(array($resource->getPHID())) | |||||
->withStatuses( | |||||
array( | |||||
DrydockLeaseStatus::STATUS_DESTROYED, | |||||
)) | |||||
->withDateModifiedBetween($max_epoch, null) | |||||
->setLimit(1) | |||||
->execute(); | |||||
if ($leases) { | |||||
return false; | |||||
} | |||||
return true; | return true; | ||||
} | } | ||||
protected function reclaimResource( | protected function reclaimResource( | ||||
DrydockResource $resource, | DrydockResource $resource, | ||||
DrydockLease $lease) { | DrydockLease $lease) { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
Show All 26 Lines |