Author: toad
Date: 2008-05-22 18:30:05 +0000 (Thu, 22 May 2008)
New Revision: 20043

Modified:
   branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
Log:
Use the new persistent cooldown queue.

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-05-22 18:22:55 UTC (rev 20042)
+++ branches/db4o/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-05-22 18:30:05 UTC (rev 20043)
@@ -90,7 +90,8 @@
        private final RequestStarter starter;
        private final Node node;
        public final String name;
-       private final CooldownQueue cooldownQueue;
+       private final CooldownQueue transientCooldownQueue;
+       private final CooldownQueue persistentCooldownQueue;

        public static final String PRIORITY_NONE = "NONE";
        public static final String PRIORITY_SOFT = "SOFT";
@@ -99,8 +100,9 @@

        public ClientRequestScheduler(boolean forInserts, boolean forSSKs, 
RandomSource random, RequestStarter starter, Node node, NodeClientCore core, 
SubConfig sc, String name) {
                this.selectorContainer = node.dbServer.openClient();
-               schedCore = ClientRequestSchedulerCore.create(node, forInserts, 
forSSKs, selectorContainer);
+               schedCore = ClientRequestSchedulerCore.create(node, forInserts, 
forSSKs, selectorContainer, COOLDOWN_PERIOD);
                schedTransient = new ClientRequestSchedulerNonPersistent(this);
+               persistentCooldownQueue = schedCore.persistentCooldownQueue;
                this.starter = starter;
                this.random = random;
                this.node = node;
@@ -122,9 +124,9 @@
                        offeredKeys = null;
                }
                if(!forInserts)
-                       cooldownQueue = new 
RequestCooldownQueue(COOLDOWN_PERIOD);
+                       transientCooldownQueue = new 
RequestCooldownQueue(COOLDOWN_PERIOD);
                else
-                       cooldownQueue = null;
+                       transientCooldownQueue = null;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }

@@ -226,8 +228,10 @@
                        for(int i=0;i<offeredKeys.length;i++)
                                offeredKeys[i].remove(key);
                }
-               if(cooldownQueue != null)
-                       cooldownQueue.removeKey(key, getter, 
getter.getCooldownWakeupByKey(key));
+               if(transientCooldownQueue != null)
+                       transientCooldownQueue.removeKey(key, getter, 
getter.getCooldownWakeupByKey(key));
+               if(persistentCooldownQueue != null)
+                       persistentCooldownQueue.removeKey(key, getter, 
getter.getCooldownWakeupByKey(key));
        }

        /**
@@ -280,13 +284,14 @@
                final SendableGet[] gets = schedCore.removePendingKey(key);
                final SendableGet[] transientGets = 
schedTransient.removePendingKey(key);
                if(gets == null) return;
-               if(cooldownQueue != null) {
+               if(transientCooldownQueue != null) {
                        for(int i=0;i<gets.length;i++)
-                               cooldownQueue.removeKey(key, gets[i], 
gets[i].getCooldownWakeupByKey(key));
+                               transientCooldownQueue.removeKey(key, 
transientGets[i], transientGets[i].getCooldownWakeupByKey(key));
+               }
+               if(persistentCooldownQueue != null) {
                        for(int i=0;i<gets.length;i++)
-                               cooldownQueue.removeKey(key, transientGets[i], 
transientGets[i].getCooldownWakeupByKey(key));
+                               persistentCooldownQueue.removeKey(key, gets[i], 
gets[i].getCooldownWakeupByKey(key));
                }
-
                Runnable r = new Runnable() {
                        public void run() {
                                if(logMINOR) Logger.minor(this, "Running 
"+gets.length+" callbacks off-thread for "+block.getKey());
@@ -341,14 +346,22 @@
        }

        public long queueCooldown(ClientKey key, SendableGet getter) {
-               return cooldownQueue.add(key.getNodeKey(), getter);
+               if(getter.persistent())
+                       return persistentCooldownQueue.add(key.getNodeKey(), 
getter);
+               else
+                       return transientCooldownQueue.add(key.getNodeKey(), 
getter);
        }

        public void moveKeysFromCooldownQueue() {
-               if(cooldownQueue == null) return;
+               moveKeysFromCooldownQueue(transientCooldownQueue);
+               moveKeysFromCooldownQueue(persistentCooldownQueue);
+       }
+       
+       private void moveKeysFromCooldownQueue(CooldownQueue queue) {
+               if(queue == null) return;
                long now = System.currentTimeMillis();
                Key key;
-               while((key = cooldownQueue.removeKeyBefore(now)) != null) { 
+               while((key = queue.removeKeyBefore(now)) != null) { 
                        if(logMINOR) Logger.minor(this, "Restoring key: "+key);
                        SendableGet[] gets = 
schedCore.getClientsForPendingKey(key);
                        SendableGet[] transientGets = 
schedTransient.getClientsForPendingKey(key);

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-05-22 18:22:55 UTC (rev 20042)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerCore.java  
    2008-05-22 18:30:05 UTC (rev 20043)
@@ -34,9 +34,7 @@
        private static boolean logMINOR;
        /** Identifier in the database for the node we are attached to */
        private final long nodeDBHandle;
-       // FIXME cooldown queue ????
-       // Can we make the cooldown queue non-persistent? It refers to 
SendableGet's ... so
-       // keeping it in memory may be a problem...
+       final PersistentCooldownQueue persistentCooldownQueue;

        /**
         * Fetch a ClientRequestSchedulerCore from the database, or create a 
new one.
@@ -46,7 +44,7 @@
         * @param selectorContainer
         * @return
         */
-       public static ClientRequestSchedulerCore create(Node node, final 
boolean forInserts, final boolean forSSKs, ObjectContainer selectorContainer) {
+       public static ClientRequestSchedulerCore create(Node node, final 
boolean forInserts, final boolean forSSKs, ObjectContainer selectorContainer, 
long cooldownTime) {
                final long nodeDBHandle = node.nodeDBHandle;
                ObjectSet results = selectorContainer.query(new Predicate() {
                        public boolean match(ClientRequestSchedulerCore core) {
@@ -60,17 +58,24 @@
                if(results.hasNext()) {
                        core = (ClientRequestSchedulerCore) (results.next());
                } else {
-                       core = new ClientRequestSchedulerCore(node, forInserts, 
forSSKs, selectorContainer);
+                       core = new ClientRequestSchedulerCore(node, forInserts, 
forSSKs, selectorContainer, cooldownTime);
                }
                logMINOR = Logger.shouldLog(Logger.MINOR, 
ClientRequestSchedulerCore.class);
                core.onStarted(selectorContainer);
                return core;
        }

-       ClientRequestSchedulerCore(Node node, boolean forInserts, boolean 
forSSKs, ObjectContainer selectorContainer) {
+       ClientRequestSchedulerCore(Node node, boolean forInserts, boolean 
forSSKs, ObjectContainer selectorContainer, long cooldownTime) {
                super(forInserts, forSSKs, forInserts ? null : 
selectorContainer.ext().collections().newHashMap(1024), 
selectorContainer.ext().collections().newHashMap(32), 
selectorContainer.ext().collections().newLinkedList());
                this.nodeDBHandle = node.nodeDBHandle;
                this.container = selectorContainer;
+               if(!forInserts) {
+                       this.persistentCooldownQueue = new 
PersistentCooldownQueue();
+                       persistentCooldownQueue.setContainer(container);
+                       persistentCooldownQueue.setCooldownTime(cooldownTime);
+               } else {
+                       this.persistentCooldownQueue = null;
+               }
        }

        private void onStarted(ObjectContainer container) {


Reply via email to