From de83526acd1ca78fd1022faffa1eba8792ec7d0c Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Fri, 22 May 2009 11:44:24 -0700
Subject: [PATCH] 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.

---
 src/allmydata/immutable/encode.py | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

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
-- 
2.45.2