Author: toad
Date: 2008-06-30 22:35:30 +0000 (Mon, 30 Jun 2008)
New Revision: 20879
Modified:
branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
branches/db4o/freenet/src/freenet/client/async/USKInserter.java
branches/db4o/freenet/src/freenet/client/async/USKManager.java
branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
branches/db4o/freenet/src/freenet/node/SendableGet.java
branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
Log:
Finish registration immediately if retrying, rather than waiting for datastore
checks to complete.
Improves efficiency: parent grab array gets set, so we don't add the same N
blocks over and over again to the pending keys list.
Modified:
branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/BaseSingleFileFetcher.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -96,7 +96,7 @@
}
return true; // We will retry, just not yet.
See requeueAfterCooldown(Key).
} else {
- schedule(container, context);
+ schedule(container, context, true);
}
return true;
}
@@ -192,7 +192,7 @@
}
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Requeueing after cooldown "+key+"
for "+this);
- schedule(container, context);
+ schedule(container, context, true);
}
}
Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetState.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -11,7 +11,7 @@
*/
public interface ClientGetState {
- public void schedule(ObjectContainer container, ClientContext context);
+ public void schedule(ObjectContainer container, ClientContext context,
boolean probablyNotInStore);
public void cancel(ObjectContainer container, ClientContext context);
Modified: branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientGetter.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -113,7 +113,7 @@
return false;
}
}
- currentState.schedule(container, context);
+ currentState.schedule(container, context,
false);
}
if(cancelled) cancel();
} catch (MalformedURLException e) {
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -155,14 +155,14 @@
choosenPriorityScheduler = val;
}
- public void register(final SendableRequest req) {
- register(req, databaseExecutor.onThread(), null);
+ public void register(final SendableRequest req, boolean
probablyNotInStore) {
+ register(req, databaseExecutor.onThread(), null,
probablyNotInStore);
}
/**
* Register and then delete the RegisterMe which is passed in to avoid
querying.
*/
- public void register(final SendableRequest req, boolean
onDatabaseThread, RegisterMe reg) {
+ public void register(final SendableRequest req, boolean
onDatabaseThread, RegisterMe reg, final boolean probablyNotInStore) {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
if(logMINOR) Logger.minor(this, "Registering "+req, new
Exception("debug"));
final boolean persistent = req.persistent();
@@ -173,11 +173,21 @@
if(persistent && onDatabaseThread) {
schedCore.addPendingKeys(getter,
selectorContainer);
- if(reg == null)
- reg = schedCore.queueRegister(getter,
databaseExecutor, selectorContainer);
- final RegisterMe regme = reg;
final Object[] keyTokens =
getter.sendableKeys(selectorContainer);
final ClientKey[] keys = new
ClientKey[keyTokens.length];
+
+ if(probablyNotInStore) {
+ // Complete the registration *before*
checking the store.
+ // Check the store anyway though!
+ finishRegister(req, persistent, false,
true, reg);
+ // RegisterMe has been deleted or was
null in the first place.
+ reg = null;
+ } else {
+ if(reg == null)
+ reg =
schedCore.queueRegister(getter, databaseExecutor, selectorContainer);
+ }
+ final RegisterMe regme = reg;
+
for(int i=0;i<keyTokens.length;i++) {
keys[i] = getter.getKey(keyTokens[i],
selectorContainer);
selectorContainer.activate(keys[i], 5);
@@ -199,9 +209,18 @@
container.activate(getter, 1);
schedCore.addPendingKeys(getter, container);
RegisterMe reg = regme;
- if(reg == null)
- reg =
schedCore.queueRegister(getter, databaseExecutor, container);
+ if(probablyNotInStore) {
+ // Complete the
registration *before* checking the store.
+ // Check the store
anyway though!
+ finishRegister(req,
persistent, false, true, reg);
+ // RegisterMe has been
deleted or was null in the first place.
+ reg = null;
+ } else {
+ if(reg == null)
+ reg =
schedCore.queueRegister(getter, databaseExecutor, container);
+ }
final RegisterMe regInner = reg;
+
final Object[] keyTokens =
getter.sendableKeys(container);
final ClientKey[] keys = new
ClientKey[keyTokens.length];
for(int
i=0;i<keyTokens.length;i++) {
@@ -360,7 +379,8 @@
Logger.minor(this, "finishRegister()
for "+req);
if(anyValid)
schedCore.innerRegister(req, random,
selectorContainer);
- selectorContainer.delete(reg);
+ if(reg != null)
+ selectorContainer.delete(reg);
maybeFillStarterQueue(selectorContainer,
clientContext);
starter.wakeUp();
} else {
@@ -372,7 +392,8 @@
Logger.minor(this,
"finishRegister() for "+req);
if(anyValid)
schedCore.innerRegister(req, random, container);
- container.delete(reg);
+ if(reg != null)
+ container.delete(reg);
maybeFillStarterQueue(container, context);
starter.wakeUp();
}
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-30 16:13:25 UTC (rev 20878)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -530,7 +530,7 @@
Logger.minor(this, "Running RegisterMe
for "+reg.getter+" : "+reg.key.addedTime+" : "+reg.key.priority);
// Don't need to activate, fields should exist?
FIXME
try {
- sched.register(reg.getter, true, reg);
+ sched.register(reg.getter, true, reg,
false);
} catch (Throwable t) {
Logger.error(this, "Caught "+t+"
running RegisterMeRunner", t);
// Cancel the request, and commit so it
isn't tried again.
Modified:
branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -199,7 +199,7 @@
}
if(persistent)
container.set(this);
- getScheduler(context).register(this);
+ getScheduler(context).register(this, false);
}
private void fail(InsertException e, ObjectContainer container,
ClientContext context) {
@@ -263,7 +263,7 @@
if(persistent)
container.set(this);
} else {
- getScheduler(context).register(this);
+ getScheduler(context).register(this, false);
}
}
Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileFetcher.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -513,7 +513,7 @@
f.addDecompressor(codec);
}
parent.onTransition(this, f, container);
- f.schedule(container, context);
+ f.schedule(container, context, false);
if(persistent) {
container.set(metaStrings);
container.set(this);
@@ -590,7 +590,7 @@
SplitFileFetcher sf = new
SplitFileFetcher(metadata, rcb, parent, ctx,
decompressors, clientMetadata,
actx, recursionLevel, returnBucket, token, container);
parent.onTransition(this, sf, container);
- sf.schedule(container, context);
+ sf.schedule(container, context, false);
rcb.onBlockSetFinished(this, container,
context);
// Clear our own metadata, we won't need it any
more.
// For multi-level metadata etc see above.
@@ -913,7 +913,7 @@
if(l == usk.suggestedEdition) {
SingleFileFetcher sf = new
SingleFileFetcher(parent, cb, clientMetadata, key, metaStrings,
key.getURI().addMetaStrings(metaStrings),
0, ctx, actx, null,
null, maxRetries, recursionLevel+1, dontTellClientGet, token, false,
returnBucket, true, container, context);
- sf.schedule(container, context);
+ sf.schedule(container, context, false);
} else {
cb.onFailure(new
FetchException(FetchException.PERMANENT_REDIRECT,
newUSK.getURI().addMetaStrings(metaStrings)), null, container, context);
}
Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcher.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -326,12 +326,12 @@
}
}
- public void schedule(ObjectContainer container, ClientContext context) {
+ public void schedule(ObjectContainer container, ClientContext context,
boolean probablyNotInStore) {
if(persistent)
container.activate(this, 1);
if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this,
"Scheduling "+this);
for(int i=0;i<segments.length;i++) {
- segments[i].schedule(container, context);
+ segments[i].schedule(container, context,
probablyNotInStore);
}
}
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSegment.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -620,7 +620,7 @@
parentFetcher.segmentFinished(this, container, context);
}
- public void schedule(ObjectContainer container, ClientContext context) {
+ public void schedule(ObjectContainer container, ClientContext context,
boolean probablyNotInStore) {
if(persistent) {
container.activate(this, 1);
container.activate(parentFetcher, 1);
@@ -633,7 +633,7 @@
for(int
i=0;i<dataRetries.length+checkRetries.length;i++)
seg.add(i, true, container, context, false);
- seg.schedule(container, context);
+ seg.schedule(container, context, probablyNotInStore);
synchronized(this) {
scheduled = true;
}
@@ -807,7 +807,7 @@
if(v != null) {
for(int i=0;i<v.size();i++) {
if(v.get(i) == segment) foundCaller = true;
- ((SplitFileFetcherSubSegment)
v.get(i)).schedule(container, context);
+ ((SplitFileFetcherSubSegment)
v.get(i)).schedule(container, context, true);
}
}
return foundCaller;
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-06-30 16:13:25 UTC (rev 20878)
+++
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -456,7 +456,7 @@
}
if(persistent)
container.set(blockNums);
- if(schedule) schedule(container, context);
+ if(schedule) schedule(container, context, true); // Retrying so
not in store
else if(!dontSchedule)
// Already scheduled, however this key may not be
registered.
getScheduler(context).addPendingKey(segment.getBlockKey(blockNo, container),
this);
Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcher.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -159,7 +159,7 @@
if(logMINOR)
Logger.minor(this, "Checker == null in
schedule() for "+this, new Exception("debug"));
} else
- checker.schedule(container, context);
+ checker.schedule(container, context, false);
}
public String toString() {
@@ -469,17 +469,17 @@
public void schedule(long delay, ObjectContainer container, final
ClientContext context) {
assert(container == null);
if (delay<=0) {
- schedule(container, context);
+ schedule(container, context, false);
} else {
uskManager.ticker.queueTimedJob(new Runnable() {
public void run() {
- USKFetcher.this.schedule(null, context);
+ USKFetcher.this.schedule(null, context,
false);
}
}, delay);
}
}
- public void schedule(ObjectContainer container, ClientContext context) {
+ public void schedule(ObjectContainer container, ClientContext context,
boolean probablyNotInStore) {
USKAttempt[] attempts;
long lookedUp = uskManager.lookup(origUSK);
synchronized(this) {
Modified: branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKFetcherTag.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -91,7 +91,7 @@
usk = usk.copy(edition);
fetcher = manager.getFetcher(usk, ctx, new
USKFetcherWrapper(usk, priority, client), keepLastData);
fetcher.addCallback(this);
- fetcher.schedule(null, context); // non-persistent
+ fetcher.schedule(null, context, false); // non-persistent
}
public void cancel(ObjectContainer container, ClientContext context) {
@@ -118,7 +118,7 @@
return token;
}
- public void schedule(ObjectContainer container, ClientContext context) {
+ public void schedule(ObjectContainer container, ClientContext context,
boolean probablyNotInStore) {
start(context.uskManager, context);
}
Modified: branches/db4o/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKInserter.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKInserter.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -78,7 +78,7 @@
if(finished) return;
fetcher =
context.uskManager.getFetcherForInsertDontSchedule(pubUSK,
parent.priorityClass, this, parent.getClient(), container, context);
}
- fetcher.schedule(container, context);
+ fetcher.schedule(container, context, false);
}
public void onFoundEdition(long l, USK key, ObjectContainer container,
ClientContext context, boolean lastContentWasMetadata, short codec, byte[]
hisData) {
Modified: branches/db4o/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKManager.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKManager.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -140,7 +140,7 @@
fetcher.cancel(null, context);
}
}
- if(sched != null) sched.schedule(null, context);
+ if(sched != null) sched.schedule(null, context, false);
}
void update(final USK origUSK, final long number, final ClientContext
context) {
@@ -216,7 +216,7 @@
if(fetcher != null) {
ticker.queueTimedJob(new Runnable() {
public void run() {
- fetcher.schedule(null, context);
+ fetcher.schedule(null, context, false);
}
}, 0);
}
Modified: branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/client/async/USKRetriever.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -48,7 +48,7 @@
SingleFileFetcher getter =
(SingleFileFetcher)
SingleFileFetcher.create(this, this, new ClientMetadata(), uri, ctx, new
ArchiveContext(ctx.maxArchiveLevels),
ctx.maxNonSplitfileRetries, 0,
true, l, true, null, false, null, context);
- getter.schedule(null, context);
+ getter.schedule(null, context, false);
} catch (MalformedURLException e) {
Logger.error(this, "Impossible: "+e, e);
} catch (FetchException e) {
Modified: branches/db4o/freenet/src/freenet/node/SendableGet.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SendableGet.java 2008-06-30
16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/node/SendableGet.java 2008-06-30
22:35:30 UTC (rev 20879)
@@ -99,10 +99,10 @@
return true;
}
- public void schedule(ObjectContainer container, ClientContext context) {
+ public void schedule(ObjectContainer container, ClientContext context,
boolean assumeNotInStore) {
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Scheduling "+this);
- getScheduler(context).register(this);
+ getScheduler(context).register(this, assumeNotInStore);
}
public ClientRequestScheduler getScheduler(ClientContext context) {
Modified: branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
2008-06-30 16:13:25 UTC (rev 20878)
+++ branches/db4o/freenet/src/freenet/node/SimpleSendableInsert.java
2008-06-30 22:35:30 UTC (rev 20879)
@@ -110,7 +110,7 @@
public void schedule() {
finished = false; // can reschedule
- scheduler.register(this);
+ scheduler.register(this, false);
}
public void cancel(ObjectContainer container, ClientContext context) {