[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