Author: toad
Date: 2008-07-25 22:00:50 +0000 (Fri, 25 Jul 2008)
New Revision: 21405

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
Log:
Tracking down an NPE: list and activate keys first, then do things on them, 
then deactivate, rather than listing, activating and deactivating each key 
twice.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-07-25 21:59:29 UTC (rev 21404)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-07-25 22:00:50 UTC (rev 21405)
@@ -259,9 +259,9 @@
                        }
                } else {
                        if(listener != null) {
-                               schedTransient.addPendingKeys(listener, null);
+                               final Key[] keys = 
listener.listKeys(selectorContainer);
+                               schedTransient.addPendingKeys(listener, keys, 
null);
                                short prio = 
listener.getPriorityClass(selectorContainer);
-                               final Key[] keys = 
listener.listKeys(selectorContainer);
                                final boolean dontCache = 
listener.dontCache(null);
                                for(int i=0;i<keys.length;i++) {
                                        if(keys[i].getRoutingKey() == null)
@@ -328,7 +328,13 @@
                                return;
                        } else {
                                short prio = 
listener.getPriorityClass(selectorContainer);
-                               schedCore.addPendingKeys(listener, 
selectorContainer);
+                               final Key[] keys = 
listener.listKeys(selectorContainer);
+                               for(int i=0;i<keys.length;i++) {
+                                       selectorContainer.activate(keys[i], 5);
+                                       if(keys[i].getRoutingKey() == null)
+                                               throw new 
NullPointerException();
+                               }
+                               schedCore.addPendingKeys(listener, keys, 
selectorContainer);
                                if(reg == null && getters != null) {
                                        reg = new RegisterMe(null, getters, 
null, prio, schedCore, blocks, node.bootID);
                                        selectorContainer.set(reg);
@@ -340,12 +346,10 @@
                                }
                                final RegisterMe regme = reg;
                                // Check the datastore before proceding.
-                               final Key[] keys = 
listener.listKeys(selectorContainer);
                                for(int i=0;i<keys.length;i++) {
-                                       selectorContainer.activate(keys[i], 5);
                                        Key oldKey = keys[i];
                                        keys[i] = oldKey.cloneKey();
-                                       selectorContainer.deactivate(oldKey, 1);
+                                       selectorContainer.deactivate(oldKey, 5);
                                }
                                final boolean dontCache = 
listener.dontCache(selectorContainer);
                                datastoreCheckerExecutor.execute(new Runnable() 
{

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-07-25 21:59:29 UTC (rev 21404)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerBase.java  
    2008-07-25 22:00:50 UTC (rev 21405)
@@ -178,10 +178,15 @@
                        }
        }

-       public void addPendingKeys(GotKeyListener getter, ObjectContainer 
container) {
+       /**
+        * Keys must already be activated.
+        * @param getter
+        * @param keyTokens
+        * @param container
+        */
+       public void addPendingKeys(GotKeyListener getter, Key[] keyTokens, 
ObjectContainer container) {
                if(persistent())
                        container.activate(getter, 1);
-               Key[] keyTokens = getter.listKeys(container);
                Key prevTok = null;
                for(int i=0;i<keyTokens.length;i++) {
                        Key key = keyTokens[i];
@@ -189,11 +194,7 @@
                                Logger.error(this, "Ignoring duplicate token");
                                continue;
                        }
-                       if(persistent())
-                               container.activate(key, 5);
                        addPendingKey(key, getter, container);
-                       if(persistent())
-                               container.deactivate(key, 5);
                }
        }



Reply via email to