Ticket #287: davidsarah-current-tree.diff.txt

File davidsarah-current-tree.diff.txt, 6.2 KB (added by davidsarah, at 2010-02-01T05:48:52Z)
Line 
1diff -rN -u old-tahoe/src/allmydata/immutable/download.py new-tahoe/src/allmydata/immutable/download.py
2--- old-tahoe/src/allmydata/immutable/download.py       2010-02-01 05:40:57.643000000 +0000
3+++ new-tahoe/src/allmydata/immutable/download.py       2010-02-01 05:41:02.752000000 +0000
4@@ -343,12 +343,14 @@
5         the root hash (the number-0 hash), using the share_root_hash from the
6         UEB"""
7         precondition(share_hash_tree[0] is not None, share_hash_tree)
8+        #precondition(isinstance(bucket, layout.ReadBucketProxy), bucket)
9         prefix = "%d-%s-%s" % (sharenum, bucket,
10                                base32.b2a_l(share_hash_tree[0][:8], 60))
11         log.PrefixingLogMixin.__init__(self,
12                                        facility="tahoe.immutable.download",
13                                        prefix=prefix)
14         self.sharenum = sharenum
15+        #assert not isinstance(bucket, int)
16         self.bucket = bucket
17         self.share_hash_tree = share_hash_tree
18         self.num_blocks = num_blocks
19diff -rN -u old-tahoe/src/allmydata/test/no_network.py new-tahoe/src/allmydata/test/no_network.py
20--- old-tahoe/src/allmydata/test/no_network.py  2010-02-01 05:40:58.420000000 +0000
21+++ new-tahoe/src/allmydata/test/no_network.py  2010-02-01 05:41:03.631000000 +0000
22@@ -37,7 +37,7 @@
23 class LocalWrapper:
24     def __init__(self, original):
25         self.original = original
26-        self.broken = False
27+        self.pre_call_notifier = None
28         self.hung_until = None
29         self.post_call_notifier = None
30         self.disconnectors = {}
31@@ -64,8 +64,8 @@
32             return meth(*args, **kwargs)
33 
34         def _call():
35-            if self.broken:
36-                raise IntentionalError("I was asked to break")
37+            if self.pre_call_notifier:
38+                self.pre_call_notifier()
39             if self.hung_until:
40                 d2 = defer.Deferred()
41                 self.hung_until.addCallback(lambda ign: _really_call())
42@@ -253,13 +253,18 @@
43     def break_server(self, serverid):
44         # mark the given server as broken, so it will throw exceptions when
45         # asked to hold a share or serve a share
46-        self.servers_by_id[serverid].broken = True
47+        def _break(ign):
48+            raise IntentionalError("I was asked to break")
49+        self.servers_by_id[serverid].pre_call_notifier = _break
50 
51-    def hang_server(self, serverid, until=defer.Deferred()):
52+    def set_server_pre_call_notifier(self, serverid, cb):
53+        self.servers_by_id[serverid].pre_call_notifier = cb
54+
55+    def hang_server(self, serverid):
56         # hang the given server
57         ss = self.servers_by_id[serverid]
58         assert ss.hung_until is None
59-        ss.hung_until = until
60+        ss.hung_until = defer.Deferred()
61 
62     def unhang_server(self, serverid):
63         # unhang the given server
64diff -rN -u old-tahoe/src/allmydata/test/test_hung_server.py new-tahoe/src/allmydata/test/test_hung_server.py
65--- old-tahoe/src/allmydata/test/test_hung_server.py    2010-02-01 05:40:58.604000000 +0000
66+++ new-tahoe/src/allmydata/test/test_hung_server.py    2010-02-01 05:41:03.825000000 +0000
67@@ -1,7 +1,7 @@
68 
69 import os, shutil
70 from twisted.trial import unittest
71-from twisted.internet import defer
72+from twisted.internet import defer, reactor
73 from allmydata import uri
74 from allmydata.util.consumer import download_to_data
75 from allmydata.immutable import upload
76@@ -21,6 +21,10 @@
77         for (id, ss) in servers:
78             self.g.break_server(id)
79 
80+    def _notify(self, servers, cb):
81+        for (id, ss) in servers:
82+            self.g.set_server_pre_call_notifier(id, cb)
83+
84     def _hang(self, servers, **kwargs):
85         for (id, ss) in servers:
86             self.g.hang_server(id, **kwargs)
87@@ -209,9 +213,10 @@
88         d = defer.succeed(None)
89         for mutable in [False]:
90             d.addCallback(lambda ign: self._set_up(mutable, "test_2_good_8_hung_then_1_recovers"))
91-            d.addCallback(lambda ign: self._hang(self.servers[2:3]))
92-            d.addCallback(lambda ign: self._hang(self.servers[3:]))
93-            d.addCallback(lambda ign: self._unhang(self.servers[2:3]))
94+            d.addCallback(lambda ign: self._hang(self.servers[2:]))
95+            def _recover():
96+                self._unhang(self.servers[2:3])
97+            d.addCallback(lambda ign: reactor.callLater(5, _recover))
98             d.addCallback(lambda ign: self._download_and_check())
99         return d
100 
101@@ -220,10 +225,29 @@
102         for mutable in [False]:
103             d.addCallback(lambda ign: self._set_up(mutable, "test_2_good_8_hung_then_1_recovers_with_2_shares"))
104             d.addCallback(lambda ign: self._copy_all_shares_from(self.servers[0:1], self.servers[2]))
105-            d.addCallback(lambda ign: self._hang(self.servers[2:3]))
106-            d.addCallback(lambda ign: self._hang(self.servers[3:]))
107-            d.addCallback(lambda ign: self._unhang(self.servers[2:3]))
108+            d.addCallback(lambda ign: self._hang(self.servers[2:]))
109+            def _recover():
110+                self._unhang(self.servers[2:3])
111+            d.addCallback(lambda ign: reactor.callLater(5, _recover))
112+            d.addCallback(lambda ign: self._download_and_check())
113+        return d
114+
115+    def test_use_first_servers_to_reply(self):
116+        d = defer.succeed(None)
117+        count = 0  # servers after the first two that receive requests
118+        for mutable in [False]:
119+            d.addCallback(lambda ign: self._set_up(mutable, "test_use_first_servers_to_reply"))
120+            def _incr_count():
121+                count += 1
122+            d.addCallback(lambda ign: self._notify(self.servers[2:], _incr_count))
123+            d.addCallback(lambda ign: self._hang(self.servers[2:]))
124+            def _recover():
125+                self._unhang(self.servers[2:])
126+            d.addCallback(lambda ign: reactor.callLater(5, _recover))
127             d.addCallback(lambda ign: self._download_and_check())
128+            def _check_count(ign):
129+                self.failUnlessEqual(count, 1)
130+            d.addCallback(_check_count)
131         return d
132 
133     def test_failover_during_stage_4(self):
134@@ -240,5 +264,4 @@
135                 doned.addCallback(self._check)
136                 return doned
137             d.addCallback(_after_starting_download)
138-
139         return d