From: Brian Warner <warner@lothar.com>
Date: Fri, 22 May 2009 18:44:24 +0000 (-0700)
Subject: immutable/encode.py: tolerate immediate _remove_shareholder by copying the
X-Git-Url: https://git.rkrishnan.org/components/com_hotproperty/%22doc.html/bar.txt?a=commitdiff_plain;h=de83526acd1ca78fd1022faffa1eba8792ec7d0c;p=tahoe-lafs%2Ftahoe-lafs.git

immutable/encode.py: tolerate immediate _remove_shareholder by copying the
landlord list before iterating over it. This can probably only happen in unit
tests, but cleaning it up makes certain test failures easier to analyze.
---

diff --git a/src/allmydata/immutable/encode.py b/src/allmydata/immutable/encode.py
index 785e42d1..5c1f1869 100644
--- a/src/allmydata/immutable/encode.py
+++ b/src/allmydata/immutable/encode.py
@@ -285,7 +285,7 @@ class Encoder(object):
         self.log("starting shareholders", level=log.NOISY)
         self.set_status("Starting shareholders")
         dl = []
-        for shareid in self.landlords:
+        for shareid in list(self.landlords):
             d = self.landlords[shareid].put_header()
             d.addErrback(self._remove_shareholder, shareid, "start")
             dl.append(d)
@@ -526,7 +526,7 @@ class Encoder(object):
         all_hashes = list(t)
         self.uri_extension_data["crypttext_root_hash"] = t[0]
         dl = []
-        for shareid in self.landlords.keys():
+        for shareid in list(self.landlords):
             dl.append(self.send_crypttext_hash_tree(shareid, all_hashes))
         return self._gather_responses(dl)
 
@@ -611,7 +611,7 @@ class Encoder(object):
         self.log("uri_extension_data is %s" % (ed,), level=log.NOISY, parent=lp)
         self.uri_extension_hash = hashutil.uri_extension_hash(uri_extension)
         dl = []
-        for shareid in self.landlords.keys():
+        for shareid in list(self.landlords):
             dl.append(self.send_uri_extension(shareid, uri_extension))
         return self._gather_responses(dl)
 
@@ -626,7 +626,7 @@ class Encoder(object):
         self.set_status("Closing Shareholders")
         self.set_encode_and_push_progress(extra=0.9)
         dl = []
-        for shareid in self.landlords:
+        for shareid in list(self.landlords):
             d = self.landlords[shareid].close()
             d.addErrback(self._remove_shareholder, shareid, "close")
             dl.append(d)
@@ -653,7 +653,7 @@ class Encoder(object):
         # we need to abort any remaining shareholders, so they'll delete the
         # partial share, allowing someone else to upload it again.
         self.log("aborting shareholders", level=log.UNUSUAL)
-        for shareid in list(self.landlords.keys()):
+        for shareid in list(self.landlords):
             self.landlords[shareid].abort()
         if f.check(defer.FirstError):
             return f.value.subFailure