コード例 #1
0
 private static function lockObjects(kExclusiveLockKey $lockKey, array $objects, $max_execution_time)
 {
     $exclusive_objects_ids = array();
     // make sure the objects where not taken -
     $con = Propel::getConnection();
     $not_exclusive_count = 0;
     foreach ($objects as $object) {
         $lock_version = $object->getVersion();
         $criteria_for_exclusive_update = new Criteria();
         $criteria_for_exclusive_update->add(BatchJobLockPeer::ID, $object->getId());
         $criteria_for_exclusive_update->add(BatchJobLockPeer::VERSION, $lock_version);
         $update = new Criteria();
         // increment the lock_version - this will make sure it's exclusive
         $update->add(BatchJobLockPeer::VERSION, $lock_version + 1);
         // increment the execution_attempts
         $update->add(BatchJobLockPeer::EXECUTION_ATTEMPTS, $object->getExecutionAttempts() + 1);
         $update->add(BatchJobLockPeer::SCHEDULER_ID, $lockKey->getSchedulerId());
         $update->add(BatchJobLockPeer::WORKER_ID, $lockKey->getWorkerId());
         $update->add(BatchJobLockPeer::BATCH_INDEX, $lockKey->getBatchIndex());
         $expiration = time() + $max_execution_time;
         $update->add(BatchJobLockPeer::EXPIRATION, $expiration);
         $affectedRows = BasePeer::doUpdate($criteria_for_exclusive_update, $update, $con);
         KalturaLog::log("Lock update affected rows [{$affectedRows}] on job id [" . $object->getId() . "] lock version [{$lock_version}]");
         if ($affectedRows == 1) {
             // fix the object to reflect what is in the DB
             $object->setVersion($lock_version + 1);
             $object->setExecutionAttempts($object->getExecutionAttempts() + 1);
             $object->setSchedulerId($lockKey->getSchedulerId());
             $object->setWorkerId($lockKey->getWorkerId());
             $object->setBatchIndex($lockKey->getBatchIndex());
             $object->setExpiration($expiration);
             KalturaLog::log("Job id [" . $object->getId() . "] locked and returned");
             PartnerLoadPeer::updatePartnerLoad($object->getPartnerId(), $object->getJobType(), $object->getJobSubType(), $con);
             $exclusive_objects_ids[] = $object->getId();
         } else {
             $not_exclusive_count++;
             KalturaLog::log("Object not exclusive: [" . get_class($object) . "] id [" . $object->getId() . "]");
         }
     }
     return BatchJobPeer::postLockUpdate($lockKey, $exclusive_objects_ids, $con);
 }