Author: toad
Date: 2008-06-14 19:57:18 +0000 (Sat, 14 Jun 2008)
New Revision: 20351
Modified:
branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
When a connection is closed, schedule a job on the DBJobRunner to check whether
we can remove it.
Implement removing FCPClient's from the database.
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-14
19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-14
19:57:18 UTC (rev 20351)
@@ -76,7 +76,7 @@
final RequestClient lowLevelClientTransient;
private transient RequestCompletionCallback completionCallback;
/** Connection mode */
- private final short persistenceType;
+ final short persistenceType;
public synchronized FCPConnectionHandler getConnection() {
return currentConnection;
@@ -310,4 +310,14 @@
completionCallback = cb;
return old;
}
+
+ public void removeFromDatabase(ObjectContainer container) {
+ container.delete(runningPersistentRequests);
+ container.delete(completedUnackedRequests);
+ container.delete(clientRequestsByIdentifier);
+ container.delete(toStart);
+ container.delete(lowLevelClientPersistent);
+ container.delete(lowLevelClientTransient);
+ container.delete(this);
+ }
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2008-06-14 19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
2008-06-14 19:57:18 UTC (rev 20351)
@@ -10,11 +10,16 @@
import java.util.Iterator;
import java.util.Random;
+import com.db4o.ObjectContainer;
+
+import freenet.client.async.ClientContext;
+import freenet.client.async.DBJob;
import freenet.support.HexUtil;
import freenet.support.Logger;
import freenet.support.api.BucketFactory;
import freenet.support.io.Closer;
import freenet.support.io.FileUtil;
+import freenet.support.io.NativeThread;
public class FCPConnectionHandler {
private static final class DirectoryAccess {
@@ -102,10 +107,16 @@
}
for(int i=0;i<requests.length;i++)
requests[i].onLostConnection();
- if((rebootClient != null) &&
!rebootClient.hasPersistentRequests())
- server.unregisterClient(rebootClient);
- if((foreverClient != null) &&
!foreverClient.hasPersistentRequests())
- server.unregisterClient(foreverClient);
+ server.core.clientContext.jobRunner.queue(new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ if((rebootClient != null) &&
!rebootClient.hasPersistentRequests(container))
+ server.unregisterClient(rebootClient,
container);
+ if((foreverClient != null) &&
!foreverClient.hasPersistentRequests(container))
+ server.unregisterClient(foreverClient,
container);
+ }
+
+ }, NativeThread.NORM_PRIORITY, false);
outputHandler.onClosed();
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
2008-06-14 19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPPersistentRoot.java
2008-06-14 19:57:18 UTC (rev 20351)
@@ -52,4 +52,10 @@
return client;
}
+ public void maybeUnregisterClient(FCPClient client, ObjectContainer
container) {
+ if(!client.hasPersistentRequests(container)) {
+ client.removeFromDatabase(container);
+ }
+ }
+
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-14
19:46:36 UTC (rev 20350)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-14
19:57:18 UTC (rev 20351)
@@ -468,7 +468,7 @@
}
}
if(handler != null)
-
oldClient.queuePendingMessagesOnConnectionRestart(handler.outputHandler);
+
oldClient.queuePendingMessagesOnConnectionRestart(handler.outputHandler, null);
return oldClient;
}
@@ -476,11 +476,16 @@
return persistentRoot.registerForeverClient(name, core,
handler, this, container);
}
- public void unregisterClient(FCPClient client) {
+ public void unregisterClient(FCPClient client, ObjectContainer
container) {
+ if(client.persistenceType == ClientRequest.PERSIST_REBOOT) {
+ assert(container == null);
synchronized(this) {
String name = client.name;
clientsByName.remove(name);
}
+ } else {
+ persistentRoot.maybeUnregisterClient(client, container);
+ }
}
private void loadPersistentRequests() {