Author: toad
Date: 2008-06-21 17:28:46 +0000 (Sat, 21 Jun 2008)
New Revision: 20596

Modified:
   branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   branches/db4o/freenet/src/freenet/node/fcp/ListPersistentRequestsMessage.java
   branches/db4o/freenet/src/freenet/node/fcp/WatchGlobal.java
Log:
Create the foreverClient when we need it, if we are on the database thread.

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-06-21 17:09:10 UTC (rev 20595)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-06-21 17:28:46 UTC (rev 20596)
@@ -92,7 +92,8 @@
                if(global) {
                        client = persistenceType == PERSIST_FOREVER ? 
handler.server.globalForeverClient : handler.server.globalRebootClient;
                } else {
-                       client = persistenceType == PERSIST_FOREVER ? 
handler.getForeverClient() : handler.getRebootClient();
+                       
assert(!handler.server.core.clientDatabaseExecutor.onThread());
+                       client = persistenceType == PERSIST_FOREVER ? 
handler.getForeverClient(null) : handler.getRebootClient();
                }
                this.startupTime = System.currentTimeMillis();
        }

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-21 17:09:10 UTC (rev 20595)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-21 17:28:46 UTC (rev 20596)
@@ -177,12 +177,7 @@

                        public void run(ObjectContainer container, 
ClientContext context) {
                                try {
-                                       FCPClient client = 
server.registerForeverClient(name, server.core, FCPConnectionHandler.this, 
container);
-                                       synchronized(FCPConnectionHandler.this) 
{
-                                               foreverClient = client;
-                                               
FCPConnectionHandler.this.notifyAll();
-                                       }
-                                       
client.queuePendingMessagesOnConnectionRestart(outputHandler, container);
+                                       createForeverClient(name, container);
                                } catch (Throwable t) {
                                        Logger.error(this, "Caught "+t+" 
creating persistent client for "+name, t);
                                        failedGetForever = true;
@@ -198,6 +193,19 @@
                        Logger.minor(this, "Set client name: "+name);
        }

+       protected FCPClient createForeverClient(String name, ObjectContainer 
container) {
+               synchronized(FCPConnectionHandler.this) {
+                       if(foreverClient != null) return foreverClient;
+               }
+               FCPClient client = server.registerForeverClient(name, 
server.core, FCPConnectionHandler.this, container);
+               synchronized(FCPConnectionHandler.this) {
+                       foreverClient = client;
+                       FCPConnectionHandler.this.notifyAll();
+               }
+               client.queuePendingMessagesOnConnectionRestart(outputHandler, 
container);
+               return foreverClient;
+       }
+
        public String getClientName() {
                return clientName;
        }
@@ -395,16 +403,22 @@
                return rebootClient;
        }

-       public FCPClient getForeverClient() {
+       public FCPClient getForeverClient(ObjectContainer container) {
                synchronized(this) {
-                       while(foreverClient == null && (!failedGetForever) && 
(!isClosed)) {
-                               try {
-                                       wait();
-                               } catch (InterruptedException e) {
-                                       // Ignore
+                       if(foreverClient != null)
+                               return foreverClient;
+                       if(container == null) {
+                               while(foreverClient == null && 
(!failedGetForever) && (!isClosed)) {
+                                       try {
+                                               wait();
+                                       } catch (InterruptedException e) {
+                                               // Ignore
+                                       }
                                }
+                               return foreverClient;
+                       } else {
+                               return createForeverClient(clientName, 
container);
                        }
-                       return foreverClient;
                }
        }

@@ -580,7 +594,7 @@
                if(global)
                        return 
handler.server.globalForeverClient.getRequest(identifier, container);
                else
-                       return 
handler.getForeverClient().getRequest(identifier, container);
+                       return 
handler.getForeverClient(container).getRequest(identifier, container);
        }

        ClientRequest removePersistentRebootRequest(boolean global, String 
identifier) throws MessageInvalidException {
@@ -597,7 +611,7 @@
        ClientRequest removePersistentForeverRequest(boolean global, String 
identifier, ObjectContainer container) throws MessageInvalidException {
                FCPClient client =
                        global ? server.globalForeverClient :
-                       getForeverClient();
+                       getForeverClient(container);
                ClientRequest req = client.getRequest(identifier, container);
                if(req != null) {
                        client.removeByIdentifier(identifier, true, server, 
container);

Modified: 
branches/db4o/freenet/src/freenet/node/fcp/ListPersistentRequestsMessage.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/fcp/ListPersistentRequestsMessage.java   
    2008-06-21 17:09:10 UTC (rev 20595)
+++ 
branches/db4o/freenet/src/freenet/node/fcp/ListPersistentRequestsMessage.java   
    2008-06-21 17:28:46 UTC (rev 20596)
@@ -43,7 +43,7 @@
                node.clientCore.clientContext.jobRunner.queue(new DBJob() {

                        public void run(ObjectContainer container, 
ClientContext context) {
-                               FCPClient foreverClient = 
handler.getForeverClient();
+                               FCPClient foreverClient = 
handler.getForeverClient(container);
                                
foreverClient.queuePendingMessagesOnConnectionRestart(handler.outputHandler, 
container);
                                
foreverClient.queuePendingMessagesFromRunningRequests(handler.outputHandler, 
container);
                                if(handler.getRebootClient().watchGlobal) {

Modified: branches/db4o/freenet/src/freenet/node/fcp/WatchGlobal.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/WatchGlobal.java 2008-06-21 
17:09:10 UTC (rev 20595)
+++ branches/db4o/freenet/src/freenet/node/fcp/WatchGlobal.java 2008-06-21 
17:28:46 UTC (rev 20596)
@@ -48,7 +48,7 @@
                handler.server.core.clientContext.jobRunner.queue(new DBJob() {

                        public void run(ObjectContainer container, 
ClientContext context) {
-                               
handler.getForeverClient().setWatchGlobal(enabled, verbosityMask, 
handler.server, container);
+                               
handler.getForeverClient(container).setWatchGlobal(enabled, verbosityMask, 
handler.server, container);
                        }

                }, NativeThread.NORM_PRIORITY, false);


Reply via email to