Moodle
  1. Moodle
  2. MDL-28156

Fatal Error when backing up/restoring backup file created from empty course

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 2.0.3, 2.1, 2.2
    • Fix Version/s: 2.0.4, 2.1.1
    • Component/s: Backup
    • Labels:
    • Testing Instructions:
      Hide

      IMPORTANT: It's critical to test this twice. Once under 20_STABLE and another under 21_STABLE (no need for master testing as far as solution is 100% the 21_STABLE one).

      1) Create a new course, fill in the course settings
      2) Don't add any new activities
      3) Backup course
      4) Attempt to restore the course
      5) TEST: No notices/warnings shown along the whole process (specially pages 1 and 3 in the restore process
      6) TEST: Restore ends OK and you get one 100% empty (no activities) course at the end

      Show
      IMPORTANT: It's critical to test this twice. Once under 20_STABLE and another under 21_STABLE (no need for master testing as far as solution is 100% the 21_STABLE one). 1) Create a new course, fill in the course settings 2) Don't add any new activities 3) Backup course 4) Attempt to restore the course 5) TEST: No notices/warnings shown along the whole process (specially pages 1 and 3 in the restore process 6) TEST: Restore ends OK and you get one 100% empty (no activities) course at the end
    • Difficulty:
      Easy
    • Affected Branches:
      MOODLE_20_STABLE, MOODLE_21_STABLE, MOODLE_22_STABLE
    • Fixed Branches:
      MOODLE_20_STABLE, MOODLE_21_STABLE
    • Pull from Repository:
    • Pull Master Branch:
      restore_gradebook_in_or_equal_master
    • Rank:
      17852

      Description

      I created a backup file from a course with nothing in it (see attached files), then got:

      Coding error detected, it must be fixed by a programmer: moodle_database::get_in_or_equal() does not accept empty arrays

      More information about this error

      Stack trace:
      line 582 of /lib/dml/moodle_database.php: coding_exception thrown
      line 326 of /backup/moodle2/restore_stepslib.php: call to moodle_database->get_in_or_equal()
      line 359 of /backup/util/plan/restore_structure_step.class.php: call to restore_gradebook_structure_step->after_execute()
      line 108 of /backup/util/plan/restore_structure_step.class.php: call to restore_structure_step->launch_after_execute_methods()
      line 153 of /backup/util/plan/base_task.class.php: call to restore_structure_step->execute()
      line 148 of /backup/util/plan/base_plan.class.php: call to base_task->execute()
      line 157 of /backup/util/plan/restore_plan.class.php: call to base_plan->execute()
      line 302 of /backup/controller/restore_controller.class.php: call to restore_plan->execute()
      line 144 of /backup/util/ui/restore_ui.class.php: call to restore_controller->execute_plan()
      line 45 of /backup/restore.php: call to restore_ui->execute()

        Issue Links

          Activity

          Hide
          Adriel added a comment - - edited
          Show
          Adriel added a comment - - edited Here is a possible workaround until it's fixed: https://github.com/adriel/moodle/commit/46c3e7cf3ac34377a908b205f36dbc45f6b655d8
          Hide
          Michael de Raadt added a comment -

          When replicating this I saw some more errors during the process.

          At step 1 of the restore process, this was displayed:

          Notice: Undefined property: stdClass::$activities in D:\xampp\htdocs\moodle_testing\backup\util\ui\renderer.php on line 125
          Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\moodle_testing\backup\util\ui\renderer.php on line 125

          At step 3, this was displayed:

          Notice: Undefined property: stdClass::$activities in D:\xampp\htdocs\moodle_testing\backup\moodle2\restore_plan_builder.class.php on line 158
          Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\moodle_testing\backup\moodle2\restore_plan_builder.class.php on line 158

          After step 5, the errors above were given.

          Michael;

          Show
          Michael de Raadt added a comment - When replicating this I saw some more errors during the process. At step 1 of the restore process, this was displayed: Notice: Undefined property: stdClass::$activities in D:\xampp\htdocs\moodle_testing\backup\util\ui\renderer.php on line 125 Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\moodle_testing\backup\util\ui\renderer.php on line 125 At step 3, this was displayed: Notice: Undefined property: stdClass::$activities in D:\xampp\htdocs\moodle_testing\backup\moodle2\restore_plan_builder.class.php on line 158 Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\moodle_testing\backup\moodle2\restore_plan_builder.class.php on line 158 After step 5, the errors above were given. Michael;
          Hide
          Paul Vaughan added a comment -

          Just to confirm we're seeing this error on a course created in Moodle 2.0 (exact build unknown), and being imported into a different Moodle running 2.1 (build 20110701).

          Show
          Paul Vaughan added a comment - Just to confirm we're seeing this error on a course created in Moodle 2.0 (exact build unknown), and being imported into a different Moodle running 2.1 (build 20110701).
          Hide
          Eloy Lafuente (stronk7) added a comment -

          Just confirmed it's one regression caused by MDL-27988 when empty (no grade items) restore operations are executed.

          I've some "work-in-progress" patches available here:

          Right now it only fixes the problem the error with get_in_or_equal. It would be great to have this tested both int 20_STABLE and 21_STABLE (no needed for master = 21_STABLE) ASAP. Cause: patches are different for those 2 stable branches.

          In the mean time I'll be working on keeping out those notices (far less critical than the original error).

          So any feedback of the patches above (20 and 21 branches) will be really welcome.

          TIA and ciao

          Show
          Eloy Lafuente (stronk7) added a comment - Just confirmed it's one regression caused by MDL-27988 when empty (no grade items) restore operations are executed. I've some "work-in-progress" patches available here: master: https://github.com/stronk7/moodle/compare/master...restore_gradebook_in_or_equal_master 21_STABLE: https://github.com/stronk7/moodle/compare/MOODLE_21_STABLE...restore_gradebook_in_or_equal_m21 20_STABLE: https://github.com/stronk7/moodle/compare/MOODLE_20_STABLE...restore_gradebook_in_or_equal_m20 Right now it only fixes the problem the error with get_in_or_equal. It would be great to have this tested both int 20_STABLE and 21_STABLE (no needed for master = 21_STABLE) ASAP. Cause: patches are different for those 2 stable branches. In the mean time I'll be working on keeping out those notices (far less critical than the original error). So any feedback of the patches above (20 and 21 branches) will be really welcome. TIA and ciao
          Hide
          Eloy Lafuente (stronk7) added a comment -

          Ho Adriel, just to ACK I discovered your proposal/patch NOW, while going to fix the notices commented above by Michael!

          It's 99% the same I'm doing, only tiny difference is the value you pass to get_in_or_equal(). I'm passing 0, impossible match, while you are passing true, aka numeric 1, improbable but possible (id = 1) match.

          Also note the 20_STABLE solution uses a different approach because such functionality is not available in the get_in_or_equal() function,

          Thanks for the patch, anyway! Going to kill those notices here... ciao

          Show
          Eloy Lafuente (stronk7) added a comment - Ho Adriel, just to ACK I discovered your proposal/patch NOW, while going to fix the notices commented above by Michael! It's 99% the same I'm doing, only tiny difference is the value you pass to get_in_or_equal(). I'm passing 0, impossible match, while you are passing true, aka numeric 1, improbable but possible (id = 1) match. Also note the 20_STABLE solution uses a different approach because such functionality is not available in the get_in_or_equal() function, Thanks for the patch, anyway! Going to kill those notices here... ciao
          Hide
          Eloy Lafuente (stronk7) added a comment -

          Hi,

          I've added one more commit to the 3 branches above that cause all notices to disappear. So I'm sending this for integrations. In any case, feedback will be welcome an surely will make tester life easier.

          TIA and ciao

          Show
          Eloy Lafuente (stronk7) added a comment - Hi, I've added one more commit to the 3 branches above that cause all notices to disappear. So I'm sending this for integrations. In any case, feedback will be welcome an surely will make tester life easier. TIA and ciao
          Hide
          Sam Hemelryk added a comment -

          Thanks Eloy - all looked good and has been integrated now

          Show
          Sam Hemelryk added a comment - Thanks Eloy - all looked good and has been integrated now
          Hide
          Andrew Davis added a comment -

          Looks good

          Show
          Andrew Davis added a comment - Looks good
          Hide
          Sam Hemelryk added a comment -

          Congratulations - this fix has just been released in the weeklies.

          Show
          Sam Hemelryk added a comment - Congratulations - this fix has just been released in the weeklies.

            People

            • Votes:
              2 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: