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();