1 patch for repository zooko@tahoe-lafs.org:/home/source/darcs/tahoe-lafs/trunk: Wed Aug 18 09:43:52 MDT 2010 zooko@zooko.com * debuggery: log every event that touches Share._received (a DataSpans object) New patches: [debuggery: log every event that touches Share._received (a DataSpans object) zooko@zooko.com**20100818154352 Ignore-this: 74e39ac674fd4ee4667bc011857ed137 ] { hunk ./src/allmydata/immutable/downloader/share.py 61 self._pending = Spans() # request sent but no response received yet self._received = DataSpans() # ACK response received, with data + log.msg("%s __init__() _received spans trace = DataSpans()" % (repr(self),), level=log.CURIOUS) # _received spans trace self._unavailable = Spans() # NAK response received, no data # any given byte of the share can be in one of four states: hunk ./src/allmydata/immutable/downloader/share.py 200 self._pending.dump(), self._received.dump(), self._unavailable.dump() ), level=log.NOISY, parent=self._lp, umid="BaL1zw") + log.msg("%s loop() 0 _received spans trace .dump()" % (repr(self),), level=log.CURIOUS) # received spans trace self._do_loop() # all exception cases call self._fail(), which clears self._alive except (BadHashError, NotEnoughHashesError, LayoutInvalid), e: hunk ./src/allmydata/immutable/downloader/share.py 228 self._pending.dump(), self._received.dump(), self._unavailable.dump() ), level=log.UNUSUAL, parent=self._lp, umid="F7yJnQ") + log.msg("%s loop() 1 _received spans trace .dump()" % (repr(self),), level=log.CURIOUS) # received spans trace self._fail(Failure(e), log.UNUSUAL) except BaseException: self._fail(Failure()) hunk ./src/allmydata/immutable/downloader/share.py 240 self._pending.dump(), self._received.dump(), self._unavailable.dump() ), level=log.NOISY, parent=self._lp, umid="9lRaRA") + log.msg("%s loop 2 _received spans trace .dump()" % (repr(self),), level=log.CURIOUS) # received spans trace def _do_loop(self): # we are (eventually) called after all state transitions: hunk ./src/allmydata/immutable/downloader/share.py 337 def _satisfy_offsets(self): version_s = self._received.get(0, 4) + log.msg("%s _satisfy_offsets _received spans trace .get(0, 4)" % (repr(self),), level=log.CURIOUS) # received spans trace if version_s is None: return False (version,) = struct.unpack(">L", version_s) hunk ./src/allmydata/immutable/downloader/share.py 355 % version) offset_table_size = 6 * self._fieldsize table_s = self._received.pop(table_start, offset_table_size) + log.msg("%s _satisfy_offsets _received spans trace .pop(%s, %s)" % (repr(self), table_start, offset_table_size), level=log.CURIOUS) # received spans trace if table_s is None: return False fields = struct.unpack(">"+6*self._fieldstruct, table_s) hunk ./src/allmydata/immutable/downloader/share.py 371 self.actual_offsets = offsets log.msg("actual offsets: data=%d, plaintext_hash_tree=%d, crypttext_hash_tree=%d, block_hashes=%d, share_hashes=%d, uri_extension=%d" % tuple(fields)) self._received.remove(0, 4) # don't need this anymore + log.msg("%s _satisfy_offsets _received spans trace .remove(%s, %s)" % (repr(self), 0, 4), level=log.CURIOUS) # received spans trace # validate the offsets a bit share_hashes_size = offsets["uri_extension"] - offsets["share_hashes"] hunk ./src/allmydata/immutable/downloader/share.py 398 o = self.actual_offsets fsize = self._fieldsize UEB_length_s = self._received.get(o["uri_extension"], fsize) + log.msg("%s _satisfy_UEB _received spans trace .get(%s, %s)" % (repr(self), o["uri_extension"], fsize), level=log.CURIOUS) # received spans trace if not UEB_length_s: return False (UEB_length,) = struct.unpack(">"+self._fieldstruct, UEB_length_s) hunk ./src/allmydata/immutable/downloader/share.py 403 UEB_s = self._received.pop(o["uri_extension"]+fsize, UEB_length) + log.msg("%s _satisfy_UEB _received spans trace .pop(%s, %s)" % (repr(self), o["uri_extension"]+fsize, UEB_length), level=log.CURIOUS) # received spans trace if not UEB_s: return False self._received.remove(o["uri_extension"], fsize) hunk ./src/allmydata/immutable/downloader/share.py 407 + log.msg("%s _satisfy_UEB _received spans trace .remove(%s, %s)" % (repr(self), o["uri_extension"], fsize), level=log.CURIOUS) # received spans trace try: self._node.validate_and_store_UEB(UEB_s) return True hunk ./src/allmydata/immutable/downloader/share.py 429 hashlen = o["uri_extension"] - o["share_hashes"] assert hashlen % (2+HASH_SIZE) == 0 hashdata = self._received.get(o["share_hashes"], hashlen) + log.msg("%s _satisfy_UEB _received spans trace .get(%s, %s)" % (repr(self), o["share_hashes"], hashlen), level=log.CURIOUS) # received spans trace if not hashdata: return False share_hashes = {} hunk ./src/allmydata/immutable/downloader/share.py 454 self.had_corruption = True raise self._received.remove(o["share_hashes"], hashlen) + log.msg("%s _satisfy_share_hash_tree _received spans trace .remove(%s, %s)" % (repr(self), o["share_hashes"], hashlen), level=log.CURIOUS) # received spans trace return True def _signal_corruption(self, f, start, offset): hunk ./src/allmydata/immutable/downloader/share.py 468 block_hashes = {} for hashnum in needed_hashes: hashdata = self._received.get(o_bh+hashnum*HASH_SIZE, HASH_SIZE) + log.msg("%s _satisfy_block_hash_tree _received spans trace .get(%s, %s)" % (repr(self), o_bh+hashnum*HASH_SIZE, HASH_SIZE), level=log.CURIOUS) # received spans trace if hashdata: block_hashes[hashnum] = hashdata else: hunk ./src/allmydata/immutable/downloader/share.py 492 raise for hashnum in needed_hashes: self._received.remove(o_bh+hashnum*HASH_SIZE, HASH_SIZE) + log.msg("%s _satisfy_block_hash_tree _received spans trace .remove(%s, %s)" % (repr(self), o_bh+hashnum*HASH_SIZE, HASH_SIZE), level=log.CURIOUS) # received spans trace return True def _satisfy_ciphertext_hash_tree(self, needed_hashes): hunk ./src/allmydata/immutable/downloader/share.py 500 hashes = {} for hashnum in needed_hashes: hashdata = self._received.get(start+hashnum*HASH_SIZE, HASH_SIZE) + log.msg("%s _satisfy_ciphertext_hash_tree _received spans trace .get(%s, %s)" % (repr(self), start+hashnum*HASH_SIZE, HASH_SIZE), level=log.CURIOUS) # received spans trace if hashdata: hashes[hashnum] = hashdata else: hunk ./src/allmydata/immutable/downloader/share.py 522 raise for hashnum in needed_hashes: self._received.remove(start+hashnum*HASH_SIZE, HASH_SIZE) + log.msg("%s _satisfy_ciphertext_hash_tree _received spans trace .remove(%s, %s)" % (repr(self), start+hashnum*HASH_SIZE, HASH_SIZE), level=log.CURIOUS) # received spans trace return True def _satisfy_data_block(self, segnum, observers): hunk ./src/allmydata/immutable/downloader/share.py 534 blocklen = self._node.tail_block_size block = self._received.pop(blockstart, blocklen) + log.msg("%s _satisfy_data_block _received spans trace .pop(%s, %s)" % (repr(self), blockstart, blocklen), level=log.CURIOUS) # received spans trace if not block: log.msg("no data for block %s (want [%d:+%d])" % (repr(self), blockstart, blocklen)) hunk ./src/allmydata/immutable/downloader/share.py 647 gotta_gotta_have_it.add(0, 4) # version number, always safe version_s = self._received.get(0, 4) + log.msg("%s _desire_offsets _received spans trace .get(%s, %s)" % (repr(self), 0, 4), level=log.CURIOUS) # received spans trace if not version_s: return (version,) = struct.unpack(">L", version_s) hunk ./src/allmydata/immutable/downloader/share.py 683 if not self.actual_offsets: return UEB_length_s = self._received.get(o["uri_extension"], self._fieldsize) + log.msg("%s _desire_UEB _received spans trace .get(%s, %s)" % (repr(self), o["uri_extension"], self._fieldsize), level=log.CURIOUS) # received spans trace if UEB_length_s: (UEB_length,) = struct.unpack(">"+self._fieldstruct, UEB_length_s) # we know the length, so make sure we grab everything hunk ./src/allmydata/immutable/downloader/share.py 719 def _send_requests(self, desired): ask = desired - self._pending - self._received.get_spans() + log.msg("%s _send_requests _received spans trace .get_spans()" % (repr(self),), level=log.CURIOUS) # received spans trace log.msg("%s._send_requests, desired=%s, pending=%s, ask=%s" % (repr(self), desired.dump(), self._pending.dump(), ask.dump()), level=log.NOISY, parent=self._lp, umid="E94CVA") hunk ./src/allmydata/immutable/downloader/share.py 762 level=log.NOISY, parent=lp, umid="5Qn6VQ") self._pending.remove(start, length) self._received.add(start, data) + log.msg("%s _got_data _received spans trace .add(%s, len=%s)" % (repr(self), start, len(data)), level=log.CURIOUS) # received spans trace # if we ask for [a:c], and we get back [a:b] (b