Author: toad
Date: 2008-06-25 20:54:28 +0000 (Wed, 25 Jun 2008)
New Revision: 20717

Added:
   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
   branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
Log:
New class RegisterMeSortKey contains the sorting info for a RegisterMe.
Sort by it and create an index on it so we can run RegisterMe's in the correct 
order and thus not have persistent inserts priorities turned upside down.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-25 20:43:31 UTC (rev 20716)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-06-25 20:54:28 UTC (rev 20717)
@@ -131,13 +131,13 @@
                                registerMeSet = container.query(new Predicate() 
{
                                        public boolean match(RegisterMe reg) {
                                                if(reg.core != 
ClientRequestSchedulerCore.this) return false;
-                                               if(reg.addedTime > initTime) 
return false;
+                                               if(reg.key.addedTime > 
initTime) return false;
                                                return true;
                                        }
                                });
-                               long tEnd = System.currentTimeMillis();
-                               if(logMINOR)
-                                       Logger.minor(this, "RegisterMe query 
took "+(tEnd-tStart));
+                       long tEnd = System.currentTimeMillis();
+                       if(logMINOR)
+                               Logger.minor(this, "RegisterMe query took 
"+(tEnd-tStart));
 //                             if(logMINOR)
 //                                     Logger.minor(this, "RegisterMe query 
returned: "+registerMeSet.size());
                                context.jobRunner.queue(registerMeRunner, 
NativeThread.NORM_PRIORITY, true);
@@ -489,21 +489,6 @@
        class RegisterMeRunner implements DBJob {

                public void run(ObjectContainer container, ClientContext 
context) {
-//                     , new Comparator() {
-//                             public int compare(Object arg0, Object arg1) {
-//                                     RegisterMe reg0 = (RegisterMe) arg0;
-//                                     RegisterMe reg1 = (RegisterMe) arg1;
-//                                     if(reg0.priority > reg1.priority)
-//                                             return -1; // First is lower 
priority, so use the second.
-//                                     if(reg0.priority < reg1.priority)
-//                                             return 1; // First is lower 
priority, so use the second.
-//                                     if(reg0.addedTime > reg1.addedTime)
-//                                             return -1; // Second was added 
earlier
-//                                     if(reg0.addedTime < reg1.addedTime)
-//                                             return 1;
-//                                     return 0;
-//                             }
-//                     });
                        for(int i=0;i < 10; i++) {
                                try {
                                        if(!registerMeSet.hasNext()) break;
@@ -527,7 +512,7 @@
                                container.delete(reg);
                                container.activate(reg.getter, 2);
                                if(logMINOR)
-                                       Logger.minor(this, "Running RegisterMe 
for "+reg.getter+" : "+reg.addedTime+" : "+reg.priority);
+                                       Logger.minor(this, "Running RegisterMe 
for "+reg.getter+" : "+reg.key.addedTime+" : "+reg.key.priority);
                                // Don't need to activate, fields should exist? 
FIXME
                                try {
                                        sched.register(reg.getter, true, reg);

Modified: branches/db4o/freenet/src/freenet/client/async/RegisterMe.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMe.java      
2008-06-25 20:43:31 UTC (rev 20716)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMe.java      
2008-06-25 20:54:28 UTC (rev 20717)
@@ -5,14 +5,12 @@
 public class RegisterMe {
        final SendableRequest getter;
        final ClientRequestSchedulerCore core;
-       final short priority;
-       final long addedTime;
+       final RegisterMeSortKey key;

        RegisterMe(SendableRequest getter, ClientRequestSchedulerCore core) {
                this.getter = getter;
                this.core = core;
-               this.addedTime = System.currentTimeMillis();
-               this.priority = getter.getPriorityClass();
+               this.key = new RegisterMeSortKey(getter.getPriorityClass());
        }
 }


Added: branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java       
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/client/async/RegisterMeSortKey.java       
2008-06-25 20:54:28 UTC (rev 20717)
@@ -0,0 +1,37 @@
+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-06-25 20:43:31 UTC 
(rev 20716)
+++ branches/db4o/freenet/src/freenet/node/Node.java    2008-06-25 20:54:28 UTC 
(rev 20717)
@@ -721,8 +721,7 @@
                /* Client-server mode. Refresh objects if you have a long-lived 
container! */
                
Db4o.configure().objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("key").indexed(true);
                
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("core").indexed(true);
-               
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("priority").indexed(true);
-               
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("addedTime").indexed(true);
+               
Db4o.configure().objectClass(freenet.client.async.RegisterMe.class).objectField("key").indexed(true);
                
Db4o.configure().objectClass(freenet.client.async.PersistentCooldownQueueItem.class).objectField("time").indexed(true);
                /** Maybe we want a different query evaluation mode?
                 * At the moment, a big splitfile insert will result in one 
SingleBlockInserter

Modified: branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java 
2008-06-25 20:43:31 UTC (rev 20716)
+++ branches/db4o/freenet/src/freenet/support/io/DelayedFreeBucket.java 
2008-06-25 20:54:28 UTC (rev 20717)
@@ -107,9 +107,21 @@
                return super.toString()+":"+bucket.toString();
        }

+       private transient int _activationCount = 0;
+       
        public void objectOnActivate(ObjectContainer container) {
+               StackTraceElement[] elements = 
Thread.currentThread().getStackTrace();
+               if(elements != null && elements.length > 40) {
+                       System.err.println("Infinite recursion in progress...");
+               }
+               synchronized(this) {
+                       _activationCount++;
+                       if(_activationCount > 10) {
+                               Logger.error(this, "Activated 10 times!!: 
"+super.toString());
+                       }
+               }
                if(Logger.shouldLog(Logger.MINOR, this))
-                       Logger.minor(this, "Activating "+super.toString());
+                       Logger.minor(this, "Activating "+super.toString()+" : 
"+bucket.getClass());
                if(bucket == this) {
                        Logger.error(this, "objectOnActivate on 
DelayedFreeBucket: wrapping self!!!");
                        return;


Reply via email to