mutable/checker: refactor to make CheckResults easier to change
authorBrian Warner <warner@lothar.com>
Fri, 25 May 2012 07:14:18 +0000 (00:14 -0700)
committerBrian Warner <warner@lothar.com>
Sat, 2 Jun 2012 18:39:10 +0000 (11:39 -0700)
src/allmydata/mutable/checker.py

index d02cfb0eee82de803b91c34b09063df5c034bdd4..e4525d7326c222ae375282a628312b27eeb1e23d 100644 (file)
@@ -17,7 +17,6 @@ class MutableChecker:
         self._monitor = monitor
         self.bad_shares = [] # list of (server,shnum,failure)
         self._storage_index = self._node.get_storage_index()
-        self.results = CheckResults(from_string(node.get_uri()), self._storage_index)
         self.need_repair = False
         self.responded = set() # set of (binary) nodeids
 
@@ -36,8 +35,7 @@ class MutableChecker:
         if verify:
             d.addCallback(self._verify_all_shares)
         d.addCallback(lambda res: servermap)
-        d.addCallback(self._fill_checker_results, self.results)
-        d.addCallback(lambda res: self.results)
+        d.addCallback(self._make_checker_results)
         return d
 
     def _got_mapupdate_results(self, servermap):
@@ -122,7 +120,9 @@ class MutableChecker:
 
         return counters
 
-    def _fill_checker_results(self, smap, r):
+    def _make_checker_results(self, smap):
+        r = CheckResults(from_string(self._node.get_uri()),
+                         self._storage_index)
         self._monitor.raise_if_cancelled()
         r.set_servermap(smap.copy())
         healthy = True
@@ -248,6 +248,7 @@ class MutableChecker:
         else:
             r.set_summary("Unhealthy: " + " ".join(summary))
         r.set_report(report)
+        return r
 
 
 class MutableCheckAndRepairer(MutableChecker):
@@ -256,38 +257,42 @@ class MutableCheckAndRepairer(MutableChecker):
     def __init__(self, node, storage_broker, history, monitor):
         MutableChecker.__init__(self, node, storage_broker, history, monitor)
         self.cr_results = CheckAndRepairResults(self._storage_index)
-        self.cr_results.pre_repair_results = self.results
         self.need_repair = False
 
     def check(self, verify=False, add_lease=False):
         d = MutableChecker.check(self, verify, add_lease)
+        d.addCallback(self._stash_pre_repair_results)
         d.addCallback(self._maybe_repair)
         d.addCallback(lambda res: self.cr_results)
         return d
 
-    def _maybe_repair(self, res):
+    def _stash_pre_repair_results(self, pre_repair_results):
+        self.cr_results.pre_repair_results = pre_repair_results
+        return pre_repair_results
+
+    def _maybe_repair(self, pre_repair_results):
+        crr = self.cr_results
         self._monitor.raise_if_cancelled()
         if not self.need_repair:
-            self.cr_results.post_repair_results = self.results
+            crr.post_repair_results = pre_repair_results
             return
         if self._node.is_readonly():
             # ticket #625: we cannot yet repair read-only mutable files
-            self.cr_results.post_repair_results = self.results
-            self.cr_results.repair_attempted = False
+            crr.post_repair_results = pre_repair_results
+            crr.repair_attempted = False
+            return
+        crr.repair_attempted = True
+        d = self._node.repair(pre_repair_results, monitor=self._monitor)
+        def _repair_finished(rr):
+            crr.repair_successful = rr.get_successful()
+            crr.post_repair_results = self._make_checker_results(rr.servermap)
+            crr.repair_results = rr # TODO?
             return
-        self.cr_results.repair_attempted = True
-        d = self._node.repair(self.results, monitor=self._monitor)
-        def _repair_finished(repair_results):
-            self.cr_results.repair_successful = repair_results.get_successful()
-            r = CheckResults(from_string(self._node.get_uri()), self._storage_index)
-            self.cr_results.post_repair_results = r
-            self._fill_checker_results(repair_results.servermap, r)
-            self.cr_results.repair_results = repair_results # TODO?
         def _repair_error(f):
             # I'm not sure if I want to pass through a failure or not.
-            self.cr_results.repair_successful = False
-            self.cr_results.repair_failure = f # TODO?
-            #self.cr_results.post_repair_results = ??
+            crr.repair_successful = False
+            crr.repair_failure = f # TODO?
+            #crr.post_repair_results = ??
             return f
         d.addCallbacks(_repair_finished, _repair_error)
         return d