Author: toad
Date: 2008-04-02 01:34:21 +0000 (Wed, 02 Apr 2008)
New Revision: 18906
Modified:
trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
Log:
Get the new subsegment earlier on, and use it to queue the cooldown immediately
for the right client.
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-04-02 01:29:15 UTC (rev 18905)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-04-02 01:34:21 UTC (rev 18906)
@@ -383,40 +383,44 @@
boolean failed = false;
boolean cooldown = false;
ClientCHK key;
+ SplitFileFetcherSubSegment sub = null;
synchronized(this) {
if(isFinished()) return;
if(blockNo < dataKeys.length) {
key = dataKeys[blockNo];
tries = ++dataRetries[blockNo];
if(tries > maxTries && maxTries >= 0) failed =
true;
- else if(tries %
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
+ else {
+ sub = getSubSegment(tries);
+ if(tries %
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
long now = System.currentTimeMillis();
if(dataCooldownTimes[blockNo] > now)
Logger.error(this, "Already on
the cooldown queue! for "+this+" data block no "+blockNo, new
Exception("error"));
else
- // FIXME ideally we'd only register
once, with the new segment, but the cost is
- // trivial, and it simplifies locking.
Reconsider sometime...
- dataCooldownTimes[blockNo] =
sched.queueCooldown(key, seg);
+ dataCooldownTimes[blockNo] =
sched.queueCooldown(key, sub);
cooldown = true;
+ }
}
} else {
int checkNo = blockNo - dataKeys.length;
key = checkKeys[checkNo];
tries = ++checkRetries[checkNo];
if(tries > maxTries && maxTries >= 0) failed =
true;
- else if(tries %
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
+ else {
+ sub = getSubSegment(tries);
+ if(tries %
ClientRequestScheduler.COOLDOWN_RETRIES == 0) {
long now = System.currentTimeMillis();
if(checkCooldownTimes[checkNo] > now)
Logger.error(this, "Already on
the cooldown queue! for "+this+" check block no "+blockNo, new
Exception("error"));
else
- checkCooldownTimes[checkNo] =
sched.queueCooldown(key, seg);
+ checkCooldownTimes[checkNo] =
sched.queueCooldown(key, sub);
cooldown = true;
+ }
}
}
}
if(cooldown) {
// Register key to next sub-segment and remove from
previous one to save memory (avoid duplication).
- SplitFileFetcherSubSegment sub = getSubSegment(tries);
sub.getScheduler().addPendingKey(key, sub);
seg.unregisterKey(key.getNodeKey());
return;
@@ -430,7 +434,6 @@
// If we are here we are going to retry
// Unregister from the old sub-segment before registering on
the new.
seg.unregisterKey(key.getNodeKey());
- SplitFileFetcherSubSegment sub = getSubSegment(tries);
if(logMINOR)
Logger.minor(this, "Retrying block "+blockNo+" on
"+this+" : tries="+tries+"/"+maxTries+" : "+sub);
sub.add(blockNo, false);