protected function canReclaimResource(DrydockResource $resource) { $viewer = $this->getViewer(); // Don't reclaim a resource if it has been updated recently. If two // leases are fighting, we don't want them to keep reclaming resources // from one another forever without making progress, so make resources // immune to reclamation for a little while after they activate or update. // 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 // anywhere. $updated = $resource->getDateModified(); $now = PhabricatorTime::getNow(); $ago = $now - $updated; if ($ago < phutil_units('3 minutes in seconds')) { return false; } $statuses = array(DrydockLeaseStatus::STATUS_PENDING, DrydockLeaseStatus::STATUS_ACQUIRED, DrydockLeaseStatus::STATUS_ACTIVE, DrydockLeaseStatus::STATUS_RELEASED, DrydockLeaseStatus::STATUS_BROKEN); // Don't reclaim resources that have any active leases. $leases = id(new DrydockLeaseQuery())->setViewer($viewer)->withResourcePHIDs(array($resource->getPHID()))->withStatuses($statuses)->setLimit(1)->execute(); if ($leases) { return false; } return true; }