Author: toad
Date: 2008-06-27 12:16:42 +0000 (Fri, 27 Jun 2008)
New Revision: 20816

Modified:
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
Log:
Some paranoia/recovery-from-bugs code.
Should be removed eventually.
The bug was causing us to have the same block on the same subsegment's 
blockNums list many many many times (300+ on one).
This caused lots of subsegments (79) to stay registered long term in 
pendingKeys for a single key, even though only one of them was valid.
This particular change checks for and ignores duplicate tokens in 
addPendingKeys().

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-06-27 12:13:49 UTC (rev 20815)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-06-27 12:16:42 UTC (rev 20816)
@@ -346,8 +346,14 @@

        public void addPendingKeys(SendableGet getter, ObjectContainer 
container) {
                Object[] keyTokens = getter.sendableKeys(container);
+               Object prevTok = null;
                for(int i=0;i<keyTokens.length;i++) {
                        Object tok = keyTokens[i];
+                       if(i != 0 && prevTok == tok || (prevTok != null && tok 
!= null && prevTok.equals(tok))) {
+                               Logger.error(this, "Ignoring duplicate token");
+                               continue;
+                       }
+                       prevTok = tok;
                        ClientKey key = getter.getKey(tok, container);
                        if(getter.persistent())
                                container.activate(key, 5);


Reply via email to