Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-49740

Scheduled task cli not releasing cron lock

    XMLWordPrintable

    Details

    • Testing Instructions:
      Hide

      Dump a simple script with this coding error somewhere:

      <?php

      define('CLI_SCRIPT', true);
      require(_DIR_ . '/../../../../config.php');
      require_once("$CFG->libdir/clilib.php");

      $factory = \core\lock\lock_config::get_lock_factory('cron');
      $lock = $factory->get_lock('core_cron', 10);

      Prior to patch you get a stack trace from the context of the shutdown handler.

      After the patch when you run this the exception has extra details which tells you exactly where the lock was opened that should be released:

      PHP Fatal error: Uncaught exception 'coding_exception' with message 'Coding error detected, it must be fixed by a programmer: A lock was created but not released at:
      /var/www/cqu-he-moodle/admin/tool/task/cli/fail.php on line 8

      Code should look like:

      $factory = \core\lock\lock_config::get_lock_factory('cron');
      $lock = $factory->get_lock(1);
      $lock->release(); // Locks must ALWAYS be released like this.

      ' in /var/www/cqu-he-moodle/lib/classes/lock/lock.php:118

      Show
      Dump a simple script with this coding error somewhere: <?php define('CLI_SCRIPT', true); require(_ DIR _ . '/../../../../config.php'); require_once("$CFG->libdir/clilib.php"); $factory = \core\lock\lock_config::get_lock_factory('cron'); $lock = $factory->get_lock('core_cron', 10); Prior to patch you get a stack trace from the context of the shutdown handler. After the patch when you run this the exception has extra details which tells you exactly where the lock was opened that should be released: PHP Fatal error: Uncaught exception 'coding_exception' with message 'Coding error detected, it must be fixed by a programmer: A lock was created but not released at: /var/www/cqu-he-moodle/admin/tool/task/cli/fail.php on line 8 Code should look like: $factory = \core\lock\lock_config::get_lock_factory('cron'); $lock = $factory->get_lock(1); $lock->release(); // Locks must ALWAYS be released like this. ' in /var/www/cqu-he-moodle/lib/classes/lock/lock.php:118
    • Affected Branches:
      MOODLE_27_STABLE, MOODLE_28_STABLE
    • Fixed Branches:
      MOODLE_27_STABLE, MOODLE_28_STABLE
    • Pull Master Branch:
      MDL-49740-locking-bugs

      Description

      Today I was debugging an task api issue and was trying to use the admin/tool/task/cli/schedule_task.php CLI to debug what was going on.The CLI was complaining about lock's not being released and showing fairly useless stack trace.

      After a bit of digging I added some extra debugging info into the locking factory for postgres which clearly shows where the original lock was created and show this in lock::__destruct so that it's obvious exactly where the coding error is. As it turns out it's actually the schedule_task.php which wasn't releasing the cron lock properly when the task lock fails.

      In addition to this the auto_release methods in both db factory classes then create new lock objects and don't release them which further obfuscates the stacks and error messages.

      I'll have a patch ready shortly with adds the debugging to all of the various lock factories, fixes the auto_release bug and also fixes the cli script bug.

        Attachments

          Activity

            People

            Assignee:
            brendanheywood Brendan Heywood
            Reporter:
            brendanheywood Brendan Heywood
            Peer reviewer:
            Damyon Wiese
            Integrator:
            Dan Poltawski
            Tester:
            Adrian Greeve
            Participants:
            Component watchers:
            Andrew Nicols, Jun Pataleta, Michael Hawkins, Shamim Rezaie, Simey Lameze
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved:
              Fix Release Date:
              11/May/15