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



Reply via email to