ArielGlenn has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/302706

Change subject: If a prereq job is missing, run it instead of giving up
......................................................................

If a prereq job is missing, run it instead of giving up

[WIP utterly untested]

Bug: T141981
Change-Id: I278e0e504be2c387fecf02cab07a365dd1f2b6f2
---
M xmldumps-backup/dumps/runner.py
1 file changed, 54 insertions(+), 35 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/dumps 
refs/changes/06/302706/1

diff --git a/xmldumps-backup/dumps/runner.py b/xmldumps-backup/dumps/runner.py
index 6d45fdf..eb21266 100644
--- a/xmldumps-backup/dumps/runner.py
+++ b/xmldumps-backup/dumps/runner.py
@@ -703,6 +703,49 @@
             self.failurehandler.report_failure()
         self.failurehandler.failure_count += 1
 
+    def do_run_item(self, item):
+        prereq_job = None
+
+        Maintenance.exit_if_in_maintenance_mode(
+            "In maintenance mode, exiting dump of %s at step %s"
+            % (self.db_name, item.name()))
+        if item.to_run():
+            item.start()
+            self.indexhtml.update_index_html()
+            self.statushtml.update_status_file()
+
+            self.dumpjobdata.do_before_job(self.dump_item_list.dump_items)
+
+            try:
+                item.dump(self)
+            except Exception, ex:
+                exc_type, exc_value, exc_traceback = sys.exc_info()
+                if self.verbose:
+                    sys.stderr.write(repr(traceback.format_exception(
+                        exc_type, exc_value, exc_traceback)))
+                else:
+                    if exc_type.__name__ == 'BackupPrereqError':
+                        error_message = str(ex)
+                        self.debug(error_message)
+                        if error_message.startswith("Required job "):
+                            prereq_job = error_message.split(" ")[2]
+                    else:
+                        self.debug("*** exception! " + str(ex))
+                    if exc_type.__name__ != 'BackupPrereqError':
+                        item.set_status("failed")
+
+        if item.status() == "done":
+            self.dumpjobdata.do_after_job(item)
+        elif item.status() == "waiting" or item.status() == "skipped":
+            # don't update the checksum files for this item.
+            return prereq_job
+        else:
+            # Here for example status is "failed". But maybe also
+            # "in-progress", if an item chooses to override dump(...) and
+            # forgets to set the status. This is a failure as well.
+            self.run_handle_failure()
+            return prereq_job
+
     def run(self):
         if self.job_requested:
             if not self.dump_item_list.old_runinfo_retrieved and 
self.wiki.exists_perdump_index():
@@ -753,41 +796,17 @@
         self.dumpjobdata.do_before_dump()
 
         for item in self.dump_item_list.dump_items:
-            Maintenance.exit_if_in_maintenance_mode(
-                "In maintenance mode, exiting dump of %s at step %s"
-                % (self.db_name, item.name()))
-            if item.to_run():
-                item.start()
-                self.indexhtml.update_index_html()
-                self.statushtml.update_status_file()
-
-                self.dumpjobdata.do_before_job(self.dump_item_list.dump_items)
-
-                try:
-                    item.dump(self)
-                except Exception, ex:
-                    exc_type, exc_value, exc_traceback = sys.exc_info()
-                    if self.verbose:
-                        sys.stderr.write(repr(traceback.format_exception(
-                            exc_type, exc_value, exc_traceback)))
-                    else:
-                        if exc_type.__name__ == 'BackupPrereqError':
-                            self.debug(str(ex))
-                        else:
-                            self.debug("*** exception! " + str(ex))
-                        if exc_type.__name__ != 'BackupPrereqError':
-                            item.set_status("failed")
-
-            if item.status() == "done":
-                self.dumpjobdata.do_after_job(item)
-            elif item.status() == "waiting" or item.status() == "skipped":
-                # don't update the checksum files for this item.
-                continue
-            else:
-                # Here for example status is "failed". But maybe also
-                # "in-progress", if an item chooses to override dump(...) and
-                # forgets to set the status. This is a failure as well.
-                self.run_handle_failure()
+            prereq_job = self.do_run_item(item)
+            max_prereqs = 0
+            # we have the lock so we might as well run the prereq job now.
+            # there may be a string of prereqs not met,
+            # i.e. articlesrecombine -> articles -> stubs
+            # so we're willing to walk back up the list up to five items,
+            # assume there's something really broken if it takes more than that
+            while prereq_job is not None and max_prereqs < 5:
+                new_item = self.dump_item_list.find_item_by_name(prereq_job)
+                prereq_job = self.do_run_item(new_item)
+                max_prereqs = max_prereqs + 1
 
         # special case
         if self.job_requested == "createdirs":

-- 
To view, visit https://gerrit.wikimedia.org/r/302706
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I278e0e504be2c387fecf02cab07a365dd1f2b6f2
Gerrit-PatchSet: 1
Gerrit-Project: operations/dumps
Gerrit-Branch: master
Gerrit-Owner: ArielGlenn <ar...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to