Merge branch 'MDL-49740-locking-bugs' of https://github.com/brendanheywood/moodle
authorDan Poltawski <dan@moodle.com>
Tue, 7 Apr 2015 12:08:41 +0000 (13:08 +0100)
committerDan Poltawski <dan@moodle.com>
Tue, 7 Apr 2015 12:08:41 +0000 (13:08 +0100)
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();
         }
     }