Author: toad
Date: 2008-06-14 19:57:18 +0000 (Sat, 14 Jun 2008)
New Revision: 20351

Modified:
   branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
When a connection is closed, schedule a job on the DBJobRunner to check whether 
we can remove it.
Implement removing FCPClient's from the database.

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java   2008-06-14 
19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java   2008-06-14 
19:57:18 UTC (rev 20351)
@@ -76,7 +76,7 @@
        final RequestClient lowLevelClientTransient;
        private transient RequestCompletionCallback completionCallback;
        /** Connection mode */
-       private final short persistenceType;
+       final short persistenceType;

        public synchronized FCPConnectionHandler getConnection() {
                return currentConnection;
@@ -310,4 +310,14 @@
                completionCallback = cb;
                return old;
        }
+
+       public void removeFromDatabase(ObjectContainer container) {
+               container.delete(runningPersistentRequests);
+               container.delete(completedUnackedRequests);
+               container.delete(clientRequestsByIdentifier);
+               container.delete(toStart);
+               container.delete(lowLevelClientPersistent);
+               container.delete(lowLevelClientTransient);
+               container.delete(this);
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-14 19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-14 19:57:18 UTC (rev 20351)
@@ -10,11 +10,16 @@
 import java.util.Iterator;
 import java.util.Random;

+import com.db4o.ObjectContainer;
+
+import freenet.client.async.ClientContext;
+import freenet.client.async.DBJob;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.api.BucketFactory;
 import freenet.support.io.Closer;
 import freenet.support.io.FileUtil;
+import freenet.support.io.NativeThread;

 public class FCPConnectionHandler {
        private static final class DirectoryAccess {
@@ -102,10 +107,16 @@
                }
                for(int i=0;i<requests.length;i++)
                        requests[i].onLostConnection();
-               if((rebootClient != null) && 
!rebootClient.hasPersistentRequests())
-                       server.unregisterClient(rebootClient);
-               if((foreverClient != null) && 
!foreverClient.hasPersistentRequests())
-                       server.unregisterClient(foreverClient);
+               server.core.clientContext.jobRunner.queue(new DBJob() {
+
+                       public void run(ObjectContainer container, 
ClientContext context) {
+                               if((rebootClient != null) && 
!rebootClient.hasPersistentRequests(container))
+                                       server.unregisterClient(rebootClient, 
container);
+                               if((foreverClient != null) && 
!foreverClient.hasPersistentRequests(container))
+                                       server.unregisterClient(foreverClient, 
container);
+                       }
+                       
+               }, NativeThread.NORM_PRIORITY, false);
                outputHandler.onClosed();
        }


Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java   
2008-06-14 19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java   
2008-06-14 19:57:18 UTC (rev 20351)
@@ -52,4 +52,10 @@
                return client;
        }

+       public void maybeUnregisterClient(FCPClient client, ObjectContainer 
container) {
+               if(!client.hasPersistentRequests(container)) {
+                       client.removeFromDatabase(container);
+               }
+       }
+
 }

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-14 
19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-14 
19:57:18 UTC (rev 20351)
@@ -468,7 +468,7 @@
                        }
                }
                if(handler != null)
-                       
oldClient.queuePendingMessagesOnConnectionRestart(handler.outputHandler);
+                       
oldClient.queuePendingMessagesOnConnectionRestart(handler.outputHandler, null);
                return oldClient;
        }

@@ -476,11 +476,16 @@
                return persistentRoot.registerForeverClient(name, core, 
handler, this, container);
        }

-       public void unregisterClient(FCPClient client) {
+       public void unregisterClient(FCPClient client, ObjectContainer 
container) {
+               if(client.persistenceType == ClientRequest.PERSIST_REBOOT) {
+                       assert(container == null);
                synchronized(this) {
                        String name = client.name;
                        clientsByName.remove(name);
                }
+               } else {
+                       persistentRoot.maybeUnregisterClient(client, container);
+               }
        }

        private void loadPersistentRequests() {


Reply via email to