Author: toad
Date: 2008-06-16 22:02:42 +0000 (Mon, 16 Jun 2008)
New Revision: 20385

Modified:
   branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
Log:
Separate register() method. Register and start on database thread (where 
needed).

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java   2008-06-16 
21:49:43 UTC (rev 20384)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java   2008-06-16 
22:02:42 UTC (rev 20385)
@@ -101,7 +101,7 @@
        public ClientPut(FCPClient globalClient, FreenetURI uri, String 
identifier, int verbosity, 
                        short priorityClass, short persistenceType, String 
clientToken, boolean getCHKOnly,
                        boolean dontCompress, int maxRetries, short 
uploadFromType, File origFilename, String contentType,
-                       Bucket data, FreenetURI redirectTarget, String 
targetFilename, boolean earlyEncode, FCPServer server, ObjectContainer 
container) throws IdentifierCollisionException, NotAllowedException, 
FileNotFoundException, MalformedURLException {
+                       Bucket data, FreenetURI redirectTarget, String 
targetFilename, boolean earlyEncode, FCPServer server) throws 
IdentifierCollisionException, NotAllowedException, FileNotFoundException, 
MalformedURLException {
                super(uri, identifier, verbosity, null, globalClient, 
priorityClass, persistenceType, null, true, getCHKOnly, dontCompress, 
maxRetries, earlyEncode, server);
                if(uploadFromType == ClientPutMessage.UPLOAD_FROM_DISK) {
                        if(!server.core.allowUploadFrom(origFilename))
@@ -118,8 +118,6 @@
                // Now go through the fields one at a time
                String mimeType = contentType;
                this.clientToken = clientToken;
-               if(persistenceType != PERSIST_CONNECTION)
-                       client.register(this, false, container);
                Bucket tempData = data;
                ClientMetadata cm = new ClientMetadata(mimeType);
                boolean isMetadata = false;
@@ -153,13 +151,9 @@
                                getCHKOnly, isMetadata, 
                                client.lowLevelClient,
                                null, targetFilename, binaryBlob);
-               if(persistenceType != PERSIST_CONNECTION) {
-                       FCPMessage msg = persistentTagMessage();
-                       client.queueClientRequestMessage(msg, 0);
-               }
        }

-       public ClientPut(FCPConnectionHandler handler, ClientPutMessage 
message, FCPServer server, ObjectContainer container) throws 
IdentifierCollisionException, MessageInvalidException, MalformedURLException {
+       public ClientPut(FCPConnectionHandler handler, ClientPutMessage 
message, FCPServer server) throws IdentifierCollisionException, 
MessageInvalidException, MalformedURLException {
                super(message.uri, message.identifier, message.verbosity, 
handler, 
                                message.priorityClass, message.persistenceType, 
message.clientToken, message.global,
                                message.getCHKOnly, message.dontCompress, 
message.maxRetries, message.earlyEncode, server);
@@ -200,8 +194,6 @@
                        mimeType = DefaultMIMETypes.guessMIMEType(identifier, 
true);
                }
                clientToken = message.clientToken;
-               if(persistenceType != PERSIST_CONNECTION)
-                       client.register(this, false, container);
                Bucket tempData = message.bucket;
                ClientMetadata cm = new ClientMetadata(mimeType);
                boolean isMetadata = false;
@@ -265,12 +257,6 @@
                                getCHKOnly, isMetadata,
                                client.lowLevelClient,
                                null, targetFilename, binaryBlob);
-               if(persistenceType != PERSIST_CONNECTION) {
-                       FCPMessage msg = persistentTagMessage();
-                       client.queueClientRequestMessage(msg, 0);
-                       if(handler != null && (!handler.isGlobalSubscribed()))
-                               handler.outputHandler.queue(msg);
-               }
        }

        /**
@@ -366,6 +352,15 @@

        }

+       void register(ObjectContainer container, boolean lazyResume, boolean 
noTags) throws IdentifierCollisionException {
+               if(persistenceType != PERSIST_CONNECTION)
+                       client.register(this, false, container);
+               if(persistenceType != PERSIST_CONNECTION && !noTags) {
+                       FCPMessage msg = persistentTagMessage();
+                       client.queueClientRequestMessage(msg, 0);
+               }
+       }
+       
        public void start(ObjectContainer container, ClientContext context) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Starting "+this+" : "+identifier);

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java        
2008-06-16 21:49:43 UTC (rev 20384)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientPutDir.java        
2008-06-16 22:02:42 UTC (rev 20385)
@@ -42,7 +42,7 @@
        private final boolean wasDiskPut;

        public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage 
message, 
-                       HashMap manifestElements, boolean wasDiskPut, FCPServer 
server, ObjectContainer container) throws IdentifierCollisionException, 
MalformedURLException {
+                       HashMap manifestElements, boolean wasDiskPut, FCPServer 
server) throws IdentifierCollisionException, MalformedURLException {
                super(message.uri, message.identifier, message.verbosity, 
handler,
                                message.priorityClass, message.persistenceType, 
message.clientToken, message.global,
                                message.getCHKOnly, message.dontCompress, 
message.maxRetries, message.earlyEncode, server);
@@ -51,13 +51,6 @@
                this.manifestElements = manifestElements;
                this.defaultName = message.defaultName;
                makePutter();
-               if(persistenceType != PERSIST_CONNECTION) {
-                       client.register(this, false, container);
-                       FCPMessage msg = persistentTagMessage();
-                       client.queueClientRequestMessage(msg, 0);
-                       if(handler != null && (!handler.isGlobalSubscribed()))
-                               handler.outputHandler.queue(msg);
-               }
                if(putter != null) {
                        numberOfFiles = putter.countFiles();
                        totalSize = putter.totalSize();
@@ -71,7 +64,7 @@
        /**
        *       Puts a disk dir
        */
-       public ClientPutDir(FCPClient client, FreenetURI uri, String 
identifier, int verbosity, short priorityClass, short persistenceType, String 
clientToken, boolean getCHKOnly, boolean dontCompress, int maxRetries, File 
dir, String defaultName, boolean allowUnreadableFiles, boolean global, boolean 
earlyEncode, FCPServer server, ObjectContainer container) throws 
FileNotFoundException, IdentifierCollisionException, MalformedURLException {
+       public ClientPutDir(FCPClient client, FreenetURI uri, String 
identifier, int verbosity, short priorityClass, short persistenceType, String 
clientToken, boolean getCHKOnly, boolean dontCompress, int maxRetries, File 
dir, String defaultName, boolean allowUnreadableFiles, boolean global, boolean 
earlyEncode, FCPServer server) throws FileNotFoundException, 
IdentifierCollisionException, MalformedURLException {
                super(uri, identifier, verbosity , null, client, priorityClass, 
persistenceType, clientToken, global, getCHKOnly, dontCompress, maxRetries, 
earlyEncode, server);

                wasDiskPut = true;
@@ -79,11 +72,6 @@
                this.manifestElements = makeDiskDirManifest(dir, "", 
allowUnreadableFiles);
                this.defaultName = defaultName;
                makePutter();
-               if(persistenceType != PERSIST_CONNECTION) {
-                       client.register(this, false, container);
-                       FCPMessage msg = persistentTagMessage();
-                       client.queueClientRequestMessage(msg, 0);
-               }
                if(putter != null) {
                        numberOfFiles = putter.countFiles();
                        totalSize = putter.totalSize();
@@ -94,6 +82,15 @@
                if(logMINOR) Logger.minor(this, "Putting dir "+identifier+" : 
"+priorityClass);
        }

+       void register(ObjectContainer container, boolean lazyResume, boolean 
noTags) throws IdentifierCollisionException {
+               if(persistenceType != PERSIST_CONNECTION)
+                       client.register(this, false, container);
+               if(persistenceType != PERSIST_CONNECTION && !noTags) {
+                       FCPMessage msg = persistentTagMessage();
+                       client.queueClientRequestMessage(msg, 0);
+               }
+       }
+       
        private HashMap makeDiskDirManifest(File dir, String prefix, boolean 
allowUnreadableFiles) throws FileNotFoundException {

                HashMap map = new HashMap();

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-16 21:49:43 UTC (rev 20384)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-06-16 22:02:42 UTC (rev 20385)
@@ -261,7 +261,8 @@
        public void startClientPut(ClientPutMessage message) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Starting insert 
ID=\""+message.identifier+ '"');
-               String id = message.identifier;
+               final String id = message.identifier;
+               final boolean global = message.global;
                ClientPut cp = null;
                boolean persistent = message.persistenceType != 
ClientRequest.PERSIST_CONNECTION;
                FCPMessage failedMessage = null;
@@ -286,6 +287,25 @@
                                }
                                if(!persistent)
                                        requestsByIdentifier.put(id, cp);
+                               else if(message.persistenceType == 
ClientRequest.PERSIST_FOREVER) {
+                                       final ClientPut putter = cp;
+                                       
server.core.clientContext.jobRunner.queue(new DBJob() {
+
+                                               public void run(ObjectContainer 
container, ClientContext context) {
+                                                       try {
+                                                               
putter.register(container, false, false);
+                                                       } catch 
(IdentifierCollisionException e) {
+                                                               
Logger.normal(this, "Identifier collision on "+this);
+                                                               FCPMessage msg 
= new IdentifierCollisionMessage(id, global);
+                                                               
outputHandler.queue(msg);
+                                                               return;
+                                                       }
+                                                       putter.start(container, 
context);
+                                               }
+                                               
+                                       }, NativeThread.NORM_PRIORITY, false);
+                                       return; // Don't run the start() below
+                               }
                        }
                        if(!success) {
                                Logger.normal(this, "Identifier collision on 
"+this);
@@ -297,14 +317,15 @@
                        return;
                } else {
                        Logger.minor(this, "Starting "+cp);
-                       cp.start();
+                       cp.start(null, server.core.clientContext);
                }
        }

        public void startClientPutDir(ClientPutDirMessage message, HashMap 
buckets, boolean wasDiskPut) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Start ClientPutDir");
-               String id = message.identifier;
+               final String id = message.identifier;
+               final boolean global = message.global;
                ClientPutDir cp = null;
                FCPMessage failedMessage = null;
                boolean persistent = message.persistenceType != 
ClientRequest.PERSIST_CONNECTION;
@@ -330,6 +351,25 @@
                                        requestsByIdentifier.put(id, cp);
                                }
                                // FIXME register non-persistent requests in 
the constructors also, we already register persistent ones...
+                       } else if(message.persistenceType == 
ClientRequest.PERSIST_FOREVER) {
+                               final ClientPutDir putter = cp;
+                               server.core.clientContext.jobRunner.queue(new 
DBJob() {
+
+                                       public void run(ObjectContainer 
container, ClientContext context) {
+                                               try {
+                                                       
putter.register(container, false, false);
+                                               } catch 
(IdentifierCollisionException e) {
+                                                       Logger.normal(this, 
"Identifier collision on "+this);
+                                                       FCPMessage msg = new 
IdentifierCollisionMessage(id, global);
+                                                       
outputHandler.queue(msg);
+                                                       return;
+                                               }
+                                               putter.start(container, 
context);
+                                       }
+                                       
+                               }, NativeThread.NORM_PRIORITY, false);
+                               return; // Don't run the start() below
+                               
                        }
                        if(!success) {
                                Logger.normal(this, "Identifier collision on 
"+this);
@@ -344,7 +384,7 @@
                } else {
                        if(Logger.shouldLog(Logger.MINOR, this))
                                Logger.minor(this, "Starting "+cp);
-                       cp.start();
+                       cp.start(null, server.core.clientContext);
                }
        }



Reply via email to