123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- <?php
- class TripalDaemon extends DrushDaemon {
-
-
-
-
-
-
-
-
- protected $loop_interval = 20;
-
-
-
- protected $tripal_jobs = [];
-
- protected $queue = [];
-
-
-
-
-
- protected $do_parallel = FALSE;
-
-
- protected $max_num_jobs = 3;
-
- protected function executeTask($iteration_number) {
-
-
- if ($this->do_parallel) {
- $this->checkJobStatus();
- }
-
- $job_id = $this->getTripalJobID();
- while ($job_id) {
-
- $this->runTripalJob($job_id);
-
- $job_id = $this->getTripalJobID();
- }
-
-
- if ($this->do_parallel) {
- $this->checkJobStatus();
- }
- }
-
- protected function getTripalJobID() {
-
-
- if ($this->do_parallel) {
-
- if (tripal_max_jobs_exceeded($this->max_num_jobs)) {
- $this->log('Already running the maximum number of jobs.');
- return FALSE;
- }
-
- if (sizeof($this->tripal_jobs) >= $this->max_num_jobs) {
- $this->log('Already running the maximum number of jobs.');
- return FALSE;
- }
- }
-
- else {
-
- if (tripal_is_job_running()) {
- $this->log('Job is still running. Waiting until it completes before starting another one.');
- return FALSE;
- }
- }
-
-
-
-
-
-
- if (empty($this->queue)) {
- $this->queue = db_query(
- "SELECT job_id FROM {tripal_jobs} TJ
- WHERE TJ.start_time IS NULL AND TJ.end_time IS NULL AND TJ.status != 'Cancelled'
- ORDER BY priority ASC, job_id ASC"
- )->fetchCol();
- }
-
- if (empty($this->queue)) {
- return FALSE;
- }
-
- $job_id = array_shift($this->queue);
-
- if (!isset($this->tripal_jobs[$job_id])) {
- return $job_id;
- }
- }
-
- protected function runTripalJob($job_id) {
-
- $job = new TripalJob();
- $job->load($job_id);
-
- $this->tripal_jobs[$job_id] = $job;
- $this->setStatus();
-
- $this->log('Job (ID=' . $job_id . ') Started at ' . format_date(time(), 'small') . '.');
-
- if ($this->do_parallel) {
- $this->runParallelTripalJob($job_id);
- }
-
- else {
- $job = $this->runSequentialTripalJob($job);
-
-
- $job->load($job_id);
-
-
-
- unset($this->tripal_jobs[$job_id]);
- $this->setStatus();
-
- $this->log('Job (ID=' . $job_id . ') Completed');
- $this->log('End DateTime: ' . format_date($job->getEndTime(), 'small'), '', 1);
- $this->log('Status: ' . $job->getStatus(), '', 1);
- }
- }
-
- protected function runParallelTripalJob($job_id) {
-
-
-
-
- $uid = drush_get_option('user', 1);
- $user = user_load($uid);
- $username = $user->name;
-
-
-
-
-
- drush_invoke_process(
- '@self',
- 'trp-run-jobs',
- [],
- [
- 'job_id' => $job_id,
- 'username' => $username,
- 'single' => 1,
- 'parallel' => $this->do_parallel,
- 'max_jobs' => $this->max_num_jobs,
- ],
- ['fork' => TRUE]
- );
- }
-
- protected function runSequentialTripalJob($job) {
-
- try {
- $job->run();
- } catch (Exception $e) {
- $job->logMessage($e->getMessage(), [], TRIPAL_ERROR);
- }
- return $job;
- }
-
- protected function checkJobStatus($job_id = FALSE) {
- if ($job_id) {
- $job = new TripalJob();
- $job->load($job_id);
- $jobs = [$job_id];
- }
- elseif (!empty($this->tripal_jobs)) {
- $jobs = array_keys($this->tripal_jobs);
- }
- else {
- return TRUE;
- }
- $results = db_query(
- 'SELECT job_id, pid, end_time, status FROM {tripal_jobs} WHERE job_id IN (:jobs)',
- [':jobs' => $jobs]);
- foreach ($results as $job) {
-
- if ($job->status == 'Running') {
- $status = shell_exec('ps -p ' . escapeshellarg($job->pid) . ' -o pid=');
- if (!$status) {
-
- $job->end_time = time();
- $job->error_msg = 'Unknown Error Encountered.';
- $job->status = 'Error';
- $job->pid = '';
- drupal_write_record('tripal_jobs', $job, 'job_id');
- }
- }
-
- if ($job->status != 'Running' AND $job->status != 'Waiting') {
-
- unset($this->tripal_jobs[$job->job_id]);
- $this->setStatus();
-
- $this->log('Job (ID=' . $job->job_id . ') Completed');
- $this->log('End DateTime: ' . format_date($job->end_time, 'small'), '', 1);
- $this->log('Status: ' . $job->status, '', 1);
- }
- }
- }
-
- protected function getStatusDetails() {
- $status_details = parent::getStatusDetails();
- $status_details['Running Job'] = (empty($this->tripal_jobs)) ? FALSE : TRUE;
- $status_details['Current Jobs'] = array_keys($this->tripal_jobs);
- return $status_details;
- }
-
- public function setParallel($do_parallel, $max_num_jobs) {
- $this->do_parallel = $do_parallel;
- $this->max_num_jobs = $max_num_jobs;
- }
- }
|