Author: toad
Date: 2008-06-16 16:29:20 +0000 (Mon, 16 Jun 2008)
New Revision: 20366
Modified:
branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
Log:
Get the foreverClient on the database thread too
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2008-06-16 16:20:51 UTC (rev 20365)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2008-06-16 16:29:20 UTC (rev 20366)
@@ -64,6 +64,7 @@
private String clientName;
private FCPClient rebootClient;
private FCPClient foreverClient;
+ private boolean failedGetForever;
final BucketFactory bf;
final HashMap requestsByIdentifier;
protected final String connectionIdentifier;
@@ -167,10 +168,29 @@
}
}
- public void setClientName(String name) {
+ public void setClientName(final String name) {
this.clientName = name;
rebootClient = server.registerRebootClient(name, server.core,
this);
- foreverClient = server.registerForeverClient(name, server.core,
this);
+ server.core.clientContext.jobRunner.queue(new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ try {
+ FCPClient client =
server.registerForeverClient(name, server.core, FCPConnectionHandler.this,
container);
+ synchronized(FCPConnectionHandler.this)
{
+ foreverClient = client;
+
FCPConnectionHandler.this.notifyAll();
+ }
+ } catch (Throwable t) {
+ Logger.error(this, "Caught "+t+"
creating persistent client for "+name, t);
+ failedGetForever = true;
+ synchronized(FCPConnectionHandler.this)
{
+ failedGetForever = true;
+
FCPConnectionHandler.this.notifyAll();
+ }
+ }
+ }
+
+ }, NativeThread.NORM_PRIORITY, false);
if(Logger.shouldLog(Logger.MINOR, this))
Logger.minor(this, "Set client name: "+name);
}
@@ -327,7 +347,16 @@
}
public FCPClient getForeverClient() {
- return foreverClient;
+ synchronized(this) {
+ while(foreverClient == null && (!failedGetForever) &&
(!isClosed)) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ return foreverClient;
+ }
}
public void finishedClientRequest(ClientRequest get) {