Author: toad
Date: 2008-06-16 21:49:43 +0000 (Mon, 16 Jun 2008)
New Revision: 20384

Modified:
   branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java
   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/FCPServer.java
Log:
ClientGet.register() - separate from constructor, so we can call the 
constructor on-thread and register off-thread.

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java   2008-06-16 
21:31:11 UTC (rev 20383)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java   2008-06-16 
21:49:43 UTC (rev 20384)
@@ -77,7 +77,7 @@
        public ClientGet(FCPClient globalClient, FreenetURI uri, boolean 
dsOnly, boolean ignoreDS,
                        int maxSplitfileRetries, int maxNonSplitfileRetries, 
long maxOutputLength,
                        short returnType, boolean persistRebootOnly, String 
identifier, int verbosity, short prioClass,
-                       File returnFilename, File returnTempFilename, FCPServer 
server, ObjectContainer container) throws IdentifierCollisionException, 
NotAllowedException {
+                       File returnFilename, File returnTempFilename, FCPServer 
server) throws IdentifierCollisionException, NotAllowedException {
                super(uri, identifier, verbosity, null, globalClient, prioClass,
                                (persistRebootOnly ? 
ClientRequest.PERSIST_REBOOT : ClientRequest.PERSIST_FOREVER),
                                null, true);
@@ -120,23 +120,12 @@
                        }
                }
                returnBucket = ret;
-               if(persistenceType != PERSIST_CONNECTION)
-                       try {
-                               client.register(this, false, container);
-                       } catch (IdentifierCollisionException e) {
-                               ret.free();
-                               throw e;
-                       }
                        getter = new ClientGetter(this, 
server.core.requestStarters.chkFetchScheduler, 
server.core.requestStarters.sskFetchScheduler, uri, fctx, priorityClass,
                                        client.lowLevelClient,
                                        returnBucket, null);
-                       if(persistenceType != PERSIST_CONNECTION) {
-                               FCPMessage msg = persistentTagMessage();
-                               client.queueClientRequestMessage(msg, 0);
-                       }
        }
-
-       public ClientGet(FCPConnectionHandler handler, ClientGetMessage 
message, FCPServer server, ObjectContainer container) throws 
IdentifierCollisionException, MessageInvalidException {
+       
+       public ClientGet(FCPConnectionHandler handler, ClientGetMessage 
message, FCPServer server) throws IdentifierCollisionException, 
MessageInvalidException {
                super(message.uri, message.identifier, message.verbosity, 
handler, message.priorityClass,
                                message.persistenceType, message.clientToken, 
message.global);
                // Create a Fetcher directly in order to get more fine-grained 
control,
@@ -192,23 +181,10 @@
                if(ret == null)
                        Logger.error(this, "Impossible: ret = null in FCP 
constructor for "+this, new Exception("debug"));
                returnBucket = ret;
-               if(persistenceType != PERSIST_CONNECTION)
-                       try {
-                               client.register(this, false, container);
-                       } catch (IdentifierCollisionException e) {
-                               ret.free();
-                               throw e;
-                       }
                        getter = new ClientGetter(this, 
server.core.requestStarters.chkFetchScheduler, 
                                        
server.core.requestStarters.sskFetchScheduler, uri, fctx, priorityClass, 
                                        client.lowLevelClient, 
                                        binaryBlob ? new NullBucket() : 
returnBucket, binaryBlob ? returnBucket : null);
-                       if(persistenceType != PERSIST_CONNECTION) {
-                               FCPMessage msg = persistentTagMessage();
-                               client.queueClientRequestMessage(msg, 0);
-                               if(handler != null && 
(!handler.isGlobalSubscribed()))
-                                       handler.outputHandler.queue(msg);
-                       }
        }

        /**
@@ -309,15 +285,28 @@
                                binaryBlob ? new NullBucket() : returnBucket, 
                                                binaryBlob ? returnBucket : 
null);

-               if(persistenceType != PERSIST_CONNECTION) {
-                       FCPMessage msg = persistentTagMessage();
-                       client.queueClientRequestMessage(msg, 0);
-               }
-
                if(finished && succeeded)
                                allDataPending = new 
AllDataMessage(returnBucket, identifier, global, startupTime, completionTime);
        }

+       /**
+        * Must be called just after construction, but within a transaction.
+        * @throws IdentifierCollisionException If the identifier is already in 
use.
+        */
+       void register(ObjectContainer container, boolean lazyResume, boolean 
noTags) throws IdentifierCollisionException {
+               if(persistenceType != PERSIST_CONNECTION)
+                       try {
+                               client.register(this, lazyResume, container);
+                       } catch (IdentifierCollisionException e) {
+                               returnBucket.free();
+                               throw e;
+                       }
+                       if(persistenceType != PERSIST_CONNECTION && !noTags) {
+                               FCPMessage msg = persistentTagMessage();
+                               client.queueClientRequestMessage(msg, 0);
+                       }
+       }
+
        public void start(ObjectContainer container, ClientContext context) {
                try {
                        synchronized(this) {

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-06-16 21:31:11 UTC (rev 20383)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-06-16 21:49:43 UTC (rev 20384)
@@ -173,7 +173,7 @@
                        boolean lazyResume = server.core.lazyResume();
                        if(type.equals("GET")) {
                                ClientGet cg = new ClientGet(fs, client, 
server);
-                               client.register(cg, lazyResume);
+                               cg.register(container, lazyResume, true);
                                if(!lazyResume) cg.start();
                                return cg;
                        } else if(type.equals("PUT")) {

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-16 21:31:11 UTC (rev 20383)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-16 21:49:43 UTC (rev 20384)
@@ -204,7 +204,8 @@
         * Hence, we can run stuff on other threads if we need to, as long as 
we send the right messages.
         */
        public void startClientGet(ClientGetMessage message) {
-               String id = message.identifier;
+               final String id = message.identifier;
+               final boolean global = message.global;
                ClientGet cg = null;
                boolean success;
                boolean persistent = message.persistenceType != 
ClientRequest.PERSIST_CONNECTION;
@@ -220,6 +221,25 @@
                                        cg = new ClientGet(this, message, 
server);
                                        if(!persistent)
                                                requestsByIdentifier.put(id, 
cg);
+                                       else if(message.persistenceType == 
ClientRequest.PERSIST_FOREVER) {
+                                               final ClientGet getter = cg;
+                                               
server.core.clientContext.jobRunner.queue(new DBJob() {
+
+                                                       public void 
run(ObjectContainer container, ClientContext context) {
+                                                               try {
+                                                                       
getter.register(container, false, false);
+                                                               } catch 
(IdentifierCollisionException e) {
+                                                                       
Logger.normal(this, "Identifier collision on "+this);
+                                                                       
FCPMessage msg = new IdentifierCollisionMessage(id, global);
+                                                                       
outputHandler.queue(msg);
+                                                                       return;
+                                                               }
+                                                               
getter.start(container, context);
+                                                       }
+                                                       
+                                               }, NativeThread.NORM_PRIORITY, 
false);
+                                               return; // Don't run the 
start() below
+                                       }
                                } catch (IdentifierCollisionException e) {
                                        success = false;
                                } catch (MessageInvalidException e) {
@@ -234,7 +254,7 @@
                        outputHandler.queue(msg);
                        return;
                } else {
-                       cg.start();
+                       cg.start(null, server.core.clientContext);
                }
        }


Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-16 
21:31:11 UTC (rev 20383)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-16 
21:49:43 UTC (rev 20384)
@@ -656,6 +656,7 @@
                                        defaultFetchContext.ignoreStore, 
QUEUE_MAX_RETRIES, QUEUE_MAX_RETRIES,
                                        QUEUE_MAX_DATA_SIZE, returnType, 
persistRebootOnly, id, Integer.MAX_VALUE,
                                        
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, returnFilename, 
returnTempFilename, this);
+               cg.register(container, false, false);
                cg.start();
        }



Reply via email to