Author: toad
Date: 2008-06-27 22:06:57 +0000 (Fri, 27 Jun 2008)
New Revision: 20834

Modified:
   branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
Log:
Activation, deactivation.
Maybe fix duplicate subsegments for the same retrycount when using cooldown 
queue.
Maybe fix Removing key blah for blah in requeueAfterCooldown as is now 
registered to a different subsegment

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-27 21:38:53 UTC (rev 20833)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java 
2008-06-27 22:06:57 UTC (rev 20834)
@@ -507,7 +507,7 @@
                                tries = ++dataRetries[blockNo];
                                if(tries > maxTries && maxTries >= 0) failed = 
true;
                                else {
-                                       sub = getSubSegment(tries);
+                                       sub = getSubSegment(tries, container);
                                        if(tries % 
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
                                                long now = 
System.currentTimeMillis();
                                                if(dataCooldownTimes[blockNo] > 
now)
@@ -525,7 +525,7 @@
                                tries = ++checkRetries[checkNo];
                                if(tries > maxTries && maxTries >= 0) failed = 
true;
                                else {
-                                       sub = getSubSegment(tries);
+                                       sub = getSubSegment(tries, container);
                                        if(tries % 
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
                                                long now = 
System.currentTimeMillis();
                                                if(checkCooldownTimes[checkNo] 
> now)
@@ -549,6 +549,8 @@
                        // Register to the next sub-segment before removing 
from the old one.
                        sub.getScheduler(context).addPendingKey(key, sub);
                        seg.unregisterKey(key.getNodeKey(), context, container);
+                       if(logMINOR)
+                               Logger.minor(this, "Adding to cooldown queue: 
"+key+" for "+this+" was on segment "+seg+" now registered to "+sub);
                } else {
                        // If we are here we are going to retry
                        // Unregister from the old sub-segment before 
registering on the new.
@@ -559,8 +561,10 @@
                }
        }

-       private SplitFileFetcherSubSegment getSubSegment(int retryCount) {
+       private SplitFileFetcherSubSegment getSubSegment(int retryCount, 
ObjectContainer container) {
                SplitFileFetcherSubSegment sub;
+               if(persistent)
+                       container.activate(subSegments, 1);
                synchronized(this) {
                        for(int i=0;i<subSegments.size();i++) {
                                sub = (SplitFileFetcherSubSegment) 
subSegments.get(i);
@@ -569,6 +573,8 @@
                        sub = new SplitFileFetcherSubSegment(this, retryCount);
                        subSegments.add(sub);
                }
+               if(persistent)
+                       container.set(subSegments);
                return sub;
        }

@@ -615,7 +621,7 @@
                        container.activate(parentFetcher.parent, 1);
                }
                try {
-                       SplitFileFetcherSubSegment seg = getSubSegment(0);
+                       SplitFileFetcherSubSegment seg = getSubSegment(0, 
container);
                        if(persistent)
                                container.activate(seg, 1);
                        for(int 
i=0;i<dataRetries.length+checkRetries.length;i++)
@@ -692,16 +698,23 @@
                if(dontRemove) return false;
                if(logMINOR)
                        Logger.minor(this, "Removing sub segment: "+segment+" 
for retry count "+retryCount);
+               if(persistent) {
+                       container.activate(subSegments, 1);
+               }
                for(int i=0;i<subSegments.size();i++) {
                        if(segment.equals(subSegments.get(i))) {
                                subSegments.remove(i);
                                i--;
                        }
                }
+               if(persistent)
+                       container.set(subSegments);
                return true;
        }

        private void removeSubSegments(ObjectContainer container) {
+               if(persistent)
+                       container.activate(subSegments, 1);
                SplitFileFetcherSubSegment[] deadSegs;
                synchronized(this) {
                        deadSegs = (SplitFileFetcherSubSegment[]) 
subSegments.toArray(new SplitFileFetcherSubSegment[subSegments.size()]);
@@ -712,6 +725,10 @@
                for(int i=0;i<deadSegs.length;i++) {
                        deadSegs[i].kill(container);
                }
+               if(persistent) {
+                       container.set(this);
+                       container.set(subSegments);
+               }
        }

        public synchronized long getCooldownWakeup(int blockNum) {
@@ -744,7 +761,7 @@
                                        return false;
                                }
                                int tries = dataRetries[i];
-                               SplitFileFetcherSubSegment sub = 
getSubSegment(tries);
+                               SplitFileFetcherSubSegment sub = 
getSubSegment(tries, container);
                                if(logMINOR)
                                        Logger.minor(this, "Retrying after 
cooldown on "+this+": data block "+i+" on "+this+" : 
tries="+tries+"/"+maxTries+" : "+sub);
                                if(v == null) v = new Vector();
@@ -765,7 +782,7 @@
                                        return false;
                                }
                                int tries = checkRetries[i];
-                               SplitFileFetcherSubSegment sub = 
getSubSegment(tries);
+                               SplitFileFetcherSubSegment sub = 
getSubSegment(tries, container);
                                if(logMINOR)
                                        Logger.minor(this, "Retrying after 
cooldown on "+this+": check block "+i+" on "+this+" : 
tries="+tries+"/"+maxTries+" : "+sub);
                                if(v == null) v = new Vector();


Reply via email to