Author: toad
Date: 2008-11-01 20:00:24 +0000 (Sat, 01 Nov 2008)
New Revision: 23282

Removed:
   branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
Modified:
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
   branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
   branches/db4o/freenet/src/freenet/node/Node.java
Log:
Fix priority inversion. Remove RegisterMeSortKey, query RegisterMe's by 
priority.


Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-11-01 14:16:34 UTC (rev 23281)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-11-01 20:00:24 UTC (rev 23282)
@@ -146,8 +146,18 @@
 //                                     }
 //                                     
 //                             });
-                               Query query = container.query();
-                               query.constrain(RegisterMe.class);
+                               ObjectSet results = null;
+                               for(int 
i=RequestStarter.MAXIMUM_PRIORITY_CLASS;i<=RequestStarter.MINIMUM_PRIORITY_CLASS;i++)
 {
+                                       Query query = container.query();
+                                       query.constrain(RegisterMe.class);
+                                       query.descend("priority").constrain(i);
+                                       results = query.execute();
+                                       if(results.hasNext()) {
+                                               break;
+                                       } else results = null;
+                               }
+                               if(results == null)
+                                       return;
                                // This throws NotSupported.
 //                             
query.descend("core").constrain(this).identity().
 //                                     
and(query.descend("key").descend("addedTime").constrain(new 
Long(initTime)).smaller());
@@ -175,7 +185,6 @@
 //                             query.constrain(eval);
 //                             
query.descend("key").descend("priority").orderAscending();
 //                             
query.descend("key").descend("addedTime").orderAscending();
-                               ObjectSet results = query.execute();
                                synchronized(ClientRequestSchedulerCore.this) {
                                        registerMeSet = results;
                                }
@@ -607,7 +616,6 @@
                                        container.deactivate(reg, 1);
                                        continue; // Don't delete.
                                }
-                               container.activate(reg.key, 1);
 //                             if(reg.key.addedTime > initTime) {
 //                                     if(logMINOR) Logger.minor(this, 
"Ignoring RegisterMe as created since startup");
 //                                     container.deactivate(reg.key, 1);
@@ -619,7 +627,7 @@
                                        Logger.minor(this, "RegisterMe: next() 
took "+(endNext-startNext));

                                if(logMINOR)
-                                       Logger.minor(this, "Running RegisterMe 
"+reg+" for "+reg.nonGetRequest+" : "+reg.key.addedTime+" : "+reg.key.priority);
+                                       Logger.minor(this, "Running RegisterMe 
"+reg+" for "+reg.nonGetRequest+" : "+reg.addedTime+" : "+reg.priority);
                                // Don't need to activate, fields should exist? 
FIXME
                                if(reg.nonGetRequest != null) {
                                        container.activate(reg.nonGetRequest, 
1);
@@ -647,9 +655,8 @@
                                        shouldReRunRegisterMeRunner = false;
                                        registerMeSet = null;
                                }
-                               if(rerun) {
-                                       preRegisterMeRunner.run(container, 
context);
-                               }
+                               // Always re-run the query. If there is nothing 
to register, it won't call back to us.
+                               preRegisterMeRunner.run(container, context);
                        }
                }


Modified: branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMe.java      
2008-11-01 14:16:34 UTC (rev 23281)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMe.java      
2008-11-01 20:00:24 UTC (rev 23282)
@@ -1,7 +1,5 @@
 package freenet.client.async;

-import com.db4o.ObjectContainer;
-
 import freenet.node.SendableRequest;

 /**
@@ -12,7 +10,8 @@
 public class RegisterMe {
        final SendableRequest nonGetRequest;
        final ClientRequestSchedulerCore core;
-       final RegisterMeSortKey key;
+       final long addedTime;
+       final short priority;
        /**
         * Only set if the key is on the queue.
         */
@@ -24,7 +23,8 @@
                this.bootID = bootID;
                this.core = core;
                this.nonGetRequest = nonGetRequest;
-               this.key = new RegisterMeSortKey(prio);
+               priority = prio;
+               addedTime = System.currentTimeMillis();
                this.blocks = blocks;
                int hash = core.hashCode();
                if(nonGetRequest != null)
@@ -33,10 +33,6 @@
                hashCode = hash;
        }

-       public void objectOnActivate(ObjectContainer container) {
-               container.activate(key, 1);
-       }
-       
        public int hashCode() {
                return hashCode;
        }

Deleted: branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java       
2008-11-01 14:16:34 UTC (rev 23281)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java       
2008-11-01 20:00:24 UTC (rev 23282)
@@ -1,37 +0,0 @@
-package freenet.client.async;
-
-public class RegisterMeSortKey implements Comparable {
-
-       final long addedTime;
-       final short priority;
-       
-       public RegisterMeSortKey(short priorityClass) {
-               this.addedTime = System.currentTimeMillis();
-               this.priority = priorityClass;
-       }
-
-       public int compareTo(Object arg0) {
-               RegisterMeSortKey key = (RegisterMeSortKey) arg0;
-               if(key.priority < priority)
-                       return 1;
-               if(key.priority > priority)
-                       return -1;
-               if(key.addedTime < addedTime)
-                       return 1;
-               if(key.addedTime > addedTime)
-                       return -1;
-               return 0;
-       }
-       
-       public boolean equals(Object arg0) {
-               if(arg0 == this) return true;
-               if(!(arg0 instanceof RegisterMeSortKey)) return false;
-               RegisterMeSortKey key = (RegisterMeSortKey) arg0;
-               return key.priority == priority && key.addedTime == addedTime;
-       }
-       
-       public int hashCode() {
-               return (int) addedTime ^ ((int) addedTime >>> 32) ^ priority;
-       }
-
-}

Modified: branches/db4o/freenet/src/freenet/node/Node.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Node.java    2008-11-01 14:16:34 UTC 
(rev 23281)
+++ branches/db4o/freenet/src/freenet/node/Node.java    2008-11-01 20:00:24 UTC 
(rev 23282)
@@ -827,6 +827,7 @@
                
dbConfig.objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
                
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("core").indexed(true);
                
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("key").indexed(true);
+               
dbConfig.objectClass(freenet.client.async.RegisterMe.class).objectField("priority").indexed(true);
                
dbConfig.objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
                
dbConfig.objectClass(freenet.client.FECJob.class).objectField("priority").indexed(true);
                
dbConfig.objectClass(freenet.client.FECJob.class).objectField("addedTime").indexed(true);


Reply via email to