Author: toad
Date: 2009-04-08 23:24:51 +0000 (Wed, 08 Apr 2009)
New Revision: 26667
Modified:
trunk/freenet/src/freenet/node/fcp/ClientGet.java
trunk/freenet/src/freenet/node/fcp/ClientPut.java
trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
trunk/freenet/src/freenet/node/fcp/ClientRequest.java
trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
trunk/freenet/src/freenet/node/fcp/FCPServer.java
Log:
FCPClient's other than the global queue are not necessarily activated. Hence we
need to run the constructors for ClientGet/Put/PutDir on the database thread,
in order to activate them.
Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java 2009-04-08 22:57:59 UTC
(rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java 2009-04-08 23:24:51 UTC
(rev 26667)
@@ -82,10 +82,10 @@
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) throws IdentifierCollisionException, NotAllowedException, IOException {
+ File returnFilename, File returnTempFilename, FCPServer
server, ObjectContainer container) throws IdentifierCollisionException,
NotAllowedException, IOException {
super(uri, identifier, verbosity, null, globalClient, prioClass,
(persistRebootOnly ?
ClientRequest.PERSIST_REBOOT : ClientRequest.PERSIST_FOREVER),
- null, true);
+ null, true, container);
fctx = new FetchContext(server.defaultFetchContext,
FetchContext.IDENTICAL_MASK, false, null);
fctx.eventProducer.addEventListener(this);
@@ -122,9 +122,9 @@
returnBucket, null);
}
- public ClientGet(FCPConnectionHandler handler, ClientGetMessage
message, FCPServer server) throws IdentifierCollisionException,
MessageInvalidException {
+ public ClientGet(FCPConnectionHandler handler, ClientGetMessage
message, FCPServer server, ObjectContainer container) throws
IdentifierCollisionException, MessageInvalidException {
super(message.uri, message.identifier, message.verbosity,
handler, message.priorityClass,
- message.persistenceType, message.clientToken,
message.global);
+ message.persistenceType, message.clientToken,
message.global, container);
// Create a Fetcher directly in order to get more fine-grained
control,
// since the client may override a few context elements.
fctx = new FetchContext(server.defaultFetchContext,
FetchContext.IDENTICAL_MASK, false, null);
Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java 2009-04-08 22:57:59 UTC
(rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java 2009-04-08 23:24:51 UTC
(rev 26667)
@@ -103,8 +103,8 @@
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) throws
IdentifierCollisionException, NotAllowedException, FileNotFoundException,
MalformedURLException, MetadataUnresolvedException {
- super(uri, identifier, verbosity, null, globalClient,
priorityClass, persistenceType, null, true, getCHKOnly, dontCompress,
maxRetries, earlyEncode, server);
+ Bucket data, FreenetURI redirectTarget, String
targetFilename, boolean earlyEncode, FCPServer server, ObjectContainer
container) throws IdentifierCollisionException, NotAllowedException,
FileNotFoundException, MalformedURLException, MetadataUnresolvedException {
+ super(uri, identifier, verbosity, null, globalClient,
priorityClass, persistenceType, null, true, getCHKOnly, dontCompress,
maxRetries, earlyEncode, server, container);
if(uploadFromType == ClientPutMessage.UPLOAD_FROM_DISK) {
if(!server.core.allowUploadFrom(origFilename))
throw new NotAllowedException();
@@ -145,10 +145,10 @@
null, targetFilename, binaryBlob);
}
- public ClientPut(FCPConnectionHandler handler, ClientPutMessage
message, FCPServer server) throws IdentifierCollisionException,
MessageInvalidException, MalformedURLException {
+ public ClientPut(FCPConnectionHandler handler, ClientPutMessage
message, FCPServer server, ObjectContainer container) 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);
+ message.getCHKOnly, message.dontCompress,
message.maxRetries, message.earlyEncode, server, container);
String salt = null;
byte[] saltedHash = null;
binaryBlob = message.binaryBlob;
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java 2009-04-08
22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java 2009-04-08
23:24:51 UTC (rev 26667)
@@ -62,8 +62,8 @@
public ClientPutBase(FreenetURI uri, String identifier, int verbosity,
FCPConnectionHandler handler,
short priorityClass, short persistenceType, String
clientToken, boolean global, boolean getCHKOnly,
- boolean dontCompress, int maxRetries, boolean
earlyEncode, FCPServer server) throws MalformedURLException {
- super(uri, identifier, verbosity, handler, priorityClass,
persistenceType, clientToken, global);
+ boolean dontCompress, int maxRetries, boolean
earlyEncode, FCPServer server, ObjectContainer container) throws
MalformedURLException {
+ super(uri, identifier, verbosity, handler, priorityClass,
persistenceType, clientToken, global, container);
this.getCHKOnly = getCHKOnly;
ctx = new InsertContext(server.defaultInsertContext, new
SimpleEventProducer());
ctx.dontCompress = dontCompress;
@@ -75,8 +75,8 @@
public ClientPutBase(FreenetURI uri, String identifier, int verbosity,
FCPConnectionHandler handler,
FCPClient client, short priorityClass, short
persistenceType, String clientToken, boolean global,
- boolean getCHKOnly, boolean dontCompress, int
maxRetries, boolean earlyEncode, FCPServer server) throws MalformedURLException
{
- super(uri, identifier, verbosity, handler, client,
priorityClass, persistenceType, clientToken, global);
+ boolean getCHKOnly, boolean dontCompress, int
maxRetries, boolean earlyEncode, FCPServer server, ObjectContainer container)
throws MalformedURLException {
+ super(uri, identifier, verbosity, handler, client,
priorityClass, persistenceType, clientToken, global, container);
this.getCHKOnly = getCHKOnly;
ctx = new InsertContext(server.defaultInsertContext, new
SimpleEventProducer());
ctx.dontCompress = dontCompress;
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2009-04-08
22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2009-04-08
23:24:51 UTC (rev 26667)
@@ -56,10 +56,10 @@
}
public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage
message,
- HashMap<String, Object> manifestElements, boolean
wasDiskPut, FCPServer server) throws IdentifierCollisionException,
MalformedURLException {
+ HashMap<String, Object> manifestElements, boolean
wasDiskPut, FCPServer server, ObjectContainer container) 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);
+ message.getCHKOnly, message.dontCompress,
message.maxRetries, message.earlyEncode, server, container);
logMINOR = Logger.shouldLog(Logger.MINOR, this);
this.wasDiskPut = wasDiskPut;
@@ -88,8 +88,8 @@
* Puts a disk dir
* @throws InsertException
*/
- 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);
+ 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 {
+ super(uri, identifier, verbosity , null, client, priorityClass,
persistenceType, clientToken, global, getCHKOnly, dontCompress, maxRetries,
earlyEncode, server, container);
wasDiskPut = true;
logMINOR = Logger.shouldLog(Logger.MINOR, this);
Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java 2009-04-08
22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java 2009-04-08
23:24:51 UTC (rev 26667)
@@ -73,7 +73,7 @@
}
public ClientRequest(FreenetURI uri2, String identifier2, int
verbosity2, FCPConnectionHandler handler,
- FCPClient client, short priorityClass2, short
persistenceType2, String clientToken2, boolean global) {
+ FCPClient client, short priorityClass2, short
persistenceType2, String clientToken2, boolean global, ObjectContainer
container) {
int hash = super.hashCode();
if(hash == 0) hash = 1;
hashCode = hash;
@@ -104,6 +104,10 @@
this.client = null;
} else {
origHandler = null;
+ if(persistenceType == PERSIST_FOREVER) {
+ container.activate(client, 1);
+ client.init(container);
+ }
this.client = client;
if(client != null)
assert(client.persistenceType ==
persistenceType);
@@ -113,7 +117,7 @@
}
public ClientRequest(FreenetURI uri2, String identifier2, int
verbosity2, FCPConnectionHandler handler,
- short priorityClass2, short persistenceType2, String
clientToken2, boolean global) {
+ short priorityClass2, short persistenceType2, String
clientToken2, boolean global, ObjectContainer container) {
int hash = super.hashCode();
if(hash == 0) hash = 1;
hashCode = hash;
@@ -148,7 +152,7 @@
client = persistenceType == PERSIST_FOREVER ?
handler.server.globalForeverClient : handler.server.globalRebootClient;
} else {
assert(!handler.server.core.clientDatabaseExecutor.onThread());
- client = persistenceType == PERSIST_FOREVER ?
handler.getForeverClient(null) : handler.getRebootClient();
+ client = persistenceType == PERSIST_FOREVER ?
handler.getForeverClient(container) : handler.getRebootClient();
}
lowLevelClient = client.lowLevelClient;
if(lowLevelClient == null)
Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2009-04-08 22:57:59 UTC (rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2009-04-08 23:24:51 UTC (rev 26667)
@@ -226,11 +226,13 @@
return clientName;
}
+ // FIXME next 3 methods are in need of refactoring!
+
/**
* Start a ClientGet. If there is an identifier collision, queue an
IdentifierCollisionMessage.
* 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) {
+ public void startClientGet(final ClientGetMessage message) {
final String id = message.identifier;
final boolean global = message.global;
ClientGet cg = null;
@@ -245,15 +247,27 @@
success = !requestsByIdentifier.containsKey(id);
if(success) {
try {
- cg = new ClientGet(this, message,
server);
- if(!persistent)
+
+ if(!persistent) {
+ cg = new ClientGet(this,
message, server, null);
requestsByIdentifier.put(id,
cg);
- else if(message.persistenceType ==
ClientRequest.PERSIST_FOREVER) {
- final ClientGet getter = cg;
+ } else if(message.persistenceType ==
ClientRequest.PERSIST_FOREVER) {
server.core.clientContext.jobRunner.queue(new DBJob() {
public void
run(ObjectContainer container, ClientContext context) {
+ ClientGet
getter;
try {
+ getter
= new ClientGet(FCPConnectionHandler.this, message, server, container);
+ } catch
(IdentifierCollisionException e1) {
+
Logger.normal(this, "Identifier collision on "+this);
+
FCPMessage msg = new IdentifierCollisionMessage(id, message.global);
+
outputHandler.queue(msg);
+ return;
+ } catch
(MessageInvalidException e1) {
+
outputHandler.queue(new ProtocolErrorMessage(e1.protocolCode, false,
e1.getMessage(), e1.ident, e1.global));
+ return;
+ }
+ try {
getter.register(container, false, false);
container.store(getter);
} catch
(IdentifierCollisionException e) {
@@ -268,6 +282,8 @@
},
NativeThread.HIGH_PRIORITY-1, false); // user wants a response soon... but
doesn't want it to block the queue page etc
return; // Don't run the
start() below
+ } else {
+ cg = new ClientGet(this,
message, server, null);
}
} catch (IdentifierCollisionException e) {
success = false;
@@ -310,24 +326,38 @@
else
success = !requestsByIdentifier.containsKey(id);
if(success) {
- try {
- cp = new ClientPut(this, message,
server);
- } catch (IdentifierCollisionException e) {
- success = false;
- } catch (MessageInvalidException e) {
- outputHandler.queue(new
ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
- return;
- } catch (MalformedURLException e) {
- failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
- }
- if(cp != null && !persistent)
+ if(cp != null && !persistent) {
+ try {
+ cp = new ClientPut(this,
message, server, null);
+ } catch (IdentifierCollisionException
e) {
+ success = false;
+ } catch (MessageInvalidException e) {
+ outputHandler.queue(new
ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
+ return;
+ } catch (MalformedURLException e) {
+ failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
+ }
requestsByIdentifier.put(id, cp);
- else if(cp != null && message.persistenceType
== ClientRequest.PERSIST_FOREVER) {
- final ClientPut putter = cp;
+ } else if(cp != null && message.persistenceType
== ClientRequest.PERSIST_FOREVER) {
server.core.clientContext.jobRunner.queue(new DBJob() {
public void run(ObjectContainer
container, ClientContext context) {
+ ClientPut putter;
try {
+ putter = new
ClientPut(FCPConnectionHandler.this, message, server, container);
+ } catch
(IdentifierCollisionException e) {
+
Logger.normal(this, "Identifier collision on "+this);
+ FCPMessage msg
= new IdentifierCollisionMessage(id, message.global);
+
outputHandler.queue(msg);
+ return;
+ } catch
(MessageInvalidException e) {
+
outputHandler.queue(new ProtocolErrorMessage(e.protocolCode, false,
e.getMessage(), e.ident, e.global));
+ return;
+ } catch
(MalformedURLException e) {
+
outputHandler.queue(new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global));
+ return;
+ }
+ try {
putter.register(container, false, false);
container.store(putter);
} catch
(IdentifierCollisionException e) {
@@ -342,6 +372,17 @@
}, NativeThread.HIGH_PRIORITY-1,
false); // user wants a response soon... but doesn't want it to block the queue
page etc
return; // Don't run the start() below
+ } else {
+ try {
+ cp = new ClientPut(this,
message, server, null);
+ } catch (IdentifierCollisionException
e) {
+ success = false;
+ } catch (MessageInvalidException e) {
+ outputHandler.queue(new
ProtocolErrorMessage(e.protocolCode, false, e.getMessage(), e.ident, e.global));
+ return;
+ } catch (MalformedURLException e) {
+ failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
+ }
}
}
if(!success) {
@@ -383,7 +424,7 @@
}
}
- public void startClientPutDir(ClientPutDirMessage message,
HashMap<String, Object> buckets, boolean wasDiskPut) {
+ public void startClientPutDir(final ClientPutDirMessage message, final
HashMap<String, Object> buckets, final boolean wasDiskPut) {
if(logMINOR)
Logger.minor(this, "Start ClientPutDir");
final String id = message.identifier;
@@ -401,24 +442,35 @@
success = !requestsByIdentifier.containsKey(id);
}
if(success) {
- try {
- cp = new ClientPutDir(this, message, buckets,
wasDiskPut, server);
- } catch (IdentifierCollisionException e) {
- success = false;
- } catch (MalformedURLException e) {
- failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
- }
if(cp != null && !persistent) {
- synchronized(this) {
- requestsByIdentifier.put(id, cp);
+ try {
+ cp = new ClientPutDir(this, message,
buckets, wasDiskPut, server, null);
+ synchronized(this) {
+ requestsByIdentifier.put(id,
cp);
+ }
+ } catch (IdentifierCollisionException e) {
+ success = false;
+ } catch (MalformedURLException e) {
+ failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
}
// FIXME register non-persistent requests in
the constructors also, we already register persistent ones...
} else if(cp != null && message.persistenceType ==
ClientRequest.PERSIST_FOREVER) {
- final ClientPutDir putter = cp;
server.core.clientContext.jobRunner.queue(new
DBJob() {
public void run(ObjectContainer
container, ClientContext context) {
+ ClientPutDir putter;
try {
+ putter = new
ClientPutDir(FCPConnectionHandler.this, message, buckets, wasDiskPut, server,
container);
+ } catch
(IdentifierCollisionException e) {
+ Logger.normal(this,
"Identifier collision on "+this);
+ FCPMessage msg = new
IdentifierCollisionMessage(id, message.global);
+
outputHandler.queue(msg);
+ return;
+ } catch (MalformedURLException
e) {
+ outputHandler.queue(new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global));
+ return;
+ }
+ try {
putter.register(container, false, false);
container.store(putter);
} catch
(IdentifierCollisionException e) {
@@ -434,6 +486,14 @@
}, NativeThread.HIGH_PRIORITY-1, false); //
user wants a response soon... but doesn't want it to block the queue page etc
return; // Don't run the start() below
+ } else {
+ try {
+ cp = new ClientPutDir(this, message,
buckets, wasDiskPut, server, null);
+ } catch (IdentifierCollisionException e) {
+ success = false;
+ } catch (MalformedURLException e) {
+ failedMessage = new
ProtocolErrorMessage(ProtocolErrorMessage.FREENET_URI_PARSE_ERROR, true, null,
id, message.global);
+ }
}
if(!success) {
Logger.normal(this, "Identifier collision on
"+this);
@@ -466,20 +526,12 @@
public FCPClient getForeverClient(ObjectContainer container) {
synchronized(this) {
- if(foreverClient != null)
- return foreverClient;
- if(container == null) {
- while(foreverClient == null &&
(!failedGetForever) && (!isClosed)) {
- try {
- wait();
- } catch (InterruptedException e) {
- // Ignore
- }
- }
- return foreverClient;
- } else {
- return createForeverClient(clientName,
container);
+ if(foreverClient == null) {
+ foreverClient = createForeverClient(clientName,
container);
}
+ container.activate(foreverClient, 1);
+ foreverClient.init(container);
+ return foreverClient;
}
}
Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java 2009-04-08 22:57:59 UTC
(rev 26666)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java 2009-04-08 23:24:51 UTC
(rev 26667)
@@ -889,7 +889,7 @@
new ClientGet(persistRebootOnly ? globalRebootClient :
globalForeverClient, fetchURI, defaultFetchContext.localRequestOnly,
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);
+
RequestStarter.BULK_SPLITFILE_PRIORITY_CLASS, returnFilename,
returnTempFilename, this, container);
cg.register(container, false, false);
cg.start(container, core.clientContext);
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs