Author: toad
Date: 2008-04-16 18:37:39 +0000 (Wed, 16 Apr 2008)
New Revision: 19379

Modified:
   trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/clients/http/QueueToadlet.java
   trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
   trunk/freenet/src/freenet/node/DNSRequester.java
   trunk/freenet/src/freenet/node/NodeClientCore.java
   trunk/freenet/src/freenet/node/RequestStarter.java
   trunk/freenet/src/freenet/node/TestnetHandler.java
   trunk/freenet/src/freenet/node/TestnetStatusUploader.java
   trunk/freenet/src/freenet/node/TextModeClientInterfaceServer.java
   trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java
   trunk/freenet/src/freenet/node/fcp/FCPClient.java
   trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   trunk/freenet/src/freenet/node/fcp/FCPMessage.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
   trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
   trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
   trunk/freenet/src/freenet/node/fcp/RequestCompletionCallback.java
   trunk/freenet/src/freenet/pluginmanager/FredPluginFCP.java
   trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
   trunk/freenet/src/freenet/support/PooledExecutor.java
   trunk/freenet/test/freenet/support/FieldsTest.java
Log:
Undo the revert.



Modified: trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java  
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java  
2008-04-16 18:37:39 UTC (rev 19379)
@@ -3,13 +3,15 @@
 import java.lang.ref.SoftReference;
 import java.util.ArrayList;

+import freenet.node.PrioRunnable;
 import freenet.support.Logger;
+import freenet.support.io.NativeThread;

 /**
  * Keeps a queue of SingleBlockInserter's to encode.
  * Encodes them.
  */
-public class BackgroundBlockEncoder implements Runnable {
+public class BackgroundBlockEncoder implements PrioRunnable {

        // Minimize memory usage at the cost of having to encode from the end
        private final ArrayList queue;
@@ -69,4 +71,8 @@
                }
        }

+       public int getPriority() {
+               return NativeThread.MIN_PRIORITY;
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2008-04-16 18:37:39 UTC (rev 19379)
@@ -241,14 +241,14 @@
                                if(logMINOR) Logger.minor(this, "Is simple 
manifest");
                                String name;
                                if(metaStrings.isEmpty())
-                                       throw new 
FetchException(FetchException.NOT_ENOUGH_PATH_COMPONENTS, -1, false, null, 
thisKey.addMetaStrings(new String[] { "" }));
+                                       throw new 
FetchException(FetchException.NOT_ENOUGH_PATH_COMPONENTS, -1, false, null, 
uri.addMetaStrings(new String[] { "" }));
                                else name = removeMetaString();
                                // Since metadata is a document, we just 
replace metadata here
                                if(logMINOR) Logger.minor(this, "Next 
meta-string: "+name);
                                if(name == null) {
                                        metadata = 
metadata.getDefaultDocument();
                                        if(metadata == null)
-                                               throw new 
FetchException(FetchException.NOT_ENOUGH_PATH_COMPONENTS, -1, false, null, 
thisKey.addMetaStrings(new String[] { "" }));
+                                               throw new 
FetchException(FetchException.NOT_ENOUGH_PATH_COMPONENTS, -1, false, null, 
uri.addMetaStrings(new String[] { "" }));
                                } else {
                                        metadata = metadata.getDocument(name);
                                        thisKey = thisKey.pushMetaString(name);
@@ -488,7 +488,7 @@
                                                        // It would be useful 
to be able to fetch the data ...
                                                        // On the other hand 
such inserts could cause unpredictable results?
                                                        // Would be useful to 
make a redirect to the key we actually fetched.
-                                                       rcb.onFailure(new 
FetchException(FetchException.INVALID_METADATA, "Invalid metadata: too many 
path components in redirects", thisKey), this);
+                                                       rcb.onFailure(new 
FetchException(FetchException.INVALID_METADATA, "Invalid metadata: too many 
path components in redirects", uri.dropLastMetaStrings(1)), this);
                                                } else {
                                                        // 
TOO_MANY_PATH_COMPONENTS
                                                        // report to user

Modified: trunk/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2008-04-16 
18:37:39 UTC (rev 19379)
@@ -20,6 +20,7 @@
 import java.text.NumberFormat;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -1072,6 +1073,8 @@
         */
        private final HashSet completedRequestIdentifiers = new HashSet();

+       private final HashMap alertsByIdentifier = new HashMap();
+       
        public void notifyFailure(ClientRequest req) {
                // FIXME do something???
        }
@@ -1209,14 +1212,22 @@
                        L10n.addL10nSubstitution(text, 
"QueueToadlet.downloadSucceeded",
                                        new String[] { "link", "/link", 
"origlink", "/origlink", "filename", "size" },
                                        new String[] { "<a 
href=\"/queue/"+uri.toACIIString()+"\">", "</a>", "<a 
href=\"/"+uri.toACIIString()+"\">", "</a>", name, SizeUtil.formatSize(size) } );
-                       core.alerts.register(new SimpleHTMLUserAlert(true, 
title, text, UserAlert.MINOR) {
+                       UserAlert alert = 
+                       new SimpleHTMLUserAlert(true, title, text, 
UserAlert.MINOR) {
                                public void onDismiss() {
                                        
synchronized(completedRequestIdentifiers) {
                                                
completedRequestIdentifiers.remove(identifier);
                                        }
+                                       synchronized(alertsByIdentifier) {
+                                               
alertsByIdentifier.remove(identifier);
+                                       }
                                        saveCompletedIdentifiersOffThread();
                                }
-                       });
+                       };
+                       core.alerts.register(alert);
+                       synchronized(alertsByIdentifier) {
+                               alertsByIdentifier.put(identifier, alert);
+                       }
                } else if(req instanceof ClientPut) {
                        FreenetURI uri = ((ClientPut)req).getFinalURI();
                        long size = ((ClientPut)req).getDataSize();
@@ -1226,32 +1237,48 @@
                        L10n.addL10nSubstitution(text, 
"QueueToadlet.uploadSucceeded",
                                        new String[] { "link", "/link", 
"filename", "size" },
                                        new String[] { "<a 
href=\"/"+uri.toACIIString()+"\">", "</a>", name, SizeUtil.formatSize(size) } );
-                       core.alerts.register(new SimpleHTMLUserAlert(true, 
title, text, UserAlert.MINOR) {
+                       UserAlert alert = 
+                       new SimpleHTMLUserAlert(true, title, text, 
UserAlert.MINOR) {
                                public void onDismiss() {
                                        
synchronized(completedRequestIdentifiers) {
                                                
completedRequestIdentifiers.remove(identifier);
                                        }
+                                       synchronized(alertsByIdentifier) {
+                                               
alertsByIdentifier.remove(identifier);
+                                       }
                                        saveCompletedIdentifiersOffThread();
                                }
-                       });
+                       };
+                       core.alerts.register(alert);
+                       synchronized(alertsByIdentifier) {
+                               alertsByIdentifier.put(identifier, alert);
+                       }
                } else if(req instanceof ClientPutDir) {
                        FreenetURI uri = ((ClientPutDir)req).getFinalURI();
                        long size = ((ClientPutDir)req).getTotalDataSize();
                        int files = ((ClientPutDir)req).getNumberOfFiles();
                        String name = uri.getPreferredFilename();
-                       String title = 
l10n("QueueToadlet.siteUploadSucceededTitle", "filename", name);
+                       String title = l10n("siteUploadSucceededTitle", 
"filename", name);
                        HTMLNode text = new HTMLNode("div");
                        L10n.addL10nSubstitution(text, 
"QueueToadlet.siteUploadSucceeded",
                                        new String[] { "link", "/link", 
"filename", "size", "files" },
                                        new String[] { "<a 
href=\"/"+uri.toACIIString()+"\">", "</a>", name, SizeUtil.formatSize(size), 
Integer.toString(files) } );
-                       core.alerts.register(new SimpleHTMLUserAlert(true, 
title, text, UserAlert.MINOR) {
+                       UserAlert alert = 
+                       new SimpleHTMLUserAlert(true, title, text, 
UserAlert.MINOR) {
                                public void onDismiss() {
                                        
synchronized(completedRequestIdentifiers) {
                                                
completedRequestIdentifiers.remove(identifier);
                                        }
+                                       synchronized(alertsByIdentifier) {
+                                               
alertsByIdentifier.remove(identifier);
+                                       }
                                        saveCompletedIdentifiersOffThread();
                                }
-                       });
+                       };
+                       core.alerts.register(alert);
+                       synchronized(alertsByIdentifier) {
+                               alertsByIdentifier.put(identifier, alert);
+                       }
                }
        }

@@ -1259,4 +1286,17 @@
                return L10n.getString("QueueToadlet."+key, pattern, value);
        }

+       public void onRemove(ClientRequest req) {
+               String identifier = req.getIdentifier();
+               synchronized(completedRequestIdentifiers) {
+                       completedRequestIdentifiers.remove(identifier);
+               }
+               UserAlert alert;
+               synchronized(alertsByIdentifier) {
+                       alert = (UserAlert) 
alertsByIdentifier.remove(identifier);
+               }
+               core.alerts.unregister(alert);
+               saveCompletedIdentifiersOffThread();
+       }
+
 }

Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2008-04-16 
18:37:39 UTC (rev 19379)
@@ -1018,7 +1018,7 @@
 StatisticsToadlet.swapOutput=Swapping Output: ${total}.
 StatisticsToadlet.threadDumpButton=Generate a Thread Dump
 StatisticsToadlet.threads=Running threads: ${running}/${max}
-StatisticsToadlet.threadsByPriority=Threads by priority
+StatisticsToadlet.threadsByPriority=Pooled threads by priority
 StatisticsToadlet.totalOverhead=Total non-request overhead: ${rate}/sec 
(${percent}%).
 StatisticsToadlet.priority=Priority
 StatisticsToadlet.resendBytes=Resent bytes: ${total}

Modified: trunk/freenet/src/freenet/node/DNSRequester.java
===================================================================
--- trunk/freenet/src/freenet/node/DNSRequester.java    2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/DNSRequester.java    2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -13,7 +13,6 @@
  */
 public class DNSRequester implements Runnable {

-    final Thread myThread;
     final Node node;
     private long lastLogTime;
     // Only set when doing simulations.
@@ -21,14 +20,12 @@

     DNSRequester(Node node) {
         this.node = node;
-        myThread = new Thread(this, "DNSRequester thread for 
"+node.getDarknetPortNumber());
-        myThread.setDaemon(true);
     }

     void start() {
        Logger.normal(this, "Starting DNSRequester");
        System.out.println("Starting DNSRequester");
-        myThread.start();
+       node.executor.execute(this, "DNSRequester thread for 
"+node.getDarknetPortNumber());
     }

     public void run() {

Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java  2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java  2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -116,7 +116,6 @@
        static final int MAX_CACHED_ELEMENTS = 256*1024; // equally arbitrary! 
FIXME hopefully we can cache many of these though

        private UserAlert startingUpAlert;
-       private final NativeThread backgroundBlockEncoderThread;

        NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldThrottleFS, 
SimpleFieldSet oldConfig, SubConfig fproxyConfig, SimpleToadletServer toadlets) 
throws NodeInitException {
                this.node = node;
@@ -131,8 +130,6 @@
                        else prio = NativeThread.MIN_PRIORITY;
                        clientSlowSerialExecutor[i] = new SerialExecutor(prio);
                }
-               backgroundBlockEncoderThread = new 
NativeThread(backgroundBlockEncoder, "Background block encoder", 
NativeThread.MIN_PRIORITY, false);
-               backgroundBlockEncoderThread.setDaemon(true);
                byte[] pwdBuf = new byte[16];
                random.nextBytes(pwdBuf);
                this.formPassword = Base64.encode(pwdBuf);
@@ -396,7 +393,7 @@
        }

        public void start(Config config) throws NodeInitException {
-               backgroundBlockEncoderThread.start();
+               node.executor.execute(backgroundBlockEncoder, "Background block 
encoder");
                persister.start();
                if(fcpServer != null)
                        fcpServer.maybeStart();

Modified: trunk/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestStarter.java  2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/RequestStarter.java  2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -81,9 +81,7 @@
        }

        void start() {
-               Thread t = new Thread(this, name);
-               t.setDaemon(true);
-               t.start();
+               core.getExecutor().execute(this, name);
        }

        final String name;

Modified: trunk/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetHandler.java  2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/TestnetHandler.java  2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -62,15 +62,12 @@
        }

        public void start() {
-               serverThread = new Thread(this, "Testnet handler thread");
-               serverThread.setDaemon(true);
-               serverThread.start();
+               node.executor.execute(this, "Testnet handler thread");
                uploader.start();
                System.err.println("Started testnet handler on port 
"+testnetPort);
        }

        private final Node node;
-       private Thread serverThread;
        private ServerSocket server;
        private int testnetPort;


Modified: trunk/freenet/src/freenet/node/TestnetStatusUploader.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetStatusUploader.java   2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/TestnetStatusUploader.java   2008-04-16 
18:37:39 UTC (rev 19379)
@@ -34,13 +34,10 @@
        }

        void start() {
-               uploaderThread = new Thread(this, "TestnetStatusUploader 
thread");
-               uploaderThread.setDaemon(true);
-               uploaderThread.start();
+               node.executor.execute(this, "TestnetStatusUploader thread");
        }

        private final Node node;
-       private Thread uploaderThread;
        private final int updateInterval;
        private Socket client;


Modified: trunk/freenet/src/freenet/node/TextModeClientInterfaceServer.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterfaceServer.java   
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/TextModeClientInterfaceServer.java   
2008-04-16 18:37:39 UTC (rev 19379)
@@ -93,9 +93,7 @@
                HighLevelSimpleClient client = 
core.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, true);
                        TextModeClientInterface directTMCI =
                                new TextModeClientInterface(node, client, 
core.downloadDir, System.in, System.out);
-                       Thread t = new Thread(directTMCI, "Direct text mode 
interface");
-                       t.setDaemon(true);
-                       t.start();
+                       node.executor.execute(directTMCI, "Direct text mode 
interface");
                        core.setDirectTMCI(directTMCI);
                }


Modified: trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java  
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java  
2008-04-16 18:37:39 UTC (rev 19379)
@@ -144,7 +144,7 @@
                // Then simply create the ClientPutDir.
                HashMap manifestElements = new HashMap();
                convertFilesByNameToManifestElements(filesByName, 
manifestElements, node);
-               handler.startClientPutDir(this, manifestElements);
+               handler.startClientPutDir(this, manifestElements, false);
        }

        /**

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2008-04-16 
18:37:39 UTC (rev 19379)
@@ -36,13 +36,15 @@
        private final long totalSize;
        private final int numberOfFiles;
        private static boolean logMINOR;
+       private final boolean wasDiskPut;

        public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage 
message, 
-                       HashMap manifestElements) throws 
IdentifierCollisionException, MalformedURLException {
+                       HashMap manifestElements, boolean wasDiskPut) 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);
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               this.wasDiskPut = wasDiskPut;
                this.manifestElements = manifestElements;
                this.defaultName = message.defaultName;
                makePutter();
@@ -69,6 +71,7 @@
        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) throws FileNotFoundException, IdentifierCollisionException, 
MalformedURLException {
                super(uri, identifier, verbosity , null, client, priorityClass, 
persistenceType, clientToken, global, getCHKOnly, dontCompress, maxRetries, 
earlyEncode);

+               wasDiskPut = true;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.manifestElements = makeDiskDirManifest(dir, "", 
allowUnreadableFiles);
                this.defaultName = defaultName;
@@ -142,6 +145,11 @@
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                SimpleFieldSet files = fs.subset("Files");
                defaultName = fs.get("DefaultName");
+               String type = fs.get("PutDirType");
+               if(type.equals("disk"))
+                       wasDiskPut = true;
+               else
+                       wasDiskPut = false;
                // Flattened for disk, sort out afterwards
                int fileCount = 0;
                long size = 0;
@@ -268,6 +276,7 @@
                // Storing it directly would be a PITA.
                ManifestElement[] elements = 
SimpleManifestPutter.flatten(manifestElements);
                fs.putSingle("DefaultName", defaultName);
+               fs.putSingle("PutDirType", wasDiskPut ? "disk" : "complex");
                for(int i=0;i<elements.length;i++) {
                        String num = Integer.toString(i);
                        ManifestElement e = elements[i];
@@ -307,7 +316,7 @@

        protected FCPMessage persistentTagMessage() {
                return new PersistentPutDir(identifier, publicURI, verbosity, 
priorityClass,
-                               persistenceType, global, defaultName, 
manifestElements, clientToken, started, ctx.maxInsertRetries);
+                               persistenceType, global, defaultName, 
manifestElements, clientToken, started, ctx.maxInsertRetries, wasDiskPut);
        }

        protected String getTypeName() {

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java     
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java     
2008-04-16 18:37:39 UTC (rev 19379)
@@ -54,7 +54,7 @@
                // Create a directory listing of Buckets of data, mapped to 
ManifestElement's.
                // Directories are sub-HashMap's.
                HashMap buckets = makeBucketsByName(dirname, "");
-               handler.startClientPutDir(this, buckets);
+               handler.startClientPutDir(this, buckets, true);
        }

     /**

Modified: trunk/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPClient.java   2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/FCPClient.java   2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -159,6 +159,8 @@
                        if(logMINOR) Logger.minor(this, "Killing request "+req);
                        req.cancel();
                }
+               if(completionCallback != null)
+                       completionCallback.onRemove(req);
                server.forceStorePersistentRequests();
        }


Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-04-16 18:37:39 UTC (rev 19379)
@@ -243,7 +243,7 @@
                }
        }

-       public void startClientPutDir(ClientPutDirMessage message, HashMap 
buckets) {
+       public void startClientPutDir(ClientPutDirMessage message, HashMap 
buckets, boolean wasDiskPut) {
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "Start ClientPutDir");
                String id = message.identifier;
@@ -261,7 +261,7 @@
                }
                if(success) {
                        try {
-                               cp = new ClientPutDir(this, message, buckets);
+                               cp = new ClientPutDir(this, message, buckets, 
wasDiskPut);
                        } catch (IdentifierCollisionException e) {
                                success = false;
                        } catch (MalformedURLException e) {
@@ -447,4 +447,17 @@
                        }
                }
        }
+
+       public ClientRequest removeRequestByIdentifier(String identifier, 
boolean kill) {
+               ClientRequest req;
+               synchronized(this) {
+                       req = (ClientRequest) 
requestsByIdentifier.remove(identifier);
+               }
+               if(req != null) {
+                       req.requestWasRemoved();
+                       if(kill)
+                               req.cancel();
+               }
+               return req;
+       }
 }

Modified: trunk/freenet/src/freenet/node/fcp/FCPMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -77,7 +77,8 @@
                        return new ModifyPersistentRequest(fs);
                if(name.equals(RemovePeer.NAME))
                        return new RemovePeer(fs);
-               if(name.equals(RemovePersistentRequest.NAME))
+               if(name.equals(RemovePersistentRequest.NAME)
+                               || 
name.equals(RemovePersistentRequest.ALT_NAME))
                        return new RemovePersistentRequest(fs);
                if(name.equals(ShutdownMessage.NAME))
                        return new ShutdownMessage();

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java   2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java   2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -88,9 +88,7 @@
        private boolean hasFinishedStart;

        private void startPersister() {
-               Thread t = new Thread(persister = new FCPServerPersister(), 
"FCP request persister");
-               t.setDaemon(true);
-               t.start();
+               node.executor.execute(persister = new FCPServerPersister(), 
"FCP request persister");
        }

        private void killPersister() {

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java    2008-04-16 
18:37:39 UTC (rev 19379)
@@ -31,10 +31,11 @@
        final String token;
        final boolean started;
        final int maxRetries;
+       final boolean wasDiskPut;

        public PersistentPutDir(String identifier, FreenetURI uri, int 
verbosity, 
                        short priorityClass, short persistenceType, boolean 
global,
-                       String defaultName, HashMap manifestElements, String 
token, boolean started, int maxRetries) {
+                       String defaultName, HashMap manifestElements, String 
token, boolean started, int maxRetries, boolean wasDiskPut) {
                this.identifier = identifier;
                this.uri = uri;
                this.verbosity = verbosity;
@@ -46,6 +47,7 @@
                this.token = token;
                this.started = started;
                this.maxRetries = maxRetries;
+               this.wasDiskPut = wasDiskPut;
        }

        public SimpleFieldSet getFieldSet() {
@@ -56,6 +58,7 @@
                fs.putSingle("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
                fs.put("PriorityClass", priorityClass);
                fs.putSingle("Global", Boolean.toString(global));
+               fs.putSingle("PutDirType", wasDiskPut ? "disk" : "complex");
                SimpleFieldSet files = new SimpleFieldSet(false);
                // Flatten the hierarchy, it can be reconstructed on restarting.
                // Storing it directly would be a PITA.

Modified: trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java     
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/RemovePersistentRequest.java     
2008-04-16 18:37:39 UTC (rev 19379)
@@ -11,7 +11,8 @@
  */
 public class RemovePersistentRequest extends FCPMessage {

-       final static String NAME = "RemovePersistentRequest";
+       final static String NAME = "RemoveRequest";
+       final static String ALT_NAME = "RemovePersistentRequest";

        final String identifier;
        final boolean global;
@@ -38,9 +39,15 @@
                FCPClient client = global ? handler.server.globalClient : 
handler.getClient();
         ClientRequest req = client.getRequest(identifier);
         if(req==null){
-            Logger.error(this, "Huh ? the request is null!");
-            return;
+               if(!global)
+                       req = handler.removeRequestByIdentifier(identifier, 
true);
+               if(req == null) {
+                       Logger.error(this, "Huh ? the request is null!");
+                       return;
+               }
+        } else {
+               client.removeByIdentifier(identifier, true);
         }
-               client.removeByIdentifier(identifier, true);
+        
        }
 }

Modified: trunk/freenet/src/freenet/node/fcp/RequestCompletionCallback.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/RequestCompletionCallback.java   
2008-04-16 18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/node/fcp/RequestCompletionCallback.java   
2008-04-16 18:37:39 UTC (rev 19379)
@@ -12,4 +12,9 @@
         */
        public void notifyFailure(ClientRequest req);

+       /**
+        * Callback when a request is removed
+        */
+       public void onRemove(ClientRequest req);
+       
 }

Modified: trunk/freenet/src/freenet/pluginmanager/FredPluginFCP.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/FredPluginFCP.java  2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/pluginmanager/FredPluginFCP.java  2008-04-16 
18:37:39 UTC (rev 19379)
@@ -23,7 +23,7 @@

        /**
         * @param replysender interface to send a reply
-        * @param params parameters passed in
+        * @param params parameters passed in, can be null
         * @param data a bucket of data passed in, can be null
         * @param access 0: direct call (plugin to plugin), 1: FCP restricted 
access,  2: FCP full access  
         */

Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-16 
18:37:39 UTC (rev 19379)
@@ -911,20 +911,17 @@
         * <li><code>callback.routingKeyFromFullKey(); </code></li>
         * <li>if <code>null</code> or <code>KeyVerifyException</code>,<code> 
callback.construct().getRoutingKey()</code>,
         * may throw <code>KeyVerifyException</code></li>
-        * <ol>
-        * <code>fullKey</code> (and hence
-        * <code>callback.routingKeyFromFullKey(); </code>) may be phantom, 
hence
-        * we must verify
-        * <code> callback.construct().getRoutingKey()  == routingkey </code> on
-        * <code>fetch()</code> </dd>
+        * </ol>
+        * <code>fullKey</code> (and hence 
<code>callback.routingKeyFromFullKey(); </code>) may be
+        * phantom, hence we must verify
+        * <code> callback.construct().getRoutingKey()  == routingkey </code> 
on <code>fetch()</code>
+        * </dd>
         * </dl>
         * 
-        * On <code>OperationStatus.KEYEXIST</code> or bad
-        * <code> callback.construct</code>:
+        * On <code>OperationStatus.KEYEXIST</code> or bad <code> 
callback.construct</code>:
         * <ol>
         * <li>insert a database entry with random key, (minimum lru - 1); </li>
-        * <li>if <code>op != OperationStatus.SUCCESS</code>,
-        * <code>addFreeBlock()</code>.</li>
+        * <li>if <code>op != OperationStatus.SUCCESS</code>, 
<code>addFreeBlock()</code>.</li>
         * </ol>
         * 
         * 

Modified: trunk/freenet/src/freenet/support/PooledExecutor.java
===================================================================
--- trunk/freenet/src/freenet/support/PooledExecutor.java       2008-04-16 
18:35:04 UTC (rev 19378)
+++ trunk/freenet/src/freenet/support/PooledExecutor.java       2008-04-16 
18:37:39 UTC (rev 19379)
@@ -15,7 +15,9 @@
  */
 public class PooledExecutor implements Executor {

+       /** All threads running or waiting */
        private final ArrayList[] runningThreads /* <MyThread> */ = new 
ArrayList[NativeThread.JAVA_PRIORITY_RANGE + 1];
+       /** Threads waiting for a job */
        private final ArrayList[] waitingThreads /* <MyThread> */ = new 
ArrayList[runningThreads.length];
        long[] threadCounter = new long[runningThreads.length];
        private long jobCount;
@@ -114,7 +116,7 @@
        public synchronized int[] runningThreads() {
                int[] result = new int[runningThreads.length];
                for(int i = 0; i < result.length; i++)
-                       result[i] = runningThreads[i].size();
+                       result[i] = runningThreads[i].size() - 
waitingThreads[i].size();
                return result;
        }


Modified: trunk/freenet/test/freenet/support/FieldsTest.java
===================================================================
--- trunk/freenet/test/freenet/support/FieldsTest.java  2008-04-16 18:35:04 UTC 
(rev 19378)
+++ trunk/freenet/test/freenet/support/FieldsTest.java  2008-04-16 18:37:39 UTC 
(rev 19379)
@@ -135,4 +135,89 @@
                        // expect this
                }
        }
+       
+       public void testStringToBool() {
+               assertTrue(Fields.stringToBool("true"));
+               assertTrue(Fields.stringToBool("TRUE"));
+               assertFalse(Fields.stringToBool("false"));
+               assertFalse(Fields.stringToBool("FALSE"));
+               
+               try {
+                       Fields.stringToBool("Free Tibet");
+                       fail();
+               }
+               catch(NumberFormatException e) {
+                       // expect this
+               }
+               
+               try {
+                       Fields.stringToBool(null);
+                       fail();
+               }
+               catch(NumberFormatException e) {
+                       // expect this
+               }
+       }
+       
+       public void testStringToBoolWithDefault() {
+               assertTrue(Fields.stringToBool("true", false));
+               assertFalse(Fields.stringToBool("false", true));
+               assertTrue(Fields.stringToBool("TruE", false));
+               assertFalse(Fields.stringToBool("faLSE", true));
+               assertTrue(Fields.stringToBool("trueXXX", true));
+               assertFalse(Fields.stringToBool("XXXFalse", false));
+               assertTrue(Fields.stringToBool(null, true));
+       }
+       
+       public void testBoolToString() {
+               assertEquals(Fields.boolToString(true), "true");
+               assertEquals(Fields.boolToString(false), "false");
+       }
+       
+       public void testCommaListFromString() {
+               String[] expected = new String[] {"one", "two", "three", 
"four"};
+               String[] actual = Fields.commaList("one,two,     three    ,  
four");
+               
+               for(int i = 0; i < expected.length; i++) {
+                       assertEquals(expected[i], actual[i]);
+               }
+               
+               // null
+               assertNull(Fields.commaList((String)null));
+               
+               // no items
+               expected = new String[] {};
+               actual = Fields.commaList("");
+               
+               assertTrue(expected.length == actual.length);
+       }
+       
+       public void testStringArrayToCommaList() {
+               
+               String[] input = new String[] { "one", "two", "three", "four" };
+               
+               String expected = "one,two,three,four";
+               String actual = Fields.commaList(input);
+               
+               assertEquals(expected, actual);
+               
+               // empty
+               input = new String[] {};
+               
+               expected = "";
+               actual = Fields.commaList(input);
+               
+               assertEquals(expected, actual);
+       }
+       
+       public void testHashcodeForByteArray() {
+               byte[] input = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
+               
+               assertEquals(67372036, Fields.hashCode(input));
+               
+               // empty
+               input = new byte[] {};
+               
+               assertEquals(0, Fields.hashCode(input));
+       }
 }


Reply via email to