diff --git a/src/allmydata/dirnode.py b/src/allmydata/dirnode.py index 022a6e0..76f2dc9 100644 --- a/src/allmydata/dirnode.py +++ b/src/allmydata/dirnode.py @@ -929,9 +929,11 @@ class DeepChecker: if self._repair: d = node.check_and_repair(self.monitor, self._verify, self._add_lease) d.addCallback(self._results.add_check_and_repair, childpath) + d.addErrback(self._results.add_check_and_repair, childpath) else: d = node.check(self.monitor, self._verify, self._add_lease) d.addCallback(self._results.add_check, childpath) + d.addErrback(self._results.add_check, childpath) d.addCallback(lambda ignored: self._stats.add_node(node, childpath)) return d diff --git a/src/allmydata/immutable/filenode.py b/src/allmydata/immutable/filenode.py index ed3785b..94c7d77 100644 --- a/src/allmydata/immutable/filenode.py +++ b/src/allmydata/immutable/filenode.py @@ -143,11 +143,17 @@ class CiphertextFileNode: crr.post_repair_results = prr return crr def _repair_error(f): - # as with mutable repair, I'm not sure if I want to pass - # through a failure or not. TODO + prr = CheckResults(cr.uri, cr.storage_index) + prr.data = copy.deepcopy(cr.data) + prr.set_healthy(False) + prr.set_recoverable(False) + prr.set_needs_rebalancing(False) + crr.post_repair_results = prr + crr.repair_successful = False crr.repair_failure = f - return f + return crr + r = Repairer(self, storage_broker=sb, secret_holder=sh, monitor=monitor) d = r.start() diff --git a/src/allmydata/mutable/checker.py b/src/allmydata/mutable/checker.py index e5d3c30..3efc75a 100644 --- a/src/allmydata/mutable/checker.py +++ b/src/allmydata/mutable/checker.py @@ -312,10 +312,14 @@ class MutableCheckAndRepairer(MutableChecker): 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. + prr = CheckResults(cr.uri, cr.storage_index) + prr.data = copy.deepcopy(cr.data) + prr.set_healthy(False) + prr.set_recoverable(False) + prr.set_needs_rebalancing(False) + self.cr_results.post_repair_results = prr + self.cr_results.repair_successful = False - self.cr_results.repair_failure = f # TODO? - #self.cr_results.post_repair_results = ?? - return f + self.cr_results.repair_failure = f d.addCallbacks(_repair_finished, _repair_error) return d diff --git a/src/allmydata/scripts/tahoe_check.py b/src/allmydata/scripts/tahoe_check.py index adb0ccc..e716eae 100644 --- a/src/allmydata/scripts/tahoe_check.py +++ b/src/allmydata/scripts/tahoe_check.py @@ -210,16 +210,18 @@ class DeepCheckAndRepairOutput(LineOnlyReceiver): self.repairs_attempted += 1 if crr["repair-successful"]: self.repairs_successful += 1 + + path = d["path"] + if not path: + path = [""] + # verbose means also print one line per file if self.verbose: - # verbose means also print one line per file - path = d["path"] - if not path: - path = [""] # we don't seem to have a summary available, so build one if was_healthy: summary = "healthy" else: summary = "not healthy" + print >>stdout, "%s: %s" % (quote_path(path), summary) # always print out corrupt shares @@ -231,9 +233,9 @@ class DeepCheckAndRepairOutput(LineOnlyReceiver): # always print out repairs if crr["repair-attempted"]: if crr["repair-successful"]: - print >>stdout, " repair successful" + print >>stdout, "%s repair successful" % quote_path(path) else: - print >>stdout, " repair failed" + print >>stdout, "%s repair failed" % quote_path(path) def done(self): if self.in_error: