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 {
+
+}