From b1290633b8cb75225f8d918424ec70c19035d0a3 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Mon, 1 Jun 2009 19:25:11 -0700
Subject: [PATCH] more storage_broker refactoring: downloader gets a broker
 instead of a client, use Client.get_storage_broker() accessor instead of
 direct attribute access.

---
 src/allmydata/client.py              |  3 +++
 src/allmydata/immutable/download.py  | 19 +++++++++++--------
 src/allmydata/immutable/offloaded.py |  2 +-
 src/allmydata/immutable/upload.py    |  2 +-
 src/allmydata/mutable/publish.py     |  2 +-
 src/allmydata/mutable/servermap.py   |  2 +-
 src/allmydata/test/test_checker.py   |  2 ++
 src/allmydata/test/test_helper.py    |  2 ++
 src/allmydata/test/test_mutable.py   |  2 ++
 src/allmydata/test/test_upload.py    |  2 ++
 src/allmydata/test/test_web.py       |  2 ++
 src/allmydata/web/check_results.py   |  2 +-
 12 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/src/allmydata/client.py b/src/allmydata/client.py
index 106b1b72..465c546a 100644
--- a/src/allmydata/client.py
+++ b/src/allmydata/client.py
@@ -263,6 +263,9 @@ class Client(node.Node, pollmixin.PollMixin):
                            default=True, boolean=True):
             sb.use_introducer(self.introducer_client)
 
+    def get_storage_broker(self):
+        return self.storage_broker
+
     def init_stub_client(self):
         def _publish(res):
             # we publish an empty object so that the introducer can count how
diff --git a/src/allmydata/immutable/download.py b/src/allmydata/immutable/download.py
index 38841024..39101c4c 100644
--- a/src/allmydata/immutable/download.py
+++ b/src/allmydata/immutable/download.py
@@ -616,21 +616,22 @@ class DownloadStatus:
         self.results = value
 
 class CiphertextDownloader(log.PrefixingLogMixin):
-    """ I download shares, check their integrity, then decode them, check the integrity of the
-    resulting ciphertext, then and write it to my target. Before I send any new request to a
-    server, I always ask the "monitor" object that was passed into my constructor whether this
-    task has been cancelled (by invoking its raise_if_cancelled() method). """
+    """ I download shares, check their integrity, then decode them, check the
+    integrity of the resulting ciphertext, then and write it to my target.
+    Before I send any new request to a server, I always ask the 'monitor'
+    object that was passed into my constructor whether this task has been
+    cancelled (by invoking its raise_if_cancelled() method)."""
     implements(IPushProducer)
     _status = None
 
-    def __init__(self, client, v, target, monitor):
+    def __init__(self, storage_broker, v, target, monitor):
 
         precondition(IVerifierURI.providedBy(v), v)
         precondition(IDownloadTarget.providedBy(target), target)
 
         prefix=base32.b2a_l(v.storage_index[:8], 60)
         log.PrefixingLogMixin.__init__(self, facility="tahoe.immutable.download", prefix=prefix)
-        self._client = client
+        self._storage_broker = storage_broker
 
         self._verifycap = v
         self._storage_index = v.storage_index
@@ -743,7 +744,7 @@ class CiphertextDownloader(log.PrefixingLogMixin):
 
     def _get_all_shareholders(self):
         dl = []
-        sb = self._client.storage_broker
+        sb = self._storage_broker
         for (peerid,ss) in sb.get_servers(self._storage_index):
             d = ss.callRemote("get_buckets", self._storage_index)
             d.addCallbacks(self._got_response, self._got_error,
@@ -1191,11 +1192,13 @@ class Downloader(service.MultiService):
             # include LIT files
             self.stats_provider.count('downloader.files_downloaded', 1)
             self.stats_provider.count('downloader.bytes_downloaded', u.get_size())
+        storage_broker = self.parent.get_storage_broker()
 
         target = DecryptingTarget(t, u.key, _log_msg_id=_log_msg_id)
         if not monitor:
             monitor=Monitor()
-        dl = CiphertextDownloader(self.parent, u.get_verify_cap(), target, monitor=monitor)
+        dl = CiphertextDownloader(storage_broker, u.get_verify_cap(), target,
+                                  monitor=monitor)
         self._all_downloads[dl] = None
         if history:
             history.add_download(dl.get_download_status())
diff --git a/src/allmydata/immutable/offloaded.py b/src/allmydata/immutable/offloaded.py
index 01dc1ed4..a71bf132 100644
--- a/src/allmydata/immutable/offloaded.py
+++ b/src/allmydata/immutable/offloaded.py
@@ -618,7 +618,7 @@ class Helper(Referenceable, service.MultiService):
         # see if this file is already in the grid
         lp2 = self.log("doing a quick check+UEBfetch",
                        parent=lp, level=log.NOISY)
-        sb = self.parent.storage_broker
+        sb = self.parent.get_storage_broker()
         c = CHKCheckerAndUEBFetcher(sb.get_servers, storage_index, lp2)
         d = c.check()
         def _checked(res):
diff --git a/src/allmydata/immutable/upload.py b/src/allmydata/immutable/upload.py
index 4bf07fed..9a0bce97 100644
--- a/src/allmydata/immutable/upload.py
+++ b/src/allmydata/immutable/upload.py
@@ -166,7 +166,7 @@ class Tahoe2PeerSelector:
         self.use_peers = set() # PeerTrackers that have shares assigned to them
         self.preexisting_shares = {} # sharenum -> peerid holding the share
 
-        sb = client.storage_broker
+        sb = client.get_storage_broker()
         peers = list(sb.get_servers(storage_index))
         if not peers:
             raise NoServersError("client gave us zero peers")
diff --git a/src/allmydata/mutable/publish.py b/src/allmydata/mutable/publish.py
index 8ac19ef9..b833b8f4 100644
--- a/src/allmydata/mutable/publish.py
+++ b/src/allmydata/mutable/publish.py
@@ -190,7 +190,7 @@ class Publish:
         assert self._privkey
         self._encprivkey = self._node.get_encprivkey()
 
-        sb = self._node._client.storage_broker
+        sb = self._node._client.get_storage_broker()
         full_peerlist = sb.get_servers(self._storage_index)
         self.full_peerlist = full_peerlist # for use later, immutable
         self.bad_peers = set() # peerids who have errbacked/refused requests
diff --git a/src/allmydata/mutable/servermap.py b/src/allmydata/mutable/servermap.py
index 565975b2..9c598580 100644
--- a/src/allmydata/mutable/servermap.py
+++ b/src/allmydata/mutable/servermap.py
@@ -421,7 +421,7 @@ class ServermapUpdater:
 
         self._queries_completed = 0
 
-        sb = self._node._client.storage_broker
+        sb = self._node._client.get_storage_broker()
         full_peerlist = list(sb.get_servers(self._node._storage_index))
         self.full_peerlist = full_peerlist # for use later, immutable
         self.extra_peers = full_peerlist[:] # peers are removed as we use them
diff --git a/src/allmydata/test/test_checker.py b/src/allmydata/test/test_checker.py
index e9d88a33..03b57530 100644
--- a/src/allmydata/test/test_checker.py
+++ b/src/allmydata/test/test_checker.py
@@ -9,6 +9,8 @@ from common_web import WebRenderingMixin
 class FakeClient:
     def get_nickname_for_serverid(self, serverid):
         return self.storage_broker.get_nickname_for_serverid(serverid)
+    def get_storage_broker(self):
+        return self.storage_broker
 
 class WebResultsRendering(unittest.TestCase, WebRenderingMixin):
 
diff --git a/src/allmydata/test/test_helper.py b/src/allmydata/test/test_helper.py
index 32b3ab86..38ce5eee 100644
--- a/src/allmydata/test/test_helper.py
+++ b/src/allmydata/test/test_helper.py
@@ -68,6 +68,8 @@ class FakeClient(service.MultiService):
         return log.msg(*args, **kwargs)
     def get_encoding_parameters(self):
         return self.DEFAULT_ENCODING_PARAMETERS
+    def get_storage_broker(self):
+        return self.storage_broker
 
 def flush_but_dont_ignore(res):
     d = flushEventualQueue()
diff --git a/src/allmydata/test/test_mutable.py b/src/allmydata/test/test_mutable.py
index 1ac21f94..942fa762 100644
--- a/src/allmydata/test/test_mutable.py
+++ b/src/allmydata/test/test_mutable.py
@@ -181,6 +181,8 @@ class FakeClient:
 
     def get_all_serverids(self):
         return self.storage_broker.get_all_serverids()
+    def get_storage_broker(self):
+        return self.storage_broker
     def debug_break_connection(self, peerid):
         self.storage_broker.servers[peerid].broken = True
     def debug_remove_connection(self, peerid):
diff --git a/src/allmydata/test/test_upload.py b/src/allmydata/test/test_upload.py
index 52d17796..4d0f764f 100644
--- a/src/allmydata/test/test_upload.py
+++ b/src/allmydata/test/test_upload.py
@@ -177,6 +177,8 @@ class FakeClient:
         pass
     def get_encoding_parameters(self):
         return self.DEFAULT_ENCODING_PARAMETERS
+    def get_storage_broker(self):
+        return self.storage_broker
 
     def get_renewal_secret(self):
         return ""
diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py
index 1eb92bb3..0570473c 100644
--- a/src/allmydata/test/test_web.py
+++ b/src/allmydata/test/test_web.py
@@ -69,6 +69,8 @@ class FakeClient(service.MultiService):
         return u"John Doe"
 
     storage_broker = StorageFarmBroker()
+    def get_storage_broker(self):
+        return self.storage_broker
 
     def create_node_from_uri(self, auri):
         precondition(isinstance(auri, str), auri)
diff --git a/src/allmydata/web/check_results.py b/src/allmydata/web/check_results.py
index 3228f299..cf5634a7 100644
--- a/src/allmydata/web/check_results.py
+++ b/src/allmydata/web/check_results.py
@@ -137,7 +137,7 @@ class ResultsBase:
         add("Unrecoverable Versions", data["count-unrecoverable-versions"])
 
         # this table is sorted by permuted order
-        sb = c.storage_broker
+        sb = c.get_storage_broker()
         permuted_peer_ids = [peerid
                              for (peerid, rref)
                              in sb.get_servers(cr.get_storage_index())]
-- 
2.45.2