示例#1
0
 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;
 }