/** * @return BucketRange */ protected function _claimNextFreeRange() { $range = false; $db = BucketRange::conn(); EventManager::trigger(Events::CLAIM_RANGE_START); // Check for an already-flagged range $coll = new RecordCollection(new BucketRange()); $coll->loadWhere(['processing' => 1, 'hostname' => $this->_hostname, 'instanceName' => $this->_instanceName])->limit(1); if ($coll->count() > 0) { $range = $coll->first(); } else { $res = $db->query(ParseQuery::parse($db, "UPDATE %T SET processing=1, hostname=%s, instanceName=%s " . "WHERE processing=0 AND processed=0 ORDER BY randomKey LIMIT 1", BucketRange::tableName(), $this->_hostname, $this->_instanceName)); if ($res) { $range = BucketRange::loadWhere(['processing' => 1, 'hostname' => $this->_hostname, 'instanceName' => $this->_instanceName]); } } EventManager::trigger(Events::CLAIM_RANGE_END); return $range; }