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