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();
}