[mnet-devel] patch: blockwrangler bugfix and assertions
Zooko O'Whielacronx
zooko at zooko.com
Tue Feb 17 17:35:23 GMT 2004
This patch fixes on thing that is probably a bug in blockwrangler -- with this
patch blocks are removed from peerclaimedblocks when a "request block" resolves.
This patch also adds a bunch of assertions intended to flush out other bugs in
blockwrangler. These assertions might cause unnecessary exceptions, but as long
as you are running with assertion-checking turned off, they can't hurt.
--- common/BlockWrangler.py 7 Dec 2003 17:35:50 -0000 1.94
+++ common/BlockWrangler.py 17 Feb 2004 17:26:08 -0000
@@ -303,6 +303,7 @@ class BlockWrangler(nummedobj.NummedObj)
self.data.remove_Ids_of_located_blocks(peerId, blockIds=queryblockIds)
# Tell the strategy to wake up -- there are new results to consider! (Even failure is a new result to consider.)
+ assert self._assert_consistency()
self.strategy.schedule_event()
def _handle_timely_look_for_blocks_result(widget, outcome, failure_reason=None, _handle_look_for_blocks_result=_handle_look_for_blocks_result, peerId=peerId, self=self):
@@ -357,12 +358,13 @@ class BlockWrangler(nummedobj.NummedObj)
assert self.data._assert_consistency()
# No matter what comes out of this reply, we are removing this blockId/peerId pair from the located-blocks data. (Because either this result means that we now have the block, or it means that the peer does not have the block!)
self.data.remove_Ids_of_located_blocks(peerId, blockIds=(blockId,))
+ assert self.data.peerclaimedblock.has_key((peerId, blockId,))
+ self.data.peerclaimedblock.del_if_present((peerId, blockId,))
if failure_reason or (outcome['result'] != "success"):
# Inform reliability handicapper that this was actually a failure.
self.mtm._keeper.get_counterparty_object(peerId).decrement_reliability()
# Wake the block wrangling strategy -- failure to retrieve a block is the kind of thing that it might want to respond to.
self.strategy.schedule_event()
- # XXX should we update the peerclaimedblocks struct here?! --Zooko 2002-12-01
else:
self._handle_block(blockId, outcome['data'], peerId)
@@ -653,9 +655,11 @@ class BlockWranglerData(nummedobj.Nummed
# For each (peerId, blockId,) tuple in peerclaimedblock, if the peer *has*
# claimed the block, then the blockId must appear in bId2peers[blockId],
# and if the peer has claimed *not* to have the block then the blockId
- # must *not* appear in bId2peers[blockId].
+ # must *not* appear in bId2peers[blockId]. For each blockId in
+ # peerclaimedblock, we must currently be wanting that block.
for ((peerId, blockId,), claim,) in self.peerclaimedblock.items():
assert (claim == 1) == (peerId in self.bId2peers.get(blockId, ()))
+ assert self.Idsofwantedblocks.has_key(blockId)
# For each peer which is pointed to by a blockId in bId2peers,
# peerclaimedblock[(peer, blockId,)] must equal 1.
@@ -799,7 +795,7 @@ class BlockWranglerData(nummedobj.Nummed
"""
@precondition: We are required to currently *not* be wanting each of these blocks.: len(filter(lambda x, self=selfXC self.Idsofwantedblocks.has_key(x), blockIds)) == 0
"""
- assert len(filter(lambda x, self=self: self.Idsofwantedblocks.has_key(x), blockIds)) == 0, "precondition: We are required to currently *not* be wanting each of these blocks."
+ assert len(filter(lambda x, self=self: self.Idsofwantedblocks.has_key(x), blockIds)) == 0, "precondition: We are required to currently *not* be wanting each of these blocks. curwanted: %s" % humanreadable.hr(filter(lambda x, self=self: self.Idsofwantedblocks.has_key(x), blockIds))
if len(blockIds) > 0:
self.add_Ids_of_wanted_blocks(blockIds)
@@ -818,11 +814,12 @@ class BlockWranglerData(nummedobj.Nummed
This has to clean up everything so that internal state is consistent
again. This might be a performance issue. This gets called whenever we
get a block and whenever we complete a chunk reconstruction. Also it
- will be called by a "cancel" operation if we add that.
+ will be called by a "cancel" operation if we add that. (note: we have. it's called "shoot". --Zooko 2004-02-17)
@precondition: You are required to be currently wanting each of these blocks when you call this method.: len(filter(lambda x, self=selfXC not self.Idsofwantedblocks.has_key(x), blockIds)) == 0
"""
assert len(filter(lambda x, self=self: not self.Idsofwantedblocks.has_key(x), blockIds)) == 0, "precondition: You are required to be currently wanting each of these blocks when you call this method."
+ assert self._assert_consistency()
if len(blockIds) > 0:
for fileobj in filter(lambda x, c=self.bId2chunkobj[blockIds[0]], self=self: c in self.fileobj2chunkobjs[x], self.fileobj2chunkobjs.keys()):
@@ -855,7 +851,8 @@ class BlockWranglerData(nummedobj.Nummed
self.dontneed = self.dontneed + NeedCount
debugprint("%s.stop_wanting_blocks(%s: %s); I now want %s blocks. I think I still need %s\n", args=(self, len(blockIds), blockIds, len(self.list_Ids_of_wanted_blocks()), self.total-self.dontneed), v=5, vs="BlockWrangler")
+ assert self._assert_consistency()
def stop_wanting_blocks_idempotent(self, blockIds, NeedCount=None):
"""
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
mnet-devel mailing list
mnet-devel at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mnet-devel
More information about the Mnet-devel
mailing list