/** * batch freeExclusiveJobAction action allows to get a generic BatchJob * * @action freeExclusiveJob * @param int $id The id of the job * @param KalturaExclusiveLockKey $lockKey The unique lock key from the batch-process. Is used for the locking mechanism * @param KalturaBatchJobType $jobType The type of the job * @param bool $resetExecutionAttempts Resets the job execution attampts to zero * @return KalturaFreeJobResponse */ function freeExclusiveJobAction($id, KalturaExclusiveLockKey $lockKey, $jobType, $resetExecutionAttempts = false) { $jobType = kPluginableEnumsManager::apiToCore('BatchJobType', $jobType); $job = BatchJobPeer::retrieveByPK($id); // verifies that the job is of the right type if ($job->getJobType() != $jobType) { throw new KalturaAPIException(APIErrors::UPDATE_EXCLUSIVE_JOB_WRONG_TYPE, $id, $lockKey, null); } $job = kBatchManager::freeExclusiveBatchJob($id, $lockKey->toObject(), $resetExecutionAttempts); $batchJob = new KalturaBatchJob(); // start from blank $batchJob->fromObject($job); // gets queues length $c = new Criteria(); $c->add(BatchJobPeer::STATUS, array(KalturaBatchJobStatus::PENDING, KalturaBatchJobStatus::RETRY, KalturaBatchJobStatus::ALMOST_DONE), Criteria::IN); $c->add(BatchJobPeer::JOB_TYPE, $jobType); $queueSize = BatchJobPeer::doCount($c, false, myDbHelper::getConnection(myDbHelper::DB_HELPER_CONN_PROPEL2)); if (!$queueSize) { // gets queues length $c = new Criteria(); $c->add(BatchJobPeer::BATCH_INDEX, null, Criteria::ISNOTNULL); $c->add(BatchJobPeer::PROCESSOR_EXPIRATION, time(), Criteria::GREATER_THAN); $c->add(BatchJobPeer::EXECUTION_ATTEMPTS, BatchJobPeer::getMaxExecutionAttempts($jobType), Criteria::LESS_THAN); $c->add(BatchJobPeer::JOB_TYPE, $jobType); $queueSize = BatchJobPeer::doCount($c, false, myDbHelper::getConnection(myDbHelper::DB_HELPER_CONN_PROPEL2)); } $response = new KalturaFreeJobResponse(); $response->job = $batchJob; $response->jobType = $jobType; $response->queueSize = $queueSize; return $response; }
public static function getExpiredJobs() { $jobTypes = kPluginableEnumsManager::coreValues('BatchJobType'); $c = new Criteria(); $c->add(BatchJobPeer::STATUS, BatchJob::BATCHJOB_STATUS_FATAL, Criteria::NOT_EQUAL); $c->add(BatchJobPeer::DC, kDataCenterMgr::getCurrentDcId()); // each DC should clean its own jobs // $c->add(BatchJobPeer::PROCESSOR_EXPIRATION, time(), Criteria::LESS_THAN); // $c->add(BatchJobPeer::SCHEDULER_ID, 0, Criteria::GREATER_THAN); // $c->add(BatchJobPeer::WORKER_ID, 0, Criteria::GREATER_THAN); $jobs = array(); foreach ($jobTypes as $jobType) { $typedCrit = clone $c; $typedCrit->add(BatchJobPeer::EXECUTION_ATTEMPTS, BatchJobPeer::getMaxExecutionAttempts($jobType), Criteria::GREATER_THAN); $typedCrit->add(BatchJobPeer::JOB_TYPE, $jobType); $typedJobs = BatchJobPeer::doSelect($typedCrit, myDbHelper::getConnection(myDbHelper::DB_HELPER_CONN_PROPEL2)); foreach ($typedJobs as $typedJob) { $jobs[] = $typedJob; } } return $jobs; }
public function isRetriesExceeded() { return $this->execution_attempts >= BatchJobPeer::getMaxExecutionAttempts($this->job_type); }
/** * @param BatchJob $dbBatchJob * @param BatchJob $twinJob * @return bool true if should continue to the next consumer */ public function updatedJob(BatchJob $dbBatchJob, BatchJob $twinJob = null) { try { $jobType = $dbBatchJob->getJobType(); if (is_null($dbBatchJob->getQueueTime()) && $dbBatchJob->getStatus() != BatchJob::BATCHJOB_STATUS_PENDING) { $dbBatchJob->setQueueTime(time()); $dbBatchJob->save(); } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FINISHED) { $dbBatchJob->setFinishTime(time()); $dbBatchJob->save(); } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_RETRY) { $dbBatchJob->setCheckAgainTimeout(time() + BatchJobPeer::getCheckAgainTimeout($jobType)); $dbBatchJob->setQueueTime(null); $dbBatchJob->save(); } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_ALMOST_DONE) { $dbBatchJob->setCheckAgainTimeout(time() + BatchJobPeer::getCheckAgainTimeout($jobType)); $dbBatchJob->save(); } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FAILED || $dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FATAL) { $dbBatchJob->setFinishTime(time()); $dbBatchJob->save(); // TODO - don't abort if it's bulk upload kJobsManager::abortChildJobs($dbBatchJob); } switch ($jobType) { case BatchJobType::IMPORT: $dbBatchJob = $this->updatedImport($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::EXTRACT_MEDIA: $dbBatchJob = $this->updatedExtractMedia($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::CONVERT: $dbBatchJob = $this->updatedConvert($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::POSTCONVERT: $dbBatchJob = $this->updatedPostConvert($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::BULKUPLOAD: $dbBatchJob = $this->updatedBulkUpload($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::CONVERT_PROFILE: $dbBatchJob = $this->updatedConvertProfile($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::BULKDOWNLOAD: $dbBatchJob = $this->updatedBulkDownload($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::PROVISION_PROVIDE: $dbBatchJob = $this->updatedProvisionProvide($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::PROVISION_DELETE: $dbBatchJob = $this->updatedProvisionDelete($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::CONVERT_COLLECTION: $dbBatchJob = $this->updatedConvertCollection($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::STORAGE_EXPORT: $dbBatchJob = $this->updatedStorageExport($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::STORAGE_DELETE: $dbBatchJob = $this->updatedStorageDelete($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; case BatchJobType::CAPTURE_THUMB: $dbBatchJob = $this->updatedCaptureThumb($dbBatchJob, $dbBatchJob->getData(), $twinJob); break; default: break; } if (!kConf::get("batch_ignore_duplication")) { if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FINISHED) { $twinBatchJobs = $dbBatchJob->getTwinJobs(); // update status at all twin jobs foreach ($twinBatchJobs as $twinBatchJob) { if ($twinBatchJob->getStatus() != BatchJob::BATCHJOB_STATUS_FINISHED) { kJobsManager::updateBatchJob($twinBatchJob, BatchJob::BATCHJOB_STATUS_FINISHED); } } } } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_RETRY && $dbBatchJob->getExecutionAttempts() >= BatchJobPeer::getMaxExecutionAttempts($jobType)) { $dbBatchJob = kJobsManager::updateBatchJob($dbBatchJob, BatchJob::BATCHJOB_STATUS_FAILED); } } catch (Exception $ex) { self::alert($dbBatchJob, $ex); KalturaLog::err("Error:" . $ex->getMessage()); } return true; }