Author: toad
Date: 2006-03-09 18:40:59 +0000 (Thu, 09 Mar 2006)
New Revision: 8199

Added:
   trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
Modified:
   trunk/freenet/src/freenet/client/async/ClientGetter.java
   trunk/freenet/src/freenet/client/async/ClientRequest.java
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/SendableRequest.java
   trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/node/RequestStarter.java
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/FCPClient.java
   trunk/freenet/src/freenet/node/fcp/FCPMessage.java
   trunk/freenet/src/freenet/node/fcp/PersistentGet.java
   trunk/freenet/src/freenet/node/fcp/PersistentPut.java
   trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
   trunk/freenet/src/freenet/support/SectoredRandomGrabArrayWithInt.java
Log:
509: ModifyPersistentRequest. Haven't been able to test it properly yet.
Also some persistent requests fixes.

Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java    2006-03-09 
18:40:59 UTC (rev 8199)
@@ -129,5 +129,5 @@
                Logger.minor(this, "Set finished", new Exception("debug"));
                blockSetFinalized();
        }
-       
+
 }

Modified: trunk/freenet/src/freenet/client/async/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequest.java   2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/ClientRequest.java   2006-03-09 
18:40:59 UTC (rev 8199)
@@ -108,4 +108,11 @@
                return client;
        }

+       public void setPriorityClass(short newPriorityClass) {
+               short oldPriorityClass = priorityClass;
+               this.priorityClass = newPriorityClass;
+               chkScheduler.reregisterAll(this);
+               sskScheduler.reregisterAll(this);
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2006-03-09 18:40:59 UTC (rev 8199)
@@ -1,5 +1,9 @@
 package freenet.client.async;

+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
 import freenet.crypt.RandomSource;
 import freenet.keys.ClientKeyBlock;
 import freenet.keys.KeyVerifyException;
@@ -25,10 +29,11 @@
         * 
         * To speed up fetching, a RGA or SVBN must only exist if it is 
non-empty.
         */
-       final SortedVectorByNumber[] priorities;
+       private final SortedVectorByNumber[] priorities;
        // we have one for inserts and one for requests
        final boolean isInsertScheduler;
        final RandomSource random;
+       private final HashMap allRequestsByClientRequest;
        private final RequestStarter starter;
        private final Node node;

@@ -38,6 +43,7 @@
                this.node = node;
                this.isInsertScheduler = forInserts;
                priorities = new 
SortedVectorByNumber[RequestStarter.NUMBER_OF_PRIORITY_CLASSES];
+               allRequestsByClientRequest = new HashMap();
        }

        public void register(SendableRequest req) {
@@ -63,17 +69,25 @@
                                }
                        }
                }
-               synchronized(this) {
-                       SectoredRandomGrabArrayWithInt grabber = 
-                               makeGrabArray(req.getPriorityClass(), 
req.getRetryCount());
-                       grabber.add(req.getClient(), req);
-                       Logger.minor(this, "Registered "+req+" on 
prioclass="+req.getPriorityClass()+", retrycount="+req.getRetryCount());
-               }
+               innerRegister(req);
                synchronized(starter) {
                        starter.notifyAll();
                }
        }

+       private synchronized void innerRegister(SendableRequest req) {
+               SectoredRandomGrabArrayWithInt grabber = 
+                       makeGrabArray(req.getPriorityClass(), 
req.getRetryCount());
+               grabber.add(req.getClient(), req);
+               HashSet v = (HashSet) 
allRequestsByClientRequest.get(req.getClientRequest());
+               if(v == null) {
+                       v = new HashSet();
+                       allRequestsByClientRequest.put(req.getClientRequest(), 
v);
+               }
+               v.add(req);
+               Logger.minor(this, "Registered "+req+" on 
prioclass="+req.getPriorityClass()+", retrycount="+req.getRetryCount());
+       }
+
        private synchronized SectoredRandomGrabArrayWithInt makeGrabArray(short 
priorityClass, int retryCount) {
                if(priorityClass > RequestStarter.MINIMUM_PRIORITY_CLASS || 
priorityClass < RequestStarter.MAXIMUM_PRIORITY_CLASS)
                        throw new IllegalStateException("Invalid priority: 
"+priorityClass+" - range is "+RequestStarter.MAXIMUM_PRIORITY_CLASS+" (most 
important) to "+RequestStarter.MINIMUM_PRIORITY_CLASS+" (least important)");
@@ -120,11 +134,41 @@
                                        Logger.minor(this, "No requests in 
priority "+i+", retrycount "+rga.getNumber()+" ("+rga+")");
                                        continue;
                                }
+                               if(req.getPriorityClass() > i) {
+                                       // Reinsert it
+                                       Logger.minor(this, "In wrong priority 
class: "+req);
+                                       innerRegister(req);
+                                       continue;
+                               }
                                Logger.minor(this, "removeFirst() returning 
"+req+" ("+rga.getNumber()+")");
+                               ClientRequest cr = req.getClientRequest();
+                               HashSet v = (HashSet) 
allRequestsByClientRequest.get(cr);
+                               v.remove(req);
+                               if(v.isEmpty())
+                                       allRequestsByClientRequest.remove(cr);
                                return req;
                        }
                }
                Logger.minor(this, "No requests to run");
                return null;
        }
+
+       public void reregisterAll(ClientRequest request) {
+               synchronized(this) {
+                       HashSet h = (HashSet) 
allRequestsByClientRequest.get(request);
+                       if(h != null) {
+                               Iterator i = h.iterator();
+                               while(i.hasNext()) {
+                                       SendableRequest req = (SendableRequest) 
i.next();
+                                       // Don't actually remove it as removing 
it is a rather slow operation
+                                       // It will be removed when 
removeFirst() reaches it.
+                                       //grabArray.remove(req);
+                                       innerRegister(req);
+                               }
+                       }
+               }
+               synchronized(starter) {
+                       starter.notifyAll();
+               }
+       }
 }

Modified: trunk/freenet/src/freenet/client/async/SendableRequest.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SendableRequest.java 2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/SendableRequest.java 2006-03-09 
18:40:59 UTC (rev 8199)
@@ -2,6 +2,7 @@

 import freenet.node.Node;
 import freenet.support.RandomGrabArrayItem;
+import freenet.support.SectoredRandomGrabArrayWithInt;

 /**
  * A low-level request which can be sent immediately. These are registered
@@ -19,4 +20,7 @@
        /** Get client context object */
        public Object getClient();

+       /** Get the ClientRequest */
+       public ClientRequest getClientRequest();
+
 }

Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java     
2006-03-09 18:40:59 UTC (rev 8199)
@@ -270,4 +270,8 @@
                return parent.getClient();
        }

+       public ClientRequest getClientRequest() {
+               return parent;
+       }
+
 }

Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-09 18:40:59 UTC (rev 8199)
@@ -571,4 +571,8 @@
                return ctx.ignoreStore;
        }

+       public ClientRequest getClientRequest() {
+               return parent;
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestStarter.java  2006-03-08 22:41:02 UTC 
(rev 8198)
+++ trunk/freenet/src/freenet/node/RequestStarter.java  2006-03-09 18:40:59 UTC 
(rev 8199)
@@ -38,6 +38,10 @@

        public static final short NUMBER_OF_PRIORITY_CLASSES = 
MINIMUM_PRIORITY_CLASS - MAXIMUM_PRIORITY_CLASS + 1; // include 0 and max !!

+       public static boolean isValidPriorityClass(int prio) {
+               return !(prio < MAXIMUM_PRIORITY_CLASS || prio > 
MINIMUM_PRIORITY_CLASS);
+       }
+       
        final RequestThrottle throttle;
        RequestScheduler sched;
        final Node node;
@@ -135,5 +139,5 @@
                }

        }
-       
+
 }

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-08 22:41:02 UTC (rev 
8198)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-09 18:40:59 UTC (rev 
8199)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 508;
+       private static final int buildNumber = 509;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 507;

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-03-08 22:41:02 UTC 
(rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-03-09 18:40:59 UTC 
(rev 8199)
@@ -42,7 +42,7 @@
        private final FCPConnectionHandler origHandler;
        private final FCPClient client;
        private final ClientGetter getter;
-       private final short priorityClass;
+       private short priorityClass;
        private final short returnType;
        private final short persistenceType;
        /** Has the request finished? */
@@ -395,8 +395,9 @@
        }

        public void write(BufferedWriter w) throws IOException {
-               if(persistenceType != ClientRequest.PERSIST_REBOOT) {
+               if(persistenceType == ClientRequest.PERSIST_CONNECTION) {
                        Logger.error(this, "Not persisting as 
persistenceType="+persistenceType);
+                       return;
                }
                // Persist the request to disk
                SimpleFieldSet fs = getFieldSet();
@@ -463,4 +464,9 @@
                return persistenceType == ClientRequest.PERSIST_FOREVER;
        }

+       public void setPriorityClass(short priorityClass) {
+               this.priorityClass = priorityClass;
+               getter.setPriorityClass(priorityClass);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java    2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/ClientGetMessage.java    2006-03-09 
18:40:59 UTC (rev 8199)
@@ -108,8 +108,8 @@
                        if(diskFile.exists())
                                throw new 
MessageInvalidException(ProtocolErrorMessage.DISK_TARGET_EXISTS, null, 
identifier);
                        try {
-                               if(!tempFile.createNewFile())
-                                       throw new 
MessageInvalidException(ProtocolErrorMessage.COULD_NOT_CREATE_FILE, null, 
identifier);
+                               if(!(tempFile.createNewFile() || 
(tempFile.exists() && tempFile.canRead() && tempFile.canWrite())))
+                                       throw new 
MessageInvalidException(ProtocolErrorMessage.COULD_NOT_CREATE_FILE, "Could not 
create temp file "+tempFile, identifier);
                        } catch (IOException e) {
                                throw new 
MessageInvalidException(ProtocolErrorMessage.COULD_NOT_CREATE_FILE, 
e.getMessage(), identifier);
                        }

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-03-08 22:41:02 UTC 
(rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-03-09 18:40:59 UTC 
(rev 8199)
@@ -42,7 +42,7 @@
        final FCPClient client;
        final String identifier;
        final boolean getCHKOnly;
-       final short priorityClass;
+       short priorityClass;
        private final short persistenceType;
        final int verbosity;
        /** Has the request finished? */
@@ -373,4 +373,9 @@
                return persistenceType == ClientRequest.PERSIST_FOREVER;
        }

+       public void setPriorityClass(short priorityClass) {
+               this.priorityClass = priorityClass;
+               inserter.setPriorityClass(priorityClass);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2006-03-09 
18:40:59 UTC (rev 8199)
@@ -99,4 +99,6 @@

        public abstract void cancel();

+       public abstract void setPriorityClass(short priorityClass);
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-03-08 22:41:02 UTC 
(rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-03-09 18:40:59 UTC 
(rev 8199)
@@ -85,8 +85,8 @@
        public void finishedClientRequest(ClientRequest get) {
                ClientRequest dropped = null;
                synchronized(this) {
-                       runningPersistentRequests.remove(get);
-                       completedUnackedRequests.push(get);
+                       if(runningPersistentRequests.remove(get))
+                               completedUnackedRequests.push(get);

                        if(completedUnackedRequests.size() > 
MAX_UNACKED_REQUESTS) {
                                
clientRequestsByIdentifier.remove(dropped.getIdentifier());
@@ -226,4 +226,8 @@
                }
        }

+       public synchronized ClientRequest getRequest(String identifier) {
+               return (ClientRequest) 
clientRequestsByIdentifier.get(identifier);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/FCPMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2006-03-08 22:41:02 UTC 
(rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2006-03-09 18:40:59 UTC 
(rev 8199)
@@ -39,6 +39,8 @@
                        return new RemovePersistentRequest(fs);
                if(name.equals(WatchGlobal.name))
                        return new WatchGlobal(fs);
+               if(name.equals(ModifyPersistentRequest.name))
+                       return new ModifyPersistentRequest(fs);
                if(name.equals("Void"))
                        return null;
                throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "Unknown message 
name "+name, null);

Added: trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java     
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/ModifyPersistentRequest.java     
2006-03-09 18:40:59 UTC (rev 8199)
@@ -0,0 +1,69 @@
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.node.RequestStarter;
+import freenet.support.Fields;
+import freenet.support.SimpleFieldSet;
+
+/**
+ * FCP message: Modify a persistent request.
+ * 
+ * ModifyPersistentRequest
+ * Identifier=request identifier
+ * Verbosity=1023 // change verbosity
+ * PriorityClass=1 // change priority class
+ * ClientToken=new client token // change client token
+ * MaxRetries=100 // change max retries
+ * Global=true
+ * EndMessage
+ */
+public class ModifyPersistentRequest extends FCPMessage {
+
+       static final String name = "ModifyPersistentRequest";
+       
+       final String identifier;
+       final boolean global;
+       // negative means don't change
+       final short priorityClass;
+       
+       ModifyPersistentRequest(SimpleFieldSet fs) throws 
MessageInvalidException {
+               this.identifier = fs.get("Identifier");
+               if(identifier == null)
+                       throw new 
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Missing field: 
Identifier", null);
+               this.global = Fields.stringToBool(fs.get("Global"), false);
+               String prio = fs.get("PriorityClass");
+               if(prio != null) {
+                       try {
+                               priorityClass = Short.parseShort(prio);
+                               
if(!RequestStarter.isValidPriorityClass(priorityClass))
+                                       throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Invalid priority 
class "+priorityClass+" - range is "+RequestStarter.MINIMUM_PRIORITY_CLASS+" to 
"+RequestStarter.MAXIMUM_PRIORITY_CLASS, identifier);
+                       } catch (NumberFormatException e) {
+                               throw new 
MessageInvalidException(ProtocolErrorMessage.ERROR_PARSING_NUMBER, "Could not 
parse PriorityClass: "+e.getMessage(), identifier);
+                       }
+               } else
+                       priorityClass = -1;
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet fs = new SimpleFieldSet(true);
+               fs.put("Identifier", identifier);
+               fs.put("Global", Boolean.toString(global));
+               fs.put("PriorityClass", Short.toString(priorityClass));
+               return fs;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node)
+                       throws MessageInvalidException {
+               FCPClient client = global ? handler.server.globalClient : 
handler.getClient();
+               ClientRequest req = client.getRequest(identifier);
+               if(priorityClass > 0)
+                       req.setPriorityClass(priorityClass);
+               if(req.isPersistentForever())
+                       client.server.forceStorePersistentRequests();
+       }
+
+}

Modified: trunk/freenet/src/freenet/node/fcp/PersistentGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentGet.java       2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/PersistentGet.java       2006-03-09 
18:40:59 UTC (rev 8199)
@@ -52,6 +52,7 @@
                        fs.put("Filename", targetFile.getAbsolutePath());
                        fs.put("TempFilename", tempFile.getAbsolutePath());
                }
+               fs.put("PriorityClass", Short.toString(priorityClass));
                if(clientToken != null)
                        fs.put("ClientToken", clientToken);
                fs.put("Global", Boolean.toString(global));

Modified: trunk/freenet/src/freenet/node/fcp/PersistentPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPut.java       2006-03-08 
22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPut.java       2006-03-09 
18:40:59 UTC (rev 8199)
@@ -46,6 +46,7 @@
                        fs.put("Filename", origFilename.getAbsolutePath());
                if(mimeType != null)
                        fs.put("Metadata.ContentType", mimeType);
+               fs.put("PriorityClass", Short.toString(priorityClass));
                fs.put("Global", Boolean.toString(global));
                return fs;
        }

Modified: trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java
===================================================================
--- trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java      
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/support/SectoredRandomGrabArray.java      
2006-03-09 18:40:59 UTC (rev 8199)
@@ -2,6 +2,7 @@

 import java.util.HashMap;

+import freenet.client.async.SendableRequest;
 import freenet.crypt.RandomSource;

 /**
@@ -60,4 +61,5 @@
        public synchronized boolean isEmpty() {
                return grabArrays.length == 0;
        }
+       
 }

Modified: trunk/freenet/src/freenet/support/SectoredRandomGrabArrayWithInt.java
===================================================================
--- trunk/freenet/src/freenet/support/SectoredRandomGrabArrayWithInt.java       
2006-03-08 22:41:02 UTC (rev 8198)
+++ trunk/freenet/src/freenet/support/SectoredRandomGrabArrayWithInt.java       
2006-03-09 18:40:59 UTC (rev 8199)
@@ -1,5 +1,6 @@
 package freenet.support;

+import freenet.client.async.SendableRequest;
 import freenet.crypt.RandomSource;

 public class SectoredRandomGrabArrayWithInt extends SectoredRandomGrabArray 
implements IntNumberedItem {
@@ -14,5 +15,5 @@
        public int getNumber() {
                return number;
        }
-       
+
 }


Reply via email to