Author: toad
Date: 2008-06-17 15:44:04 +0000 (Tue, 17 Jun 2008)
New Revision: 20403
Modified:
branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
Fix panic button. Untested.
Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
2008-06-17 15:24:19 UTC (rev 20402)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
2008-06-17 15:44:04 UTC (rev 20403)
@@ -165,30 +165,20 @@
return;
} else if(request.isPartSet("remove_AllRequests") &&
(request.getPartAsString("remove_AllRequests", 32).length() > 0)) {
+ // FIXME panic button should just dump the
entire database ???
+ // FIXME what about non-global requests ???
+
ClientRequest[] reqs = fcp.getGlobalRequests();
if(logMINOR) Logger.minor(this, "Request count:
"+reqs.length);
StringBuffer failedIdentifiers = new
StringBuffer();
- for(int i=0; i<reqs.length ; i++){
- String identifier =
reqs[i].getIdentifier();
- if(logMINOR) Logger.minor(this,
"Removing "+identifier);
- try {
-
fcp.removeGlobalRequest(identifier);
- } catch (MessageInvalidException e) {
-
failedIdentifiers.append(identifier + ' ' + e.getMessage() + ';');
- Logger.error(this, "Failed to
remove " + identifier + ':' + e.getMessage());
- continue;
- }
- }
+ boolean success =
fcp.removeAllGlobalRequestsBlocking();
- if(failedIdentifiers.length() > 0)
+ if(!success)
this.sendErrorPage(ctx, 200,
L10n.getString("QueueToadlet.failedToRemoveRequest"),
-
L10n.getString("QueueToadlet.failedToRemoveId",
- new
String[]{ "id" },
- new
String[]{ failedIdentifiers.toString() }
- ));
+
L10n.getString("QueueToadlet.failedToRemoveAll"));
else
writePermanentRedirect(ctx, "Done",
"/queue/");
return;
Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
2008-06-17 15:24:19 UTC (rev 20402)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
2008-06-17 15:44:04 UTC (rev 20403)
@@ -924,6 +924,7 @@
QueueToadlet.failedDU=Failed directory uploads (${size})
QueueToadlet.failedToRemove=Failed to remove ${id}: ${message}
QueueToadlet.failedToRemoveId=Failed to remove: ${id}
+QueueToadlet.failedToRemoveAll=Failed to remove all requests. Either delete
them manually, or shutdown and delete the client layer database manually.
QueueToadlet.failedToRemoveRequest=Failed to remove request
QueueToadlet.failedToRestart=Failed to restart: ${id}
QueueToadlet.failedToRestartRequest=Failed to restart request
Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
2008-06-17 15:24:19 UTC (rev 20402)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
2008-06-17 15:44:04 UTC (rev 20403)
@@ -378,4 +378,9 @@
}, NativeThread.HIGH_PRIORITY, false);
}
+
+ public void delete(ObjectContainer container) {
+ container.delete(this);
+ // FIXME delete underlying structures
+ }
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-17
15:24:19 UTC (rev 20402)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java 2008-06-17
15:44:04 UTC (rev 20403)
@@ -328,4 +328,37 @@
container.delete(lowLevelClient);
container.delete(this);
}
+
+ public void removeAll(ObjectContainer container) {
+ HashSet toKill = new HashSet();
+ synchronized(this) {
+ Iterator i = runningPersistentRequests.iterator();
+ while(i.hasNext()) {
+ ClientRequest req = (ClientRequest) i.next();
+ toKill.add(req);
+ }
+ runningPersistentRequests.clear();
+ for(int j=0;j<completedUnackedRequests.size();j++)
+ toKill.add(completedUnackedRequests.get(j));
+ completedUnackedRequests.clear();
+ i = clientRequestsByIdentifier.values().iterator();
+ while(i.hasNext()) {
+ ClientRequest req = (ClientRequest) i.next();
+ toKill.add(req);
+ }
+ clientRequestsByIdentifier.clear();
+ i = toStart.iterator();
+ while(i.hasNext()) {
+ ClientRequest req = (ClientRequest) i.next();
+ toKill.add(req);
+ }
+ toStart.clear();
+ }
+ Iterator i = toStart.iterator();
+ while(i.hasNext()) {
+ ClientRequest req = (ClientRequest) i.next();
+ req.cancel();
+ req.delete(container);
+ }
+ }
}
Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-17
15:24:19 UTC (rev 20402)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java 2008-06-17
15:44:04 UTC (rev 20403)
@@ -566,20 +566,24 @@
return (ClientRequest[]) v.toArray(new ClientRequest[v.size()]);
}
- public void removeGlobalRequestBlocking(final String identifier) throws
MessageInvalidException {
+ public boolean removeGlobalRequestBlocking(final String identifier)
throws MessageInvalidException {
if(!globalRebootClient.removeByIdentifier(identifier, true,
this, null)) {
final Object sync = new Object();
final MutableBoolean done = new MutableBoolean();
+ final MutableBoolean success = new MutableBoolean();
done.value = false;
core.clientContext.jobRunner.queue(new DBJob() {
public void run(ObjectContainer container,
ClientContext context) {
+ boolean succeeded = false;
try {
-
globalForeverClient.removeByIdentifier(identifier, true, FCPServer.this,
container);
+ succeeded =
globalForeverClient.removeByIdentifier(identifier, true, FCPServer.this,
container);
} catch (Throwable t) {
Logger.error(this, "Caught
removing identifier "+identifier+": "+t, t);
} finally {
synchronized(sync) {
+ success.value =
succeeded;
+ done.value = true;
sync.notifyAll();
}
}
@@ -594,7 +598,49 @@
// Ignore
}
}
+ return success.value;
}
+ } else return true;
+ }
+
+ public boolean removeAllGlobalRequestsBlocking() {
+ globalRebootClient.removeAll(null);
+
+ final Object sync = new Object();
+ final MutableBoolean done = new MutableBoolean();
+ final MutableBoolean success = new MutableBoolean();
+ done.value = false;
+ core.clientContext.jobRunner.queue(new DBJob() {
+
+ public void run(ObjectContainer container,
ClientContext context) {
+ boolean succeeded = false;
+ try {
+
globalForeverClient.removeAll(container);
+ succeeded = true;
+ } catch (Throwable t) {
+ Logger.error(this, "Caught while
processing panic: "+t, t);
+ System.err.println("PANIC INCOMPLETE:
CAUGHT "+t);
+ t.printStackTrace();
+ System.err.println("Your requests have
not been deleted!");
+ } finally {
+ synchronized(sync) {
+ success.value = succeeded;
+ done.value = true;
+ sync.notifyAll();
+ }
+ }
+ }
+
+ }, NativeThread.HIGH_PRIORITY, false);
+ synchronized(sync) {
+ while(!done.value) {
+ try {
+ sync.wait();
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ }
+ return success.value;
}
}