Author: toad
Date: 2006-03-08 15:48:28 +0000 (Wed, 08 Mar 2006)
New Revision: 8194
Modified:
trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
trunk/freenet/src/freenet/client/async/BaseClientPutter.java
trunk/freenet/src/freenet/client/async/ClientGetter.java
trunk/freenet/src/freenet/client/async/ClientPutter.java
trunk/freenet/src/freenet/client/async/ClientRequest.java
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/node/fcp/ClientGet.java
trunk/freenet/src/freenet/node/fcp/ClientPut.java
Log:
507: (mandatory)
Separate CHK- and SSK- client request load limiters.
Modified: trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
===================================================================
--- trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2006-03-08 09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
2006-03-08 15:48:28 UTC (rev 8194)
@@ -94,7 +94,7 @@
if(uri == null) throw new NullPointerException();
FetcherContext context = getFetcherContext();
FetchWaiter fw = new FetchWaiter();
- ClientGetter get = new ClientGetter(fw, node.fetchScheduler,
uri, context, priorityClass, this, null);
+ ClientGetter get = new ClientGetter(fw, node.chkFetchScheduler,
node.sskFetchScheduler, uri, context, priorityClass, this, null);
get.start();
return fw.waitForCompletion();
}
@@ -107,7 +107,7 @@
InserterContext context = getInserterContext();
PutWaiter pw = new PutWaiter();
ClientPutter put = new ClientPutter(pw, insert.data,
insert.desiredURI, insert.clientMetadata,
- context, node.putScheduler, priorityClass,
getCHKOnly, isMetadata, this);
+ context, node.chkPutScheduler,
node.sskPutScheduler, priorityClass, getCHKOnly, isMetadata, this);
put.start();
return pw.waitForCompletion();
}
@@ -129,7 +129,7 @@
public FreenetURI insertManifest(FreenetURI insertURI, HashMap
bucketsByName, String defaultName) throws InserterException {
PutWaiter pw = new PutWaiter();
SimpleManifestPutter putter =
- new SimpleManifestPutter(pw, node.putScheduler,
bucketsByName, priorityClass, insertURI, defaultName, getInserterContext(),
false, this);
+ new SimpleManifestPutter(pw, node.chkPutScheduler,
node.sskPutScheduler, bucketsByName, priorityClass, insertURI, defaultName,
getInserterContext(), false, this);
return pw.waitForCompletion();
}
Modified: trunk/freenet/src/freenet/client/async/BaseClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/BaseClientPutter.java
2006-03-08 09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/BaseClientPutter.java
2006-03-08 15:48:28 UTC (rev 8194)
@@ -2,8 +2,8 @@
public abstract class BaseClientPutter extends ClientRequest {
- protected BaseClientPutter(short priorityClass, ClientRequestScheduler
scheduler, Object context) {
- super(priorityClass, scheduler, context);
+ protected BaseClientPutter(short priorityClass, ClientRequestScheduler
chkScheduler, ClientRequestScheduler sskScheduler, Object context) {
+ super(priorityClass, chkScheduler, sskScheduler, context);
}
}
Modified: trunk/freenet/src/freenet/client/async/ClientGetter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientGetter.java 2006-03-08
09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/ClientGetter.java 2006-03-08
15:48:28 UTC (rev 8194)
@@ -41,8 +41,8 @@
* write the data directly to the bucket, or copy it and free the
original temporary bucket. Preferably the
* former, obviously!
*/
- public ClientGetter(ClientCallback client, ClientRequestScheduler
sched, FreenetURI uri, FetcherContext ctx, short priorityClass, Object
clientContext, Bucket returnBucket) {
- super(priorityClass, sched, clientContext);
+ public ClientGetter(ClientCallback client, ClientRequestScheduler
chkSched, ClientRequestScheduler sskSched, FreenetURI uri, FetcherContext ctx,
short priorityClass, Object clientContext, Bucket returnBucket) {
+ super(priorityClass, chkSched, sskSched, clientContext);
this.client = client;
this.returnBucket = returnBucket;
this.uri = uri;
Modified: trunk/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientPutter.java 2006-03-08
09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/ClientPutter.java 2006-03-08
15:48:28 UTC (rev 8194)
@@ -37,8 +37,9 @@
* @param clientContext The client object for purposs of round-robin
client balancing.
*/
public ClientPutter(ClientCallback client, Bucket data, FreenetURI
targetURI, ClientMetadata cm, InserterContext ctx,
- ClientRequestScheduler scheduler, short priorityClass,
boolean getCHKOnly, boolean isMetadata, Object clientContext) {
- super(priorityClass, scheduler, clientContext);
+ ClientRequestScheduler chkScheduler,
ClientRequestScheduler sskScheduler, short priorityClass, boolean getCHKOnly,
+ boolean isMetadata, Object clientContext) {
+ super(priorityClass, chkScheduler, sskScheduler, clientContext);
this.cm = cm;
this.isMetadata = isMetadata;
this.getCHKOnly = getCHKOnly;
Modified: trunk/freenet/src/freenet/client/async/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequest.java 2006-03-08
09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/ClientRequest.java 2006-03-08
15:48:28 UTC (rev 8194)
@@ -13,16 +13,18 @@
// FIXME move the priority classes from RequestStarter here
protected short priorityClass;
protected boolean cancelled;
- final ClientRequestScheduler scheduler;
+ final ClientRequestScheduler chkScheduler;
+ final ClientRequestScheduler sskScheduler;
protected final Object client;
public short getPriorityClass() {
return priorityClass;
}
- protected ClientRequest(short priorityClass, ClientRequestScheduler
scheduler, Object client) {
+ protected ClientRequest(short priorityClass, ClientRequestScheduler
chkScheduler, ClientRequestScheduler sskScheduler, Object client) {
this.priorityClass = priorityClass;
- this.scheduler = scheduler;
+ this.chkScheduler = chkScheduler;
+ this.sskScheduler = sskScheduler;
this.client = client;
}
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-08 09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-08 15:48:28 UTC (rev 8194)
@@ -24,7 +24,7 @@
private class PutHandler extends BaseClientPutter implements
PutCompletionCallback {
protected PutHandler(String name, Bucket data, ClientMetadata
cm, boolean getCHKOnly) throws InserterException {
- super(SimpleManifestPutter.this.getPriorityClass(),
SimpleManifestPutter.this.scheduler, SimpleManifestPutter.this.client);
+ super(SimpleManifestPutter.this.getPriorityClass(),
SimpleManifestPutter.this.chkScheduler, SimpleManifestPutter.this.sskScheduler,
SimpleManifestPutter.this.client);
this.name = name;
this.cm = cm;
InsertBlock block =
@@ -157,10 +157,10 @@
private final static String[] defaultDefaultNames =
new String[] { "index.html", "index.htm", "default.html",
"default.htm" };
- public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler
sched,
- HashMap bucketsByName, short prioClass, FreenetURI
target,
+ public SimpleManifestPutter(ClientCallback cb, ClientRequestScheduler
chkSched,
+ ClientRequestScheduler sskSched, HashMap bucketsByName,
short prioClass, FreenetURI target,
String defaultName, InserterContext ctx, boolean
getCHKOnly, Object clientContext) throws InserterException {
- super(prioClass, sched, clientContext);
+ super(prioClass, chkSched, sskSched, clientContext);
this.defaultName = defaultName;
this.targetURI = target;
this.cb = cb;
Modified: trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2006-03-08 09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/SingleBlockInserter.java
2006-03-08 15:48:28 UTC (rev 8194)
@@ -12,6 +12,7 @@
import freenet.keys.ClientCHKBlock;
import freenet.keys.ClientKey;
import freenet.keys.ClientKeyBlock;
+import freenet.keys.ClientSSKBlock;
import freenet.keys.FreenetURI;
import freenet.keys.InsertableClientSSK;
import freenet.keys.SSKEncodeException;
@@ -159,15 +160,23 @@
fail(new
InserterException(InserterException.TOO_MANY_RETRIES_IN_BLOCKS, errors,
getURI()));
}
retries++;
- parent.scheduler.register(this);
+ try {
+ getScheduler(encode()).register(this);
+ } catch (InserterException e1) {
+ fail(e1, true);
+ }
}
private void fail(InserterException e) {
+ fail(e, false);
+ }
+
+ private void fail(InserterException e, boolean forceFatal) {
synchronized(this) {
if(finished) return;
finished = true;
}
- if(e.isFatal())
+ if(e.isFatal() || forceFatal)
parent.fatallyFailedBlock();
else
parent.failedBlock();
@@ -197,10 +206,18 @@
parent.completedBlock(false);
finished = true;
} else {
- parent.scheduler.register(this);
+ getScheduler(encode()).register(this);
}
}
+ private ClientRequestScheduler getScheduler(ClientKeyBlock block) {
+ if(block instanceof ClientCHKBlock)
+ return parent.chkScheduler;
+ else if(block instanceof ClientSSKBlock)
+ return parent.sskScheduler;
+ else throw new IllegalArgumentException();
+ }
+
public FreenetURI getURI() {
if(resultingURI == null)
getBlock();
Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2006-03-08 09:20:38 UTC (rev 8193)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2006-03-08 15:48:28 UTC (rev 8194)
@@ -17,6 +17,7 @@
import freenet.keys.ClientCHK;
import freenet.keys.ClientKey;
import freenet.keys.ClientKeyBlock;
+import freenet.keys.ClientSSK;
import freenet.keys.FreenetURI;
import freenet.keys.KeyDecodeException;
import freenet.node.LowLevelGetException;
@@ -117,7 +118,12 @@
public void schedule() {
if(!dontTellClientGet)
this.parent.currentState = this;
- parent.scheduler.register(this);
+ if(key instanceof ClientCHK)
+ parent.chkScheduler.register(this);
+ else if(key instanceof ClientSSK)
+ parent.sskScheduler.register(this);
+ else
+ throw new IllegalStateException(String.valueOf(key));
}
public ClientGetter getParent() {
@@ -479,7 +485,7 @@
return;
}
retryCount++;
- parent.scheduler.register(this);
+ schedule();
return;
}
}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-03-08 09:20:38 UTC (rev
8193)
+++ trunk/freenet/src/freenet/node/Node.java 2006-03-08 15:48:28 UTC (rev
8194)
@@ -236,13 +236,20 @@
// Client stuff
final ArchiveManager archiveManager;
public final BucketFactory tempBucketFactory;
- final RequestThrottle requestThrottle;
- final RequestStarter requestStarter;
- final RequestThrottle insertThrottle;
- final RequestStarter insertStarter;
+ final RequestThrottle chkRequestThrottle;
+ final RequestStarter chkRequestStarter;
+ final RequestThrottle chkInsertThrottle;
+ final RequestStarter chkInsertStarter;
+ final RequestThrottle sskRequestThrottle;
+ final RequestStarter sskRequestStarter;
+ final RequestThrottle sskInsertThrottle;
+ final RequestStarter sskInsertStarter;
+
File downloadDir;
- public final ClientRequestScheduler fetchScheduler;
- public final ClientRequestScheduler putScheduler;
+ public final ClientRequestScheduler chkFetchScheduler;
+ public final ClientRequestScheduler chkPutScheduler;
+ public final ClientRequestScheduler sskFetchScheduler;
+ public final ClientRequestScheduler sskPutScheduler;
TextModeClientInterface tmci;
FCPServer fcpServer;
FproxyToadlet fproxyServlet;
@@ -840,18 +847,31 @@
// FIXME make all the below arbitrary constants configurable!
archiveManager = new ArchiveManager(MAX_ARCHIVE_HANDLERS,
MAX_CACHED_ARCHIVE_DATA, MAX_ARCHIVE_SIZE, MAX_ARCHIVED_FILE_SIZE,
MAX_CACHED_ELEMENTS, random, tempFilenameGenerator);
- requestThrottle = new RequestThrottle(5000, 2.0F);
- requestStarter = new RequestStarter(this, requestThrottle,
"Request starter ("+portNumber+")");
- fetchScheduler = new ClientRequestScheduler(false, random,
requestStarter, this);
- requestStarter.setScheduler(fetchScheduler);
- requestStarter.start();
+ chkRequestThrottle = new RequestThrottle(5000, 2.0F);
+ chkRequestStarter = new RequestStarter(this,
chkRequestThrottle, "Request starter ("+portNumber+")");
+ chkFetchScheduler = new ClientRequestScheduler(false, random,
chkRequestStarter, this);
+ chkRequestStarter.setScheduler(chkFetchScheduler);
+ chkRequestStarter.start();
//insertThrottle = new ChainedRequestThrottle(10000, 2.0F,
requestThrottle);
// FIXME reenable the above
- insertThrottle = new RequestThrottle(10000, 2.0F);
- insertStarter = new RequestStarter(this, insertThrottle,
"Insert starter ("+portNumber+")");
- putScheduler = new ClientRequestScheduler(true, random,
insertStarter, this);
- insertStarter.setScheduler(putScheduler);
- insertStarter.start();
+ chkInsertThrottle = new RequestThrottle(10000, 2.0F);
+ chkInsertStarter = new RequestStarter(this, chkInsertThrottle,
"Insert starter ("+portNumber+")");
+ chkPutScheduler = new ClientRequestScheduler(true, random,
chkInsertStarter, this);
+ chkInsertStarter.setScheduler(chkPutScheduler);
+ chkInsertStarter.start();
+
+ sskRequestThrottle = new RequestThrottle(5000, 2.0F);
+ sskRequestStarter = new RequestStarter(this,
sskRequestThrottle, "Request starter ("+portNumber+")");
+ sskFetchScheduler = new ClientRequestScheduler(false, random,
sskRequestStarter, this);
+ sskRequestStarter.setScheduler(sskFetchScheduler);
+ sskRequestStarter.start();
+ //insertThrottle = new ChainedRequestThrottle(10000, 2.0F,
requestThrottle);
+ // FIXME reenable the above
+ sskInsertThrottle = new RequestThrottle(10000, 2.0F);
+ sskInsertStarter = new RequestStarter(this, sskInsertThrottle,
"Insert starter ("+portNumber+")");
+ sskPutScheduler = new ClientRequestScheduler(true, random,
sskInsertStarter, this);
+ sskInsertStarter.setScheduler(sskPutScheduler);
+ sskInsertStarter.start();
// And finally, Initialize the plugin manager
pluginManager = new PluginManager(this);
@@ -959,7 +979,7 @@
boolean rejectedOverload = false;
while(true) {
if(rs.waitUntilStatusChange() && (!rejectedOverload)) {
- requestThrottle.requestRejectedOverload();
+ chkRequestThrottle.requestRejectedOverload();
rejectedOverload = true;
}
@@ -971,7 +991,7 @@
if(status == RequestSender.TIMED_OUT ||
status ==
RequestSender.GENERATED_REJECTED_OVERLOAD) {
if(!rejectedOverload) {
- requestThrottle.requestRejectedOverload();
+ chkRequestThrottle.requestRejectedOverload();
rejectedOverload = true;
}
} else {
@@ -980,7 +1000,7 @@
status == RequestSender.ROUTE_NOT_FOUND
||
status == RequestSender.VERIFY_FAILURE)
{
long rtt = System.currentTimeMillis() -
startTime;
- requestThrottle.requestCompleted(rtt);
+ chkRequestThrottle.requestCompleted(rtt);
}
}
@@ -1049,7 +1069,7 @@
boolean rejectedOverload = false;
while(true) {
if(rs.waitUntilStatusChange() && (!rejectedOverload)) {
- requestThrottle.requestRejectedOverload();
+ sskRequestThrottle.requestRejectedOverload();
rejectedOverload = true;
}
@@ -1061,7 +1081,7 @@
if(status == RequestSender.TIMED_OUT ||
status ==
RequestSender.GENERATED_REJECTED_OVERLOAD) {
if(!rejectedOverload) {
- requestThrottle.requestRejectedOverload();
+ sskRequestThrottle.requestRejectedOverload();
rejectedOverload = true;
}
} else {
@@ -1070,7 +1090,7 @@
status == RequestSender.ROUTE_NOT_FOUND
||
status == RequestSender.VERIFY_FAILURE)
{
long rtt = System.currentTimeMillis() -
startTime;
- requestThrottle.requestCompleted(rtt);
+ sskRequestThrottle.requestCompleted(rtt);
}
}
@@ -1155,7 +1175,7 @@
}
if((!hasForwardedRejectedOverload) &&
is.receivedRejectedOverload()) {
hasForwardedRejectedOverload = true;
- insertThrottle.requestRejectedOverload();
+ chkInsertThrottle.requestRejectedOverload();
}
}
@@ -1171,7 +1191,7 @@
}
if(is.anyTransfersFailed() && (!hasForwardedRejectedOverload)) {
hasForwardedRejectedOverload = true; // not strictly
true but same effect
- insertThrottle.requestRejectedOverload();
+ chkInsertThrottle.requestRejectedOverload();
}
}
@@ -1185,7 +1205,7 @@
// It worked!
long endTime = System.currentTimeMillis();
long len = endTime - startTime;
- insertThrottle.requestCompleted(len);
+ chkInsertThrottle.requestCompleted(len);
}
}
@@ -1257,7 +1277,7 @@
}
if((!hasForwardedRejectedOverload) &&
is.receivedRejectedOverload()) {
hasForwardedRejectedOverload = true;
- insertThrottle.requestRejectedOverload();
+ sskInsertThrottle.requestRejectedOverload();
}
}
@@ -1283,7 +1303,7 @@
// It worked!
long endTime = System.currentTimeMillis();
long len = endTime - startTime;
- insertThrottle.requestCompleted(len);
+ sskInsertThrottle.requestCompleted(len);
}
}
@@ -1902,13 +1922,21 @@
}
}
- public RequestThrottle getRequestThrottle() {
- return requestThrottle;
+ public RequestThrottle getCHKRequestThrottle() {
+ return chkRequestThrottle;
}
- public RequestThrottle getInsertThrottle() {
- return insertThrottle;
+ public RequestThrottle getCHKInsertThrottle() {
+ return chkInsertThrottle;
}
+
+ public RequestThrottle getSSKRequestThrottle() {
+ return sskRequestThrottle;
+ }
+
+ public RequestThrottle getSSKInsertThrottle() {
+ return sskInsertThrottle;
+ }
InetAddress lastIP;
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-08 09:20:38 UTC (rev
8193)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-08 15:48:28 UTC (rev
8194)
@@ -20,10 +20,10 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 506;
+ private static final int buildNumber = 507;
/** Oldest build of Fred we will talk to */
- private static final int lastGoodBuild = 475;
+ private static final int lastGoodBuild = 507;
public static final int buildNumber() {
return buildNumber;
Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java 2006-03-08 09:20:38 UTC
(rev 8193)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java 2006-03-08 15:48:28 UTC
(rev 8194)
@@ -129,7 +129,7 @@
returnBucket = ret;
if(persistenceType != PERSIST_CONNECTION)
client.register(this);
- getter = new ClientGetter(this, client.node.fetchScheduler,
uri, fctx, priorityClass, client, returnBucket);
+ getter = new ClientGetter(this, client.node.chkFetchScheduler,
client.node.sskFetchScheduler, uri, fctx, priorityClass, client, returnBucket);
if(persistenceType != PERSIST_CONNECTION && handler != null)
sendPendingMessages(handler.outputHandler, true);
@@ -202,7 +202,7 @@
}
returnBucket = ret;
- getter = new ClientGetter(this, client.node.fetchScheduler,
uri, fctx, priorityClass, client, returnBucket);
+ getter = new ClientGetter(this, client.node.chkFetchScheduler,
client.node.sskFetchScheduler, uri, fctx, priorityClass, client, returnBucket);
start();
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java 2006-03-08 09:20:38 UTC
(rev 8193)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java 2006-03-08 15:48:28 UTC
(rev 8194)
@@ -101,7 +101,7 @@
block = new InsertBlock(message.bucket, new
ClientMetadata(mimeType), uri);
if(persistenceType != PERSIST_CONNECTION)
client.register(this);
- inserter = new ClientPutter(this, message.bucket, uri, new
ClientMetadata(mimeType), ctx, client.node.putScheduler, priorityClass,
getCHKOnly, false, client);
+ inserter = new ClientPutter(this, message.bucket, uri, new
ClientMetadata(mimeType), ctx, client.node.chkPutScheduler,
client.node.sskPutScheduler, priorityClass, getCHKOnly, false, client);
if(persistenceType != PERSIST_CONNECTION && handler != null)
sendPendingMessages(handler.outputHandler, true);
}
@@ -158,7 +158,7 @@
generatedURI = new FreenetURI(genURI);
if(finished && (!succeeded))
putFailedMessage = new
PutFailedMessage(fs.subset("PutFailed"), false);
- inserter = new ClientPutter(this, data, uri, new
ClientMetadata(mimeType), ctx, client.node.putScheduler, priorityClass,
getCHKOnly, false, client);
+ inserter = new ClientPutter(this, data, uri, new
ClientMetadata(mimeType), ctx, client.node.chkPutScheduler,
client.node.sskPutScheduler, priorityClass, getCHKOnly, false, client);
if(!finished)
start();
}