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