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() {


Reply via email to