Author: toad
Date: 2008-07-24 12:05:56 +0000 (Thu, 24 Jul 2008)
New Revision: 21357
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
Log:
Bulk failure hashmap doesn't work if the key is not activated. So schedule a
high priority, fast job to activate, add to the hashmap, and if necessary
schedule the bulk caller. This job won't write anything so should be fast.
Modified:
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-24 12:02:31 UTC (rev 21356)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
2008-07-24 12:05:56 UTC (rev 21357)
@@ -1033,37 +1033,51 @@
}
}
- public void callFailure(final SendableGet get, final
LowLevelGetException e, final Object keyNum, int prio, final ChosenRequest req,
boolean persistent) {
+ public void callFailure(final SendableGet get, final
LowLevelGetException e, final Object keyNum, final int prio, final
ChosenRequest req, boolean persistent) {
if(!persistent) {
get.onFailure(e, keyNum, null, clientContext);
return;
}
if(get instanceof SupportsBulkCallFailure) {
- if(logMINOR)
- Logger.minor(this, "Calling bulk failure for
"+get);
- SupportsBulkCallFailure getter =
(SupportsBulkCallFailure) get;
- BulkCallFailureItem item = new BulkCallFailureItem(e,
keyNum, (PersistentChosenRequest) req);
- BulkCaller caller = null;
- synchronized(this) {
- BulkCallFailureItem[] items =
(BulkCallFailureItem[]) bulkFailureLookupItems.get(get);
- if(items == null) {
- bulkFailureLookupItems.put(getter, new
BulkCallFailureItem[] { item } );
- } else {
- BulkCallFailureItem[] newItems = new
BulkCallFailureItem[items.length+1];
- System.arraycopy(items, 0, newItems, 0,
items.length);
- newItems[items.length] = item;
- bulkFailureLookupItems.put(getter,
newItems);
+ // Getter MUST BE ACTIVATED for us to use it as a key.
+ // The below job doesn't write anything, so it will run
fast.
+ jobRunner.queue(new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ container.activate(get, 1);
+ if(logMINOR)
+ Logger.minor(this, "Calling
bulk failure for "+get);
+ SupportsBulkCallFailure getter =
(SupportsBulkCallFailure) get;
+ BulkCallFailureItem item = new
BulkCallFailureItem(e, keyNum, (PersistentChosenRequest) req);
+ BulkCaller caller = null;
+ synchronized(this) {
+ BulkCallFailureItem[] items =
(BulkCallFailureItem[]) bulkFailureLookupItems.get(get);
+ if(items == null) {
+
bulkFailureLookupItems.put(getter, new BulkCallFailureItem[] { item } );
+ } else {
+ BulkCallFailureItem[]
newItems = new BulkCallFailureItem[items.length+1];
+ System.arraycopy(items,
0, newItems, 0, items.length);
+ newItems[items.length]
= item;
+
bulkFailureLookupItems.put(getter, newItems);
+ }
+ caller = (BulkCaller)
bulkFailureLookupJob.get(getter);
+ if(caller == null) {
+ caller = new
BulkCaller(getter);
+
bulkFailureLookupJob.put(getter, caller);
+ } else
+ caller = null;
+
+ }
+ if(caller != null)
+ jobRunner.queue(caller, prio,
true);
+ else {
+ if(logMINOR)
+ Logger.minor(this, "Not
calling bulk failure for "+get);
+ }
+ container.deactivate(get, 1);
}
- caller = (BulkCaller)
bulkFailureLookupJob.get(getter);
- if(caller == null) {
- caller = new BulkCaller(getter);
- bulkFailureLookupJob.put(getter,
caller);
- } else
- caller = null;
- }
- if(caller != null)
- jobRunner.queue(caller, prio, true);
+ }, NativeThread.HIGH_PRIORITY, false);
return;
}
jobRunner.queue(new DBJob() {