1 | Tue Jul 26 11:12:08 PDT 2011 Kevan Carstensen <kevan@isnotajoke.com> |
---|
2 | * cli: make 'tahoe cp' overwrite mutable files in-place |
---|
3 | |
---|
4 | New patches: |
---|
5 | |
---|
6 | [cli: make 'tahoe cp' overwrite mutable files in-place |
---|
7 | Kevan Carstensen <kevan@isnotajoke.com>**20110726181208 |
---|
8 | Ignore-this: 1b76daab64cc1f4250af9e8f4d1156d5 |
---|
9 | ] { |
---|
10 | hunk ./src/allmydata/scripts/tahoe_cp.py 389 |
---|
11 | url = self.nodeurl + "uri" |
---|
12 | if not hasattr(inf, "seek"): |
---|
13 | inf = inf.read() |
---|
14 | - filecap = PUT(url, inf) |
---|
15 | - # TODO: this always creates immutable files. We might want an option |
---|
16 | - # to always create mutable files, or to copy mutable files into new |
---|
17 | - # mutable files. |
---|
18 | - self.new_children[name] = filecap |
---|
19 | + |
---|
20 | + if self.children is None: |
---|
21 | + self.populate(False) |
---|
22 | + |
---|
23 | + # Check to see if we already have a mutable file by this name. |
---|
24 | + # If so, overwrite that file in place. |
---|
25 | + if name in self.children and self.children[name].mutable: |
---|
26 | + self.children[name].put_file(inf) |
---|
27 | + else: |
---|
28 | + filecap = PUT(url, inf) |
---|
29 | + # TODO: this always creates immutable files. We might want an option |
---|
30 | + # to always create mutable files, or to copy mutable files into new |
---|
31 | + # mutable files. |
---|
32 | + self.new_children[name] = filecap |
---|
33 | |
---|
34 | def put_uri(self, name, filecap): |
---|
35 | self.new_children[name] = filecap |
---|
36 | hunk ./src/allmydata/test/test_cli.py 1583 |
---|
37 | |
---|
38 | return d |
---|
39 | |
---|
40 | + def test_cp_replaces_mutable_file_contents(self): |
---|
41 | + self.basedir = "cli/Cp/cp_replaces_mutable_file_contents" |
---|
42 | + self.set_up_grid() |
---|
43 | + |
---|
44 | + # Write a test file, which we'll copy to the grid. |
---|
45 | + test_txt_path = os.path.join(self.basedir, "test.txt") |
---|
46 | + test_txt_contents = "foo bar baz" |
---|
47 | + f = open(test_txt_path, "w") |
---|
48 | + f.write(test_txt_contents) |
---|
49 | + f.close() |
---|
50 | + |
---|
51 | + d = self.do_cli("create-alias", "tahoe") |
---|
52 | + d.addCallback(lambda ignored: |
---|
53 | + self.do_cli("mkdir", "tahoe:test")) |
---|
54 | + # We have to use 'tahoe put' here because 'tahoe cp' doesn't |
---|
55 | + # know how to make mutable files at the destination. |
---|
56 | + d.addCallback(lambda ignored: |
---|
57 | + self.do_cli("put", "--mutable", test_txt_path, "tahoe:test/test.txt")) |
---|
58 | + d.addCallback(lambda ignored: |
---|
59 | + self.do_cli("get", "tahoe:test/test.txt")) |
---|
60 | + def _check((rc, out, err)): |
---|
61 | + self.failUnlessEqual(rc, 0) |
---|
62 | + self.failUnlessEqual(out, test_txt_contents) |
---|
63 | + d.addCallback(_check) |
---|
64 | + |
---|
65 | + # We'll do ls --json to get the read uri and write uri for the |
---|
66 | + # file we've just uploaded. |
---|
67 | + d.addCallback(lambda ignored: |
---|
68 | + self.do_cli("ls", "--json", "tahoe:test/test.txt")) |
---|
69 | + def _get_test_txt_uris((rc, out, err)): |
---|
70 | + self.failUnlessEqual(rc, 0) |
---|
71 | + filetype, data = simplejson.loads(out) |
---|
72 | + |
---|
73 | + self.failUnlessEqual(filetype, "filenode") |
---|
74 | + self.failUnless(data['mutable']) |
---|
75 | + |
---|
76 | + self.failUnlessIn("rw_uri", data) |
---|
77 | + self.rw_uri = data["rw_uri"] |
---|
78 | + self.failUnlessIn("ro_uri", data) |
---|
79 | + self.ro_uri = data['ro_uri'] |
---|
80 | + d.addCallback(_get_test_txt_uris) |
---|
81 | + |
---|
82 | + # Now make a new file to copy in place of test.txt. |
---|
83 | + new_txt_path = os.path.join(self.basedir, "new.txt") |
---|
84 | + new_txt_contents = "baz bar foo" * 100000 |
---|
85 | + f = open(new_txt_path, "w") |
---|
86 | + f.write(new_txt_contents) |
---|
87 | + f.close() |
---|
88 | + |
---|
89 | + # Copy the new file on top of the old file. |
---|
90 | + d.addCallback(lambda ignored: |
---|
91 | + self.do_cli("cp", new_txt_path, "tahoe:test/test.txt")) |
---|
92 | + |
---|
93 | + # If we get test.txt now, we should see the new data. |
---|
94 | + d.addCallback(lambda ignored: |
---|
95 | + self.do_cli("get", "tahoe:test/test.txt")) |
---|
96 | + d.addCallback(lambda (rc, out, err): |
---|
97 | + self.failUnlessEqual(out, new_txt_contents)) |
---|
98 | + # If we get the json of the new file, we should see that the old |
---|
99 | + # uri is there |
---|
100 | + d.addCallback(lambda ignored: |
---|
101 | + self.do_cli("ls", "--json", "tahoe:test/test.txt")) |
---|
102 | + def _check_json((rc, out, err)): |
---|
103 | + self.failUnlessEqual(rc, 0) |
---|
104 | + filetype, data = simplejson.loads(out) |
---|
105 | + |
---|
106 | + self.failUnlessEqual(filetype, "filenode") |
---|
107 | + self.failUnless(data['mutable']) |
---|
108 | + |
---|
109 | + self.failUnlessIn("ro_uri", data) |
---|
110 | + self.failUnlessEqual(data["ro_uri"], self.ro_uri) |
---|
111 | + self.failUnlessIn("rw_uri", data) |
---|
112 | + self.failUnlessEqual(data['rw_uri'], self.rw_uri) |
---|
113 | + d.addCallback(_check_json) |
---|
114 | + |
---|
115 | + # and, finally, doing a GET directly on one of the old uris |
---|
116 | + # should give us the new contents. |
---|
117 | + d.addCallback(lambda ignored: |
---|
118 | + self.do_cli("get", self.rw_uri)) |
---|
119 | + d.addCallback(lambda (rc, out, err): |
---|
120 | + self.failUnlessEqual(out, new_txt_contents)) |
---|
121 | + # Now copy the old test.txt without an explicit destination |
---|
122 | + # file. tahoe cp will match it to the existing file and |
---|
123 | + # overwrite it appropriately. |
---|
124 | + d.addCallback(lambda ignored: |
---|
125 | + self.do_cli("cp", test_txt_path, "tahoe:test")) |
---|
126 | + d.addCallback(lambda ignored: |
---|
127 | + self.do_cli("get", "tahoe:test/test.txt")) |
---|
128 | + d.addCallback(lambda (rc, out, err): |
---|
129 | + self.failUnlessEqual(out, test_txt_contents)) |
---|
130 | + d.addCallback(lambda ignored: |
---|
131 | + self.do_cli("ls", "--json", "tahoe:test/test.txt")) |
---|
132 | + d.addCallback(_check_json) |
---|
133 | + d.addCallback(lambda ignored: |
---|
134 | + self.do_cli("get", self.rw_uri)) |
---|
135 | + d.addCallback(lambda (rc, out, err): |
---|
136 | + self.failUnlessEqual(out, test_txt_contents)) |
---|
137 | + |
---|
138 | + # Now we'll make a more complicated directory structure. |
---|
139 | + # test2/ |
---|
140 | + # test2/mutable1 |
---|
141 | + # test2/mutable2 |
---|
142 | + # test2/imm1 |
---|
143 | + # test2/imm2 |
---|
144 | + imm_test_txt_path = os.path.join(self.basedir, "imm_test.txt") |
---|
145 | + imm_test_txt_contents = test_txt_contents * 10000 |
---|
146 | + fileutil.write(imm_test_txt_path, imm_test_txt_contents) |
---|
147 | + d.addCallback(lambda ignored: |
---|
148 | + self.do_cli("mkdir", "tahoe:test2")) |
---|
149 | + d.addCallback(lambda ignored: |
---|
150 | + self.do_cli("put", "--mutable", new_txt_path, |
---|
151 | + "tahoe:test2/mutable1")) |
---|
152 | + d.addCallback(lambda ignored: |
---|
153 | + self.do_cli("put", "--mutable", new_txt_path, |
---|
154 | + "tahoe:test2/mutable2")) |
---|
155 | + d.addCallback(lambda ignored: |
---|
156 | + self.do_cli('put', new_txt_path, "tahoe:test2/imm1")) |
---|
157 | + d.addCallback(lambda ignored: |
---|
158 | + self.do_cli("put", imm_test_txt_path, "tahoe:test2/imm2")) |
---|
159 | + d.addCallback(lambda ignored: |
---|
160 | + self.do_cli("ls", "--json", "tahoe:test2")) |
---|
161 | + def _process_directory_json((rc, out, err)): |
---|
162 | + self.failUnlessEqual(rc, 0) |
---|
163 | + |
---|
164 | + filetype, data = simplejson.loads(out) |
---|
165 | + self.failUnlessEqual(filetype, "dirnode") |
---|
166 | + self.failUnless(data['mutable']) |
---|
167 | + self.failUnlessIn("children", data) |
---|
168 | + children = data['children'] |
---|
169 | + |
---|
170 | + # Store the URIs for later user. |
---|
171 | + self.childuris = {} |
---|
172 | + for k in ["mutable1", "mutable2", "imm1", "imm2"]: |
---|
173 | + self.failUnlessIn(k, children) |
---|
174 | + childtype, childdata = children[k] |
---|
175 | + self.failUnlessEqual(childtype, "filenode") |
---|
176 | + if "mutable" in k: |
---|
177 | + self.failUnless(childdata['mutable']) |
---|
178 | + self.failUnlessIn("rw_uri", childdata) |
---|
179 | + uri_key = "rw_uri" |
---|
180 | + else: |
---|
181 | + self.failIf(childdata['mutable']) |
---|
182 | + self.failUnlessIn("ro_uri", childdata) |
---|
183 | + uri_key = "ro_uri" |
---|
184 | + self.childuris[k] = childdata[uri_key] |
---|
185 | + d.addCallback(_process_directory_json) |
---|
186 | + # Now build a local directory to copy into place, like the following: |
---|
187 | + # source1/ |
---|
188 | + # source1/mutable1 |
---|
189 | + # source1/mutable2 |
---|
190 | + # source1/imm1 |
---|
191 | + # source1/imm3 |
---|
192 | + def _build_local_directory(ignored): |
---|
193 | + source1_path = os.path.join(self.basedir, "source1") |
---|
194 | + fileutil.make_dirs(source1_path) |
---|
195 | + for fn in ("mutable1", "mutable2", "imm1", "imm3"): |
---|
196 | + fileutil.write(os.path.join(source1_path, fn), fn * 1000) |
---|
197 | + self.source1_path = source1_path |
---|
198 | + d.addCallback(_build_local_directory) |
---|
199 | + d.addCallback(lambda ignored: |
---|
200 | + self.do_cli("cp", "-r", self.source1_path, "tahoe:test2")) |
---|
201 | + |
---|
202 | + # We expect that mutable1 and mutable2 are overwritten in-place, |
---|
203 | + # so they'll retain their URIs but have different content. |
---|
204 | + def _process_file_json((rc, out, err), fn): |
---|
205 | + self.failUnlessEqual(rc, 0) |
---|
206 | + filetype, data = simplejson.loads(out) |
---|
207 | + self.failUnlessEqual(filetype, "filenode") |
---|
208 | + |
---|
209 | + if "mutable" in fn: |
---|
210 | + self.failUnless(data['mutable']) |
---|
211 | + self.failUnlessIn("rw_uri", data) |
---|
212 | + self.failUnlessEqual(data["rw_uri"], self.childuris[fn]) |
---|
213 | + else: |
---|
214 | + self.failIf(data['mutable']) |
---|
215 | + self.failUnlessIn("ro_uri", data) |
---|
216 | + self.failIfEqual(data["ro_uri"], self.childuris[fn]) |
---|
217 | + |
---|
218 | + for fn in ("mutable1", "mutable2"): |
---|
219 | + d.addCallback(lambda ignored, fn=fn: |
---|
220 | + self.do_cli("get", "tahoe:test2/%s" % fn)) |
---|
221 | + d.addCallback(lambda (rc, out, err), fn=fn: |
---|
222 | + self.failUnlessEqual(out, fn * 1000)) |
---|
223 | + d.addCallback(lambda ignored, fn=fn: |
---|
224 | + self.do_cli("ls", "--json", "tahoe:test2/%s" % fn)) |
---|
225 | + d.addCallback(_process_file_json, fn=fn) |
---|
226 | + |
---|
227 | + # imm1 should have been replaced, so both its uri and content |
---|
228 | + # should be different. |
---|
229 | + d.addCallback(lambda ignored: |
---|
230 | + self.do_cli("get", "tahoe:test2/imm1")) |
---|
231 | + d.addCallback(lambda (rc, out, err): |
---|
232 | + self.failUnlessEqual(out, "imm1" * 1000)) |
---|
233 | + d.addCallback(lambda ignored: |
---|
234 | + self.do_cli("ls", "--json", "tahoe:test2/imm1")) |
---|
235 | + d.addCallback(_process_file_json, fn="imm1") |
---|
236 | + |
---|
237 | + # imm3 should have been created. |
---|
238 | + d.addCallback(lambda ignored: |
---|
239 | + self.do_cli("get", "tahoe:test2/imm3")) |
---|
240 | + d.addCallback(lambda (rc, out, err): |
---|
241 | + self.failUnlessEqual(out, "imm3" * 1000)) |
---|
242 | + |
---|
243 | + # imm2 should be exactly as we left it, since our newly-copied |
---|
244 | + # directory didn't contain an imm2 entry. |
---|
245 | + d.addCallback(lambda ignored: |
---|
246 | + self.do_cli("get", "tahoe:test2/imm2")) |
---|
247 | + d.addCallback(lambda (rc, out, err): |
---|
248 | + self.failUnlessEqual(out, imm_test_txt_contents)) |
---|
249 | + d.addCallback(lambda ignored: |
---|
250 | + self.do_cli("ls", "--json", "tahoe:test2/imm2")) |
---|
251 | + def _process_imm2_json((rc, out, err)): |
---|
252 | + self.failUnlessEqual(rc, 0) |
---|
253 | + filetype, data = simplejson.loads(out) |
---|
254 | + self.failUnlessEqual(filetype, "filenode") |
---|
255 | + self.failIf(data['mutable']) |
---|
256 | + self.failUnlessIn("ro_uri", data) |
---|
257 | + self.failUnlessEqual(data['ro_uri'], self.childuris["imm2"]) |
---|
258 | + d.addCallback(_process_imm2_json) |
---|
259 | + return d |
---|
260 | + |
---|
261 | + |
---|
262 | class Backup(GridTestMixin, CLITestMixin, StallMixin, unittest.TestCase): |
---|
263 | |
---|
264 | def writeto(self, path, data): |
---|
265 | } |
---|
266 | |
---|
267 | Context: |
---|
268 | |
---|
269 | [docs/man/tahoe.1: add man page. fixes #1420 |
---|
270 | david-sarah@jacaranda.org**20110724171728 |
---|
271 | Ignore-this: fc7601ec7f25494288d6141d0ae0004c |
---|
272 | ] |
---|
273 | [Update the dependency on zope.interface to fix an incompatiblity between Nevow and zope.interface 3.6.4. fixes #1435 |
---|
274 | david-sarah@jacaranda.org**20110721234941 |
---|
275 | Ignore-this: 2ff3fcfc030fca1a4d4c7f1fed0f2aa9 |
---|
276 | ] |
---|
277 | [frontends/ftpd.py: remove the check for IWriteFile.close since we're now guaranteed to be using Twisted >= 10.1 which has it. |
---|
278 | david-sarah@jacaranda.org**20110722000320 |
---|
279 | Ignore-this: 55cd558b791526113db3f83c00ec328a |
---|
280 | ] |
---|
281 | [Update the dependency on Twisted to >= 10.1. This allows us to simplify some documentation: it's no longer necessary to install pywin32 on Windows, or apply a patch to Twisted in order to use the FTP frontend. fixes #1274, #1438. refs #1429 |
---|
282 | david-sarah@jacaranda.org**20110721233658 |
---|
283 | Ignore-this: 81b41745477163c9b39c0b59db91cc62 |
---|
284 | ] |
---|
285 | [misc/build_helpers/run_trial.py: undo change to block pywin32 (it didn't work because run_trial.py is no longer used). refs #1334 |
---|
286 | david-sarah@jacaranda.org**20110722035402 |
---|
287 | Ignore-this: 5d03f544c4154f088e26c7107494bf39 |
---|
288 | ] |
---|
289 | [misc/build_helpers/run_trial.py: ensure that pywin32 is not on the sys.path when running the test suite. Includes some temporary debugging printouts that will be removed. refs #1334 |
---|
290 | david-sarah@jacaranda.org**20110722024907 |
---|
291 | Ignore-this: 5141a9f83a4085ed4ca21f0bbb20bb9c |
---|
292 | ] |
---|
293 | [docs/running.rst: use 'tahoe run ~/.tahoe' instead of 'tahoe run' (the default is the current directory, unlike 'tahoe start'). |
---|
294 | david-sarah@jacaranda.org**20110718005949 |
---|
295 | Ignore-this: 81837fbce073e93d88a3e7ae3122458c |
---|
296 | ] |
---|
297 | [docs/running.rst: say to put the introducer.furl in tahoe.cfg. |
---|
298 | david-sarah@jacaranda.org**20110717194315 |
---|
299 | Ignore-this: 954cc4c08e413e8c62685d58ff3e11f3 |
---|
300 | ] |
---|
301 | [README.txt: say that quickstart.rst is in the docs directory. |
---|
302 | david-sarah@jacaranda.org**20110717192400 |
---|
303 | Ignore-this: bc6d35a85c496b77dbef7570677ea42a |
---|
304 | ] |
---|
305 | [setup: remove the dependency on foolscap's "secure_connections" extra, add a dependency on pyOpenSSL |
---|
306 | zooko@zooko.com**20110717114226 |
---|
307 | Ignore-this: df222120d41447ce4102616921626c82 |
---|
308 | fixes #1383 |
---|
309 | ] |
---|
310 | [test_sftp.py cleanup: remove a redundant definition of failUnlessReallyEqual. |
---|
311 | david-sarah@jacaranda.org**20110716181813 |
---|
312 | Ignore-this: 50113380b368c573f07ac6fe2eb1e97f |
---|
313 | ] |
---|
314 | [docs: add missing link in NEWS.rst |
---|
315 | zooko@zooko.com**20110712153307 |
---|
316 | Ignore-this: be7b7eb81c03700b739daa1027d72b35 |
---|
317 | ] |
---|
318 | [contrib: remove the contributed fuse modules and the entire contrib/ directory, which is now empty |
---|
319 | zooko@zooko.com**20110712153229 |
---|
320 | Ignore-this: 723c4f9e2211027c79d711715d972c5 |
---|
321 | Also remove a couple of vestigial references to figleaf, which is long gone. |
---|
322 | fixes #1409 (remove contrib/fuse) |
---|
323 | ] |
---|
324 | [add Protovis.js-based download-status timeline visualization |
---|
325 | Brian Warner <warner@lothar.com>**20110629222606 |
---|
326 | Ignore-this: 477ccef5c51b30e246f5b6e04ab4a127 |
---|
327 | |
---|
328 | provide status overlap info on the webapi t=json output, add decode/decrypt |
---|
329 | rate tooltips, add zoomin/zoomout buttons |
---|
330 | ] |
---|
331 | [add more download-status data, fix tests |
---|
332 | Brian Warner <warner@lothar.com>**20110629222555 |
---|
333 | Ignore-this: e9e0b7e0163f1e95858aa646b9b17b8c |
---|
334 | ] |
---|
335 | [prepare for viz: improve DownloadStatus events |
---|
336 | Brian Warner <warner@lothar.com>**20110629222542 |
---|
337 | Ignore-this: 16d0bde6b734bb501aa6f1174b2b57be |
---|
338 | |
---|
339 | consolidate IDownloadStatusHandlingConsumer stuff into DownloadNode |
---|
340 | ] |
---|
341 | [docs: fix error in crypto specification that was noticed by Taylor R Campbell <campbell+tahoe@mumble.net> |
---|
342 | zooko@zooko.com**20110629185711 |
---|
343 | Ignore-this: b921ed60c1c8ba3c390737fbcbe47a67 |
---|
344 | ] |
---|
345 | [setup.py: don't make bin/tahoe.pyscript executable. fixes #1347 |
---|
346 | david-sarah@jacaranda.org**20110130235809 |
---|
347 | Ignore-this: 3454c8b5d9c2c77ace03de3ef2d9398a |
---|
348 | ] |
---|
349 | [Makefile: remove targets relating to 'setup.py check_auto_deps' which no longer exists. fixes #1345 |
---|
350 | david-sarah@jacaranda.org**20110626054124 |
---|
351 | Ignore-this: abb864427a1b91bd10d5132b4589fd90 |
---|
352 | ] |
---|
353 | [Makefile: add 'make check' as an alias for 'make test'. Also remove an unnecessary dependency of 'test' on 'build' and 'src/allmydata/_version.py'. fixes #1344 |
---|
354 | david-sarah@jacaranda.org**20110623205528 |
---|
355 | Ignore-this: c63e23146c39195de52fb17c7c49b2da |
---|
356 | ] |
---|
357 | [Rename test_package_initialization.py to (much shorter) test_import.py . |
---|
358 | Brian Warner <warner@lothar.com>**20110611190234 |
---|
359 | Ignore-this: 3eb3dbac73600eeff5cfa6b65d65822 |
---|
360 | |
---|
361 | The former name was making my 'ls' listings hard to read, by forcing them |
---|
362 | down to just two columns. |
---|
363 | ] |
---|
364 | [tests: fix tests to accomodate [20110611153758-92b7f-0ba5e4726fb6318dac28fb762a6512a003f4c430] |
---|
365 | zooko@zooko.com**20110611163741 |
---|
366 | Ignore-this: 64073a5f39e7937e8e5e1314c1a302d1 |
---|
367 | Apparently none of the two authors (stercor, terrell), three reviewers (warner, davidsarah, terrell), or one committer (me) actually ran the tests. This is presumably due to #20. |
---|
368 | fixes #1412 |
---|
369 | ] |
---|
370 | [wui: right-align the size column in the WUI |
---|
371 | zooko@zooko.com**20110611153758 |
---|
372 | Ignore-this: 492bdaf4373c96f59f90581c7daf7cd7 |
---|
373 | Thanks to Ted "stercor" Rolle Jr. and Terrell Russell. |
---|
374 | fixes #1412 |
---|
375 | ] |
---|
376 | [docs: three minor fixes |
---|
377 | zooko@zooko.com**20110610121656 |
---|
378 | Ignore-this: fec96579eb95aceb2ad5fc01a814c8a2 |
---|
379 | CREDITS for arc for stats tweak |
---|
380 | fix link to .zip file in quickstart.rst (thanks to ChosenOne for noticing) |
---|
381 | English usage tweak |
---|
382 | ] |
---|
383 | [docs/running.rst: fix stray HTML (not .rst) link noticed by ChosenOne. |
---|
384 | david-sarah@jacaranda.org**20110609223719 |
---|
385 | Ignore-this: fc50ac9c94792dcac6f1067df8ac0d4a |
---|
386 | ] |
---|
387 | [server.py: get_latencies now reports percentiles _only_ if there are sufficient observations for the interpretation of the percentile to be unambiguous. |
---|
388 | wilcoxjg@gmail.com**20110527120135 |
---|
389 | Ignore-this: 2e7029764bffc60e26f471d7c2b6611e |
---|
390 | interfaces.py: modified the return type of RIStatsProvider.get_stats to allow for None as a return value |
---|
391 | NEWS.rst, stats.py: documentation of change to get_latencies |
---|
392 | stats.rst: now documents percentile modification in get_latencies |
---|
393 | test_storage.py: test_latencies now expects None in output categories that contain too few samples for the associated percentile to be unambiguously reported. |
---|
394 | fixes #1392 |
---|
395 | ] |
---|
396 | [docs: revert link in relnotes.txt from NEWS.rst to NEWS, since the former did not exist at revision 5000. |
---|
397 | david-sarah@jacaranda.org**20110517011214 |
---|
398 | Ignore-this: 6a5be6e70241e3ec0575641f64343df7 |
---|
399 | ] |
---|
400 | [docs: convert NEWS to NEWS.rst and change all references to it. |
---|
401 | david-sarah@jacaranda.org**20110517010255 |
---|
402 | Ignore-this: a820b93ea10577c77e9c8206dbfe770d |
---|
403 | ] |
---|
404 | [docs: remove out-of-date docs/testgrid/introducer.furl and containing directory. fixes #1404 |
---|
405 | david-sarah@jacaranda.org**20110512140559 |
---|
406 | Ignore-this: 784548fc5367fac5450df1c46890876d |
---|
407 | ] |
---|
408 | [scripts/common.py: don't assume that the default alias is always 'tahoe' (it is, but the API of get_alias doesn't say so). refs #1342 |
---|
409 | david-sarah@jacaranda.org**20110130164923 |
---|
410 | Ignore-this: a271e77ce81d84bb4c43645b891d92eb |
---|
411 | ] |
---|
412 | [setup: don't catch all Exception from check_requirement(), but only PackagingError and ImportError |
---|
413 | zooko@zooko.com**20110128142006 |
---|
414 | Ignore-this: 57d4bc9298b711e4bc9dc832c75295de |
---|
415 | I noticed this because I had accidentally inserted a bug which caused AssertionError to be raised from check_requirement(). |
---|
416 | ] |
---|
417 | [M-x whitespace-cleanup |
---|
418 | zooko@zooko.com**20110510193653 |
---|
419 | Ignore-this: dea02f831298c0f65ad096960e7df5c7 |
---|
420 | ] |
---|
421 | [docs: fix typo in running.rst, thanks to arch_o_median |
---|
422 | zooko@zooko.com**20110510193633 |
---|
423 | Ignore-this: ca06de166a46abbc61140513918e79e8 |
---|
424 | ] |
---|
425 | [relnotes.txt: don't claim to work on Cygwin (which has been untested for some time). refs #1342 |
---|
426 | david-sarah@jacaranda.org**20110204204902 |
---|
427 | Ignore-this: 85ef118a48453d93fa4cddc32d65b25b |
---|
428 | ] |
---|
429 | [relnotes.txt: forseeable -> foreseeable. refs #1342 |
---|
430 | david-sarah@jacaranda.org**20110204204116 |
---|
431 | Ignore-this: 746debc4d82f4031ebf75ab4031b3a9 |
---|
432 | ] |
---|
433 | [replace remaining .html docs with .rst docs |
---|
434 | zooko@zooko.com**20110510191650 |
---|
435 | Ignore-this: d557d960a986d4ac8216d1677d236399 |
---|
436 | Remove install.html (long since deprecated). |
---|
437 | Also replace some obsolete references to install.html with references to quickstart.rst. |
---|
438 | Fix some broken internal references within docs/historical/historical_known_issues.txt. |
---|
439 | Thanks to Ravi Pinjala and Patrick McDonald. |
---|
440 | refs #1227 |
---|
441 | ] |
---|
442 | [docs: FTP-and-SFTP.rst: fix a minor error and update the information about which version of Twisted fixes #1297 |
---|
443 | zooko@zooko.com**20110428055232 |
---|
444 | Ignore-this: b63cfb4ebdbe32fb3b5f885255db4d39 |
---|
445 | ] |
---|
446 | [munin tahoe_files plugin: fix incorrect file count |
---|
447 | francois@ctrlaltdel.ch**20110428055312 |
---|
448 | Ignore-this: 334ba49a0bbd93b4a7b06a25697aba34 |
---|
449 | fixes #1391 |
---|
450 | ] |
---|
451 | [corrected "k must never be smaller than N" to "k must never be greater than N" |
---|
452 | secorp@allmydata.org**20110425010308 |
---|
453 | Ignore-this: 233129505d6c70860087f22541805eac |
---|
454 | ] |
---|
455 | [Fix a test failure in test_package_initialization on Python 2.4.x due to exceptions being stringified differently than in later versions of Python. refs #1389 |
---|
456 | david-sarah@jacaranda.org**20110411190738 |
---|
457 | Ignore-this: 7847d26bc117c328c679f08a7baee519 |
---|
458 | ] |
---|
459 | [tests: add test for including the ImportError message and traceback entry in the summary of errors from importing dependencies. refs #1389 |
---|
460 | david-sarah@jacaranda.org**20110410155844 |
---|
461 | Ignore-this: fbecdbeb0d06a0f875fe8d4030aabafa |
---|
462 | ] |
---|
463 | [allmydata/__init__.py: preserve the message and last traceback entry (file, line number, function, and source line) of ImportErrors in the package versions string. fixes #1389 |
---|
464 | david-sarah@jacaranda.org**20110410155705 |
---|
465 | Ignore-this: 2f87b8b327906cf8bfca9440a0904900 |
---|
466 | ] |
---|
467 | [remove unused variable detected by pyflakes |
---|
468 | zooko@zooko.com**20110407172231 |
---|
469 | Ignore-this: 7344652d5e0720af822070d91f03daf9 |
---|
470 | ] |
---|
471 | [allmydata/__init__.py: Nicer reporting of unparseable version numbers in dependencies. fixes #1388 |
---|
472 | david-sarah@jacaranda.org**20110401202750 |
---|
473 | Ignore-this: 9c6bd599259d2405e1caadbb3e0d8c7f |
---|
474 | ] |
---|
475 | [update FTP-and-SFTP.rst: the necessary patch is included in Twisted-10.1 |
---|
476 | Brian Warner <warner@lothar.com>**20110325232511 |
---|
477 | Ignore-this: d5307faa6900f143193bfbe14e0f01a |
---|
478 | ] |
---|
479 | [control.py: remove all uses of s.get_serverid() |
---|
480 | warner@lothar.com**20110227011203 |
---|
481 | Ignore-this: f80a787953bd7fa3d40e828bde00e855 |
---|
482 | ] |
---|
483 | [web: remove some uses of s.get_serverid(), not all |
---|
484 | warner@lothar.com**20110227011159 |
---|
485 | Ignore-this: a9347d9cf6436537a47edc6efde9f8be |
---|
486 | ] |
---|
487 | [immutable/downloader/fetcher.py: remove all get_serverid() calls |
---|
488 | warner@lothar.com**20110227011156 |
---|
489 | Ignore-this: fb5ef018ade1749348b546ec24f7f09a |
---|
490 | ] |
---|
491 | [immutable/downloader/fetcher.py: fix diversity bug in server-response handling |
---|
492 | warner@lothar.com**20110227011153 |
---|
493 | Ignore-this: bcd62232c9159371ae8a16ff63d22c1b |
---|
494 | |
---|
495 | When blocks terminate (either COMPLETE or CORRUPT/DEAD/BADSEGNUM), the |
---|
496 | _shares_from_server dict was being popped incorrectly (using shnum as the |
---|
497 | index instead of serverid). I'm still thinking through the consequences of |
---|
498 | this bug. It was probably benign and really hard to detect. I think it would |
---|
499 | cause us to incorrectly believe that we're pulling too many shares from a |
---|
500 | server, and thus prefer a different server rather than asking for a second |
---|
501 | share from the first server. The diversity code is intended to spread out the |
---|
502 | number of shares simultaneously being requested from each server, but with |
---|
503 | this bug, it might be spreading out the total number of shares requested at |
---|
504 | all, not just simultaneously. (note that SegmentFetcher is scoped to a single |
---|
505 | segment, so the effect doesn't last very long). |
---|
506 | ] |
---|
507 | [immutable/downloader/share.py: reduce get_serverid(), one left, update ext deps |
---|
508 | warner@lothar.com**20110227011150 |
---|
509 | Ignore-this: d8d56dd8e7b280792b40105e13664554 |
---|
510 | |
---|
511 | test_download.py: create+check MyShare instances better, make sure they share |
---|
512 | Server objects, now that finder.py cares |
---|
513 | ] |
---|
514 | [immutable/downloader/finder.py: reduce use of get_serverid(), one left |
---|
515 | warner@lothar.com**20110227011146 |
---|
516 | Ignore-this: 5785be173b491ae8a78faf5142892020 |
---|
517 | ] |
---|
518 | [immutable/offloaded.py: reduce use of get_serverid() a bit more |
---|
519 | warner@lothar.com**20110227011142 |
---|
520 | Ignore-this: b48acc1b2ae1b311da7f3ba4ffba38f |
---|
521 | ] |
---|
522 | [immutable/upload.py: reduce use of get_serverid() |
---|
523 | warner@lothar.com**20110227011138 |
---|
524 | Ignore-this: ffdd7ff32bca890782119a6e9f1495f6 |
---|
525 | ] |
---|
526 | [immutable/checker.py: remove some uses of s.get_serverid(), not all |
---|
527 | warner@lothar.com**20110227011134 |
---|
528 | Ignore-this: e480a37efa9e94e8016d826c492f626e |
---|
529 | ] |
---|
530 | [add remaining get_* methods to storage_client.Server, NoNetworkServer, and |
---|
531 | warner@lothar.com**20110227011132 |
---|
532 | Ignore-this: 6078279ddf42b179996a4b53bee8c421 |
---|
533 | MockIServer stubs |
---|
534 | ] |
---|
535 | [upload.py: rearrange _make_trackers a bit, no behavior changes |
---|
536 | warner@lothar.com**20110227011128 |
---|
537 | Ignore-this: 296d4819e2af452b107177aef6ebb40f |
---|
538 | ] |
---|
539 | [happinessutil.py: finally rename merge_peers to merge_servers |
---|
540 | warner@lothar.com**20110227011124 |
---|
541 | Ignore-this: c8cd381fea1dd888899cb71e4f86de6e |
---|
542 | ] |
---|
543 | [test_upload.py: factor out FakeServerTracker |
---|
544 | warner@lothar.com**20110227011120 |
---|
545 | Ignore-this: 6c182cba90e908221099472cc159325b |
---|
546 | ] |
---|
547 | [test_upload.py: server-vs-tracker cleanup |
---|
548 | warner@lothar.com**20110227011115 |
---|
549 | Ignore-this: 2915133be1a3ba456e8603885437e03 |
---|
550 | ] |
---|
551 | [happinessutil.py: server-vs-tracker cleanup |
---|
552 | warner@lothar.com**20110227011111 |
---|
553 | Ignore-this: b856c84033562d7d718cae7cb01085a9 |
---|
554 | ] |
---|
555 | [upload.py: more tracker-vs-server cleanup |
---|
556 | warner@lothar.com**20110227011107 |
---|
557 | Ignore-this: bb75ed2afef55e47c085b35def2de315 |
---|
558 | ] |
---|
559 | [upload.py: fix var names to avoid confusion between 'trackers' and 'servers' |
---|
560 | warner@lothar.com**20110227011103 |
---|
561 | Ignore-this: 5d5e3415b7d2732d92f42413c25d205d |
---|
562 | ] |
---|
563 | [refactor: s/peer/server/ in immutable/upload, happinessutil.py, test_upload |
---|
564 | warner@lothar.com**20110227011100 |
---|
565 | Ignore-this: 7ea858755cbe5896ac212a925840fe68 |
---|
566 | |
---|
567 | No behavioral changes, just updating variable/method names and log messages. |
---|
568 | The effects outside these three files should be minimal: some exception |
---|
569 | messages changed (to say "server" instead of "peer"), and some internal class |
---|
570 | names were changed. A few things still use "peer" to minimize external |
---|
571 | changes, like UploadResults.timings["peer_selection"] and |
---|
572 | happinessutil.merge_peers, which can be changed later. |
---|
573 | ] |
---|
574 | [storage_client.py: clean up test_add_server/test_add_descriptor, remove .test_servers |
---|
575 | warner@lothar.com**20110227011056 |
---|
576 | Ignore-this: efad933e78179d3d5fdcd6d1ef2b19cc |
---|
577 | ] |
---|
578 | [test_client.py, upload.py:: remove KiB/MiB/etc constants, and other dead code |
---|
579 | warner@lothar.com**20110227011051 |
---|
580 | Ignore-this: dc83c5794c2afc4f81e592f689c0dc2d |
---|
581 | ] |
---|
582 | [test: increase timeout on a network test because Francois's ARM machine hit that timeout |
---|
583 | zooko@zooko.com**20110317165909 |
---|
584 | Ignore-this: 380c345cdcbd196268ca5b65664ac85b |
---|
585 | I'm skeptical that the test was proceeding correctly but ran out of time. It seems more likely that it had gotten hung. But if we raise the timeout to an even more extravagant number then we can be even more certain that the test was never going to finish. |
---|
586 | ] |
---|
587 | [docs/configuration.rst: add a "Frontend Configuration" section |
---|
588 | Brian Warner <warner@lothar.com>**20110222014323 |
---|
589 | Ignore-this: 657018aa501fe4f0efef9851628444ca |
---|
590 | |
---|
591 | this points to docs/frontends/*.rst, which were previously underlinked |
---|
592 | ] |
---|
593 | [web/filenode.py: avoid calling req.finish() on closed HTTP connections. Closes #1366 |
---|
594 | "Brian Warner <warner@lothar.com>"**20110221061544 |
---|
595 | Ignore-this: 799d4de19933f2309b3c0c19a63bb888 |
---|
596 | ] |
---|
597 | [Add unit tests for cross_check_pkg_resources_versus_import, and a regression test for ref #1355. This requires a little refactoring to make it testable. |
---|
598 | david-sarah@jacaranda.org**20110221015817 |
---|
599 | Ignore-this: 51d181698f8c20d3aca58b057e9c475a |
---|
600 | ] |
---|
601 | [allmydata/__init__.py: .name was used in place of the correct .__name__ when printing an exception. Also, robustify string formatting by using %r instead of %s in some places. fixes #1355. |
---|
602 | david-sarah@jacaranda.org**20110221020125 |
---|
603 | Ignore-this: b0744ed58f161bf188e037bad077fc48 |
---|
604 | ] |
---|
605 | [Refactor StorageFarmBroker handling of servers |
---|
606 | Brian Warner <warner@lothar.com>**20110221015804 |
---|
607 | Ignore-this: 842144ed92f5717699b8f580eab32a51 |
---|
608 | |
---|
609 | Pass around IServer instance instead of (peerid, rref) tuple. Replace |
---|
610 | "descriptor" with "server". Other replacements: |
---|
611 | |
---|
612 | get_all_servers -> get_connected_servers/get_known_servers |
---|
613 | get_servers_for_index -> get_servers_for_psi (now returns IServers) |
---|
614 | |
---|
615 | This change still needs to be pushed further down: lots of code is now |
---|
616 | getting the IServer and then distributing (peerid, rref) internally. |
---|
617 | Instead, it ought to distribute the IServer internally and delay |
---|
618 | extracting a serverid or rref until the last moment. |
---|
619 | |
---|
620 | no_network.py was updated to retain parallelism. |
---|
621 | ] |
---|
622 | [TAG allmydata-tahoe-1.8.2 |
---|
623 | warner@lothar.com**20110131020101] |
---|
624 | Patch bundle hash: |
---|
625 | 3f9ae680c4e76f9b3535e74451dd3973ab95035a |
---|