Author: toad
Date: 2008-07-04 14:53:20 +0000 (Fri, 04 Jul 2008)
New Revision: 20997
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
Risky optimisation: if the starter queue is less than 25% full, attempt to add
newly registered requests directly to it, storing a PersistentChosenRequest and
bypassing the queue registration.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-04 14:33:45 UTC (rev 20996)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-04 14:53:20 UTC (rev 20997)
@@ -382,6 +382,11 @@
}
finishRegister(getter, persistent, false, anyValid, reg);
}
+
+ /** If enabled, if the queue is less than 25% full, attempt to add
newly
+ * registered requests directly to it, storing a
PersistentChosenRequest and
+ * bypassing registration on the queue. Risky optimisation. */
+ static final boolean TRY_DIRECT = true;
private void finishRegister(final SendableRequest req, boolean
persistent, boolean onDatabaseThread, final boolean anyValid, final RegisterMe
reg) {
if(persistent) {
@@ -392,10 +397,40 @@
}
if(persistent)
selectorContainer.activate(req, 1);
+ boolean tryDirect = false;
+ if(anyValid && TRY_DIRECT) {
+ synchronized(starterQueue) {
+ tryDirect = starterQueue.size()
< MAX_STARTER_QUEUE_SIZE * 1 / 4;
+ }
+ if(tryDirect) {
+ while(true) {
+ PersistentChosenRequest
cr = (PersistentChosenRequest) schedCore.maybeMakeChosenRequest(req,
selectorContainer, clientContext);
+ if(cr == null) {
+
if(!(req.isEmpty(selectorContainer) || req.isCancelled(selectorContainer)))
+ //
Still needs to be registered
+
tryDirect = false;
+ break;
+ }
+
synchronized(starterQueue) {
+
if(starterQueue.size() >= MAX_STARTER_QUEUE_SIZE) {
+ break;
+ }
+
starterQueue.add(cr);
+ }
+ }
+ }
+ }
if(logMINOR)
Logger.minor(this, "finishRegister()
for "+req);
- if(anyValid)
- schedCore.innerRegister(req, random,
selectorContainer);
+ if(anyValid) {
+ if(!tryDirect) {
+
if(req.isCancelled(selectorContainer) || req.isEmpty(selectorContainer)) {
+ Logger.error(this,
"Request is empty/cancelled: "+req);
+ } else {
+
schedCore.innerRegister(req, random, selectorContainer);
+ }
+ }
+ }
if(reg != null)
selectorContainer.delete(reg);
maybeFillStarterQueue(selectorContainer,
clientContext);