Author: toad
Date: 2008-06-21 17:52:52 +0000 (Sat, 21 Jun 2008)
New Revision: 20597
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
branches/db4o/freenet/src/freenet/node/RequestStarter.java
Log:
Don't query for the RegisterMe, pass it in and delete it.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-06-21 17:28:46 UTC (rev 20596)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-06-21 17:52:52 UTC (rev 20597)
@@ -156,10 +156,13 @@
}
public void register(final SendableRequest req) {
- register(req, databaseExecutor.onThread());
+ register(req, databaseExecutor.onThread(), null);
}
- public void register(final SendableRequest req, boolean
onDatabaseThread) {
+ /**
+ * Register and then delete the RegisterMe which is passed in to avoid
querying.
+ */
+ public void register(final SendableRequest req, boolean
onDatabaseThread, final RegisterMe reg) {
logMINOR = Logger.shouldLog(Logger.MINOR, this);
if(logMINOR) Logger.minor(this, "Registering "+req, new
Exception("debug"));
boolean persistent = req.persistent();
@@ -178,7 +181,7 @@
datastoreCheckerExecutor.execute(new Runnable()
{
public void run() {
- registerCheckStore(getter,
true, keyTokens, keys);
+ registerCheckStore(getter,
true, keyTokens, keys, reg);
}
}, getter.getPriorityClass(), "Checking
datastore");
@@ -195,7 +198,7 @@
datastoreCheckerExecutor.execute(new Runnable() {
public void run() {
-
registerCheckStore(getter, true, keyTokens, keys);
+
registerCheckStore(getter, true, keyTokens, keys, reg);
}
}, getter.getPriorityClass(),
"Checking datastore");
@@ -213,7 +216,7 @@
datastoreCheckerExecutor.execute(new Runnable()
{
public void run() {
- registerCheckStore(getter,
false, keyTokens, keys);
+ registerCheckStore(getter,
false, keyTokens, keys, null);
}
}, getter.getPriorityClass(), "Checking
datastore");
@@ -224,7 +227,7 @@
// Pretend to not be on the database thread.
// In some places (e.g. SplitFileInserter.start(), we
call register() *many* times within a single transaction.
// We can greatly improve responsiveness at the cost of
some throughput and RAM by only adding the tags at this point.
- finishRegister(req, persistent, false, true);
+ finishRegister(req, persistent, false, true, reg);
}
}
@@ -234,8 +237,9 @@
* (for a persistent request) queue a job on the databaseExecutor and
(for a transient
* request) finish registering the request immediately.
* @param getter
+ * @param reg
*/
- protected void registerCheckStore(SendableGet getter, boolean
persistent, Object[] keyTokens, ClientKey[] keys) {
+ protected void registerCheckStore(SendableGet getter, boolean
persistent, Object[] keyTokens, ClientKey[] keys, RegisterMe reg) {
boolean anyValid = false;
for(int i=0;i<keyTokens.length;i++) {
Object tok = keyTokens[i];
@@ -305,10 +309,10 @@
anyValid = true;
}
}
- finishRegister(getter, persistent, false, anyValid);
+ finishRegister(getter, persistent, false, anyValid, reg);
}
- private void finishRegister(final SendableRequest req, boolean
persistent, boolean onDatabaseThread, final boolean anyValid) {
+ private void finishRegister(final SendableRequest req, boolean
persistent, boolean onDatabaseThread, final boolean anyValid, final RegisterMe
reg) {
if(persistent) {
// Add to the persistent registration queue
if(onDatabaseThread) {
@@ -317,7 +321,7 @@
}
if(anyValid)
schedCore.innerRegister(req, random,
selectorContainer);
- schedCore.deleteRegisterMe(req);
+ selectorContainer.delete(reg);
starter.wakeUp();
} else {
jobRunner.queue(new DBJob() {
@@ -325,7 +329,7 @@
public void run(ObjectContainer
container, ClientContext context) {
if(anyValid)
schedCore.innerRegister(req, random, container);
- schedCore.deleteRegisterMe(req);
+ container.delete(reg);
}
}, NativeThread.NORM_PRIORITY, false);
@@ -373,7 +377,7 @@
return schedCore.removeFirst(fuzz, random, offeredKeys,
starter, schedTransient, true, prio, retryCount, clientContext);
}
- private static final int MAX_STARTER_QUEUE_SIZE = 10;
+ private static final int MAX_STARTER_QUEUE_SIZE = 100;
private LinkedList starterQueue = new LinkedList();
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-21 17:28:46 UTC (rev 20596)
+++
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
2008-06-21 17:52:52 UTC (rev 20597)
@@ -461,7 +461,7 @@
container.delete(reg);
// Don't need to activate, fields should exist?
FIXME
try {
- sched.register(reg.getter, true);
+ sched.register(reg.getter, true, reg);
} catch (Throwable t) {
Logger.error(this, "Caught "+t+"
running RegisterMeRunner", t);
// Cancel the request, and commit so it
isn't tried again.
@@ -481,20 +481,6 @@
container.set(reg);
}
- public void deleteRegisterMe(final SendableRequest req) {
- ObjectSet result = container.query(new Predicate() {
- public boolean match(RegisterMe reg) {
- if(reg.core != ClientRequestSchedulerCore.this)
return false;
- if(reg.getter != req) return false;
- return true;
- }
- });
- while(result.hasNext()) {
- RegisterMe me = (RegisterMe) result.next();
- container.delete(me);
- }
- }
-
public boolean hasKey(Key key) {
synchronized(keysFetching) {
return keysFetching.contains(key);
Modified: branches/db4o/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestStarter.java 2008-06-21
17:28:46 UTC (rev 20596)
+++ branches/db4o/freenet/src/freenet/node/RequestStarter.java 2008-06-21
17:52:52 UTC (rev 20597)
@@ -122,7 +122,7 @@
sched.moveKeysFromCooldownQueue();
boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
if(req == null) {
- req = getRequest();
+ req = getRequest(logMINOR);
}
if(req != null) {
if(logMINOR) Logger.minor(this, "Running "+req);
@@ -162,7 +162,7 @@
// Always take the lock on RequestStarter
first. AFAICS we don't synchronize on RequestStarter anywhere else.
// Nested locks here prevent extra latency when
there is a race, and therefore allow us to sleep indefinitely
synchronized(this) {
- req = getRequest();
+ req = getRequest(logMINOR);
if(req == null) {
try {
wait(1*1000); // as
close to indefinite as I'm comfortable with! Toad
@@ -192,7 +192,7 @@
* thread is probably doing other things so we have to wait for that to
finish).
* @return
*/
- private ChosenRequest getRequest() {
+ private ChosenRequest getRequest(boolean logMINOR) {
boolean usedReq = true;
ChosenRequest req = null;
while(true) {
@@ -219,11 +219,14 @@
}
if(usedReq || req == null)
sched.queueFillRequestStarterQueue();
+ if(req == null)
+ if(req == null && logMINOR) Logger.minor(this, "No requests
found");
return req;
}
private boolean startRequest(ChosenRequest req, boolean logMINOR) {
if((!isInsert) && sched.fetchingKeys().hasKey(req.key)) return
false;
+ if(logMINOR) Logger.minor(this, "Running request "+req);
core.getExecutor().execute(new SenderThread(req, req.key),
"RequestStarter$SenderThread for "+req);
return true;
}