MDL-24962 backup - clean plan/settings circular refs on restore
authorEloy Lafuente <stronk7@moodle.org>
Mon, 15 Nov 2010 16:08:02 +0000 (16:08 +0000)
committerEloy Lafuente <stronk7@moodle.org>
Mon, 15 Nov 2010 16:08:02 +0000 (16:08 +0000)
backup/controller/restore_controller.class.php
backup/util/plan/restore_plan.class.php

index 78fb4e6..f08b09b 100644 (file)
@@ -135,6 +135,23 @@ class restore_controller extends backup implements loggable {
         }
     }
 
+    /**
+     * Clean structures used by the restore_controller
+     *
+     * This method clean various structures used by the restore_controller,
+     * destroying them in an ordered way, so their memory will be gc properly
+     * by PHP (mainly circular references).
+     *
+     * Note that, while it's not mandatory to execute this method, it's highly
+     * recommended to do so, specially in scripts performing multiple operations
+     * (like the automated backups) or the system will run out of memory after
+     * a few dozens of backups)
+     */
+    public function destroy() {
+        // Only need to destroy circulars under the plan. Delegate to it.
+        $this->plan->destroy();
+    }
+
     public function finish_ui() {
         if ($this->status != backup::STATUS_SETTING_UI) {
             throw new restore_controller_exception('cannot_finish_ui_if_not_setting_ui');
@@ -157,7 +174,9 @@ class restore_controller extends backup implements loggable {
         // containing all the steps will be sent to DB. 100% (monster) useless.
         if ($status == backup::STATUS_AWAITING || $status == backup::STATUS_NEED_PRECHECK) {
             $this->save_controller();
-            $this->logger = self::load_controller($this->restoreid)->logger; // wakeup loggers
+            $tbc = self::load_controller($this->restoreid);
+            $this->logger = $tbc->logger; // wakeup loggers
+            $tbc->destroy(); // Clean temp controller structures
         }
     }
 
index e38ea45..27b1cfc 100644 (file)
@@ -59,6 +59,16 @@ class restore_plan extends base_plan implements loggable {
         parent::__construct('restore_plan');
     }
 
+    /**
+     * Destroy all circular references. It helps PHP 5.2 a lot!
+     */
+    public function destroy() {
+        // No need to destroy anything recursively here, direct reset
+        $this->controller = null;
+        // Delegate to base plan the rest
+        parent::destroy();
+    }
+
     public function build() {
         restore_plan_builder::build_plan($this->controller); // We are moodle2 always, go straight to builder
         $this->built = true;