MDL-49740 Lock: Fixed task lock release bugs
authorBrendan Heywood <brendan@catalyst-au.net>
Thu, 2 Apr 2015 06:41:48 +0000 (17:41 +1100)
committerBrendan Heywood <brendan@catalyst-au.net>
Fri, 3 Apr 2015 00:13:03 +0000 (11:13 +1100)
admin/tool/task/cli/schedule_task.php
lib/classes/lock/db_record_lock_factory.php
lib/classes/lock/postgres_lock_factory.php

index 3476c1d..6904d48 100644 (file)
@@ -109,25 +109,29 @@ if ($execute = $options['execute']) {
 
     $predbqueries = $DB->perf_get_queries();
     $pretime = microtime(true);
+
+    mtrace("Scheduled task: " . $task->get_name());
+    // NOTE: it would be tricky to move this code to \core\task\manager class,
+    //       because we want to do detailed error reporting.
+    $cronlockfactory = \core\lock\lock_config::get_lock_factory('cron');
+    if (!$cronlock = $cronlockfactory->get_lock('core_cron', 10)) {
+        mtrace('Cannot obtain cron lock');
+        exit(129);
+    }
+    if (!$lock = $cronlockfactory->get_lock('\\' . get_class($task), 10)) {
+        $cronlock->release();
+        mtrace('Cannot obtain task lock');
+        exit(130);
+    }
+
+    $task->set_lock($lock);
+    if (!$task->is_blocking()) {
+        $cronlock->release();
+    } else {
+        $task->set_cron_lock($cronlock);
+    }
+
     try {
-        mtrace("Scheduled task: " . $task->get_name());
-        // NOTE: it would be tricky to move this code to \core\task\manager class,
-        //       because we want to do detailed error reporting.
-        $cronlockfactory = \core\lock\lock_config::get_lock_factory('cron');
-        if (!$cronlock = $cronlockfactory->get_lock('core_cron', 10)) {
-            mtrace('Cannot obtain cron lock');
-            exit(129);
-        }
-        if (!$lock = $cronlockfactory->get_lock('\\' . get_class($task), 10)) {
-            mtrace('Cannot obtain task lock');
-            exit(130);
-        }
-        $task->set_lock($lock);
-        if (!$task->is_blocking()) {
-            $cronlock->release();
-        } else {
-            $task->set_cron_lock($cronlock);
-        }
         get_mailer('buffer');
         $task->execute();
         if (isset($predbqueries)) {
index a7fbcfb..3a6325c 100644 (file)
@@ -216,7 +216,7 @@ class db_record_lock_factory implements lock_factory {
         // Called from the shutdown handler. Must release all open locks.
         foreach ($this->openlocks as $key => $unused) {
             $lock = new lock($key, $this);
-            $this->release_lock($lock);
+            $lock->release();
         }
     }
 }
index f27d532..5da94bc 100644 (file)
@@ -236,7 +236,7 @@ class postgres_lock_factory implements lock_factory {
         // Called from the shutdown handler. Must release all open locks.
         foreach ($this->openlocks as $key => $unused) {
             $lock = new lock($key, $this);
-            $this->release_lock($lock);
+            $lock->release();
         }
     }