Author: toad
Date: 2006-03-10 16:00:33 +0000 (Fri, 10 Mar 2006)
New Revision: 8211

Added:
   trunk/freenet/src/freenet/node/fcp/IdentifierCollisionException.java
Modified:
   trunk/freenet/src/freenet/client/async/ClientGetter.java
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/FCPClient.java
   trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
Log:
518:
Bugfixes relating to persistent request cancellation.
Minor architectural changes relating to per-connection versus persistent 
requests (division of responsibility between FCPConnHandler and FCPClient was 
confused).

Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-03-10 
13:09:42 UTC (rev 8210)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-03-10 
16:00:33 UTC (rev 8211)
@@ -106,10 +106,13 @@
        }

        public void cancel() {
+               Logger.minor(this, "Cancelling "+this);
                synchronized(this) {
                        super.cancel();
-                       if(currentState != null)
+                       if(currentState != null) {
+                               Logger.minor(this, "Cancelling "+currentState);
                                currentState.cancel();
+                       }
                }
        }


Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-10 13:09:42 UTC (rev 8210)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-10 16:00:33 UTC (rev 8211)
@@ -355,7 +355,7 @@
                                }

                                SplitFileFetcher sf = new 
SplitFileFetcher(metadata, rcb, parent, ctx, 
-                                               decompressors, clientMetadata, 
actx, recursionLevel, returnBucket);
+                                               decompressors, clientMetadata, 
actx, recursionLevel, returnBucket, false);
                                sf.schedule();
                                rcb.onBlockSetFinished(this);
                                // SplitFile will now run.

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2006-03-10 13:09:42 UTC (rev 8210)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2006-03-10 16:00:33 UTC (rev 8211)
@@ -61,7 +61,7 @@

        public SplitFileFetcher(Metadata metadata, GetCompletionCallback rcb, 
ClientGetter parent,
                        FetcherContext newCtx, LinkedList decompressors, 
ClientMetadata clientMetadata, 
-                       ArchiveContext actx, int recursionLevel, Bucket 
returnBucket) throws FetchException, MetadataParseException {
+                       ArchiveContext actx, int recursionLevel, Bucket 
returnBucket, boolean dontTellParent) throws FetchException, 
MetadataParseException {
                this.finished = false;
                this.returnBucket = returnBucket;
                this.fetchContext = newCtx;
@@ -73,6 +73,8 @@
                this.parent = parent;
                if(parent.isCancelled())
                        throw new FetchException(FetchException.CANCELLED);
+               if(!dontTellParent)
+                       parent.currentState = this;
                overrideLength = metadata.dataLength();
                this.splitfileType = metadata.getSplitfileType();
                splitfileDataBlocks = metadata.getSplitfileDataKeys();

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-10 13:09:42 UTC (rev 
8210)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-10 16:00:33 UTC (rev 
8211)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 517;
+       private static final int buildNumber = 518;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 507;

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-03-10 13:09:42 UTC 
(rev 8210)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-03-10 16:00:33 UTC 
(rev 8211)
@@ -5,7 +5,6 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.net.MalformedURLException;

 import freenet.client.FetchException;
 import freenet.client.FetchResult;
@@ -74,7 +73,7 @@
         * when we have proper persistence at the ClientGetter level. */
        private SimpleProgressMessage progressPending;

-       public ClientGet(FCPConnectionHandler handler, ClientGetMessage 
message) {
+       public ClientGet(FCPConnectionHandler handler, ClientGetMessage 
message) throws IdentifierCollisionException {
                uri = message.uri;
                clientToken = message.clientToken;
                // FIXME
@@ -221,6 +220,7 @@
        }

        public void cancel() {
+               Logger.minor(this, "Cancelling "+this);
                getter.cancel();
        }

@@ -351,11 +351,9 @@

        /** Request completed. But we may have to stick around until we are 
acked. */
        private void finish() {
-               if(persistenceType == ClientRequest.PERSIST_CONNECTION) {
+               if(persistenceType == ClientRequest.PERSIST_CONNECTION)
                        origHandler.finishedClientRequest(this);
-               } else {
-                       client.finishedClientRequest(this);
-               }
+               client.finishedClientRequest(this);
        }

        public void onSuccess(BaseClientPutter state) {

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-03-10 13:09:42 UTC 
(rev 8210)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-03-10 16:00:33 UTC 
(rev 8211)
@@ -73,7 +73,7 @@
        // ClientPutter level).
        private FCPMessage progressMessage;

-       public ClientPut(FCPConnectionHandler handler, ClientPutMessage 
message) {
+       public ClientPut(FCPConnectionHandler handler, ClientPutMessage 
message) throws IdentifierCollisionException {
                this.verbosity = message.verbosity;
                this.identifier = message.identifier;
                this.getCHKOnly = message.getCHKOnly;
@@ -298,11 +298,9 @@

        /** Request completed. But we may have to stick around until we are 
acked. */
        private void finish() {
-               if(persistenceType == ClientRequest.PERSIST_CONNECTION) {
+               if(persistenceType == ClientRequest.PERSIST_CONNECTION)
                        origHandler.finishedClientRequest(this);
-               } else {
-                       client.finishedClientRequest(this);
-               }
+               client.finishedClientRequest(this);
        }

        public boolean isPersistent() {

Modified: trunk/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-03-10 13:09:42 UTC 
(rev 8210)
+++ trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-03-10 16:00:33 UTC 
(rev 8211)
@@ -126,18 +126,23 @@
                        
((ClientRequest)reqs[i]).sendPendingMessages(outputHandler, true);
        }

-       public void register(ClientRequest cg) {
+       public void register(ClientRequest cg) throws 
IdentifierCollisionException {
                synchronized(this) {
+                       String ident = cg.getIdentifier();
+                       ClientRequest old = (ClientRequest) 
clientRequestsByIdentifier.get(ident);
+                       if(old != null && old != cg)
+                               throw new IdentifierCollisionException();
                        if(cg.hasFinished())
                                completedUnackedRequests.push(cg);
                        else
                                runningPersistentRequests.add(cg);
-                       clientRequestsByIdentifier.put(cg.getIdentifier(), cg);
+                       clientRequestsByIdentifier.put(ident, cg);
                }
        }

        public void removeByIdentifier(String identifier, boolean kill) throws 
MessageInvalidException {
                ClientRequest req;
+               Logger.minor(this, 
"removeByIdentifier("+identifier+","+kill+")");
                synchronized(this) {
                        req = (ClientRequest) 
clientRequestsByIdentifier.get(identifier);
                        if(req == null)
@@ -146,8 +151,10 @@
                                throw new 
MessageInvalidException(ProtocolErrorMessage.NO_SUCH_IDENTIFIER, "Not found", 
identifier);
                        clientRequestsByIdentifier.remove(identifier);
                }
-               if(kill)
+               if(kill) {
+                       Logger.minor(this, "Killing request "+req);
                        req.cancel();
+               }
                server.forceStorePersistentRequests();
        }


Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2006-03-10 13:09:42 UTC (rev 8210)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2006-03-10 16:00:33 UTC (rev 8211)
@@ -102,12 +102,22 @@
                String id = message.identifier;
                ClientGet cg = null;
                boolean success;
+               boolean persistent = message.persistenceType != 
ClientGet.PERSIST_CONNECTION;
                synchronized(this) {
                        if(isClosed) return;
-                       success = !requestsByIdentifier.containsKey(id);
+                       // We need to track non-persistent requests anyway, so 
we may as well check
+                       if(persistent)
+                               success = true;
+                       else
+                               success = !requestsByIdentifier.containsKey(id);
                        if(success) {
-                               cg = new ClientGet(this, message);
-                               requestsByIdentifier.put(id, cg);
+                               try {
+                                       cg = new ClientGet(this, message);
+                                       if(!persistent)
+                                               requestsByIdentifier.put(id, 
cg);
+                               } catch (IdentifierCollisionException e) {
+                                       success = false;
+                               }
                        }
                }
                if(!success) {
@@ -130,12 +140,22 @@
                String id = message.identifier;
                ClientPut cp = null;
                boolean success;
+               boolean persistent = message.persistenceType != 
ClientGet.PERSIST_CONNECTION;
                synchronized(this) {
                        if(isClosed) return;
-                       success = !requestsByIdentifier.containsKey(id);
+                       // We need to track non-persistent requests anyway, so 
we may as well check
+                       if(persistent)
+                               success = true;
+                       else
+                               success = !requestsByIdentifier.containsKey(id);
                        if(success) {
-                               cp = new ClientPut(this, message);
-                               requestsByIdentifier.put(id, cp);
+                               try {
+                                       cp = new ClientPut(this, message);
+                               } catch (IdentifierCollisionException e) {
+                                       success = false;
+                               }
+                               if(!persistent)
+                                       requestsByIdentifier.put(id, cp);
                        }
                }
                if(!success) {

Added: trunk/freenet/src/freenet/node/fcp/IdentifierCollisionException.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/IdentifierCollisionException.java        
2006-03-10 13:09:42 UTC (rev 8210)
+++ trunk/freenet/src/freenet/node/fcp/IdentifierCollisionException.java        
2006-03-10 16:00:33 UTC (rev 8211)
@@ -0,0 +1,8 @@
+package freenet.node.fcp;
+
+/**
+ * Thrown to indicate reuse of an Identifier.
+ */
+public class IdentifierCollisionException extends Exception {
+
+}


Reply via email to