Author: toad
Date: 2007-06-22 20:42:36 +0000 (Fri, 22 Jun 2007)
New Revision: 13716
Modified:
trunk/freenet/src/freenet/client/FetchException.java
trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
trunk/freenet/src/freenet/client/async/USKChecker.java
trunk/freenet/src/freenet/io/comm/DMT.java
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
trunk/freenet/src/freenet/node/LowLevelGetException.java
trunk/freenet/src/freenet/node/NodeClientCore.java
trunk/freenet/src/freenet/node/RequestHandler.java
trunk/freenet/src/freenet/node/RequestSender.java
Log:
Add handling for FNPRecentlyFailed (new low and high level error codes,
message, etc).
Sent (in future) when the failure table rejected a request because the same key
had been tried recently and had failed.
Necessary because we can't use DNF: If we use DNF, it can self-seed and cause
MAJOR problems.
Modified: trunk/freenet/src/freenet/client/FetchException.java
===================================================================
--- trunk/freenet/src/freenet/client/FetchException.java 2007-06-22
20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/client/FetchException.java 2007-06-22
20:42:36 UTC (rev 13716)
@@ -287,6 +287,8 @@
public static final int PERMANENT_REDIRECT = 27;
/** Requestor specified a list of allowed MIME types, and the key's
type wasn't in the list */
public static final int WRONG_MIME_TYPE = 29;
+ /** A node killed the request because it had recently been tried and
had DNFed */
+ public static final int RECENTLY_FAILED = 30;
/** Is an error fatal i.e. is there no point retrying? */
public boolean isFatal() {
@@ -321,6 +323,7 @@
case REJECTED_OVERLOAD:
case TRANSFER_FAILED:
case ALL_DATA_NOT_FOUND:
+ case RECENTLY_FAILED: // wait a bit, but fine
// Not usually fatal
case SPLITFILE_ERROR:
return false;
Modified: trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
2007-06-22 20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/client/async/SimpleSingleFileFetcher.java
2007-06-22 20:42:36 UTC (rev 13716)
@@ -47,6 +47,9 @@
case LowLevelGetException.DATA_NOT_FOUND_IN_STORE:
onFailure(new
FetchException(FetchException.DATA_NOT_FOUND));
return;
+ case LowLevelGetException.RECENTLY_FAILED:
+ onFailure(new
FetchException(FetchException.RECENTLY_FAILED));
+ return;
case LowLevelGetException.DECODE_FAILED:
onFailure(new
FetchException(FetchException.BLOCK_DECODE_ERROR));
return;
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2007-06-22 20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
2007-06-22 20:42:36 UTC (rev 13716)
@@ -99,6 +99,9 @@
case LowLevelGetException.DATA_NOT_FOUND_IN_STORE:
onFailure(new
FetchException(FetchException.DATA_NOT_FOUND), token);
return;
+ case LowLevelGetException.RECENTLY_FAILED:
+ onFailure(new
FetchException(FetchException.RECENTLY_FAILED), token);
+ return;
case LowLevelGetException.DECODE_FAILED:
onFailure(new
FetchException(FetchException.BLOCK_DECODE_ERROR), token);
return;
Modified: trunk/freenet/src/freenet/client/async/USKChecker.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKChecker.java 2007-06-22
20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/client/async/USKChecker.java 2007-06-22
20:42:36 UTC (rev 13716)
@@ -43,6 +43,7 @@
break;
case LowLevelGetException.DATA_NOT_FOUND:
case LowLevelGetException.DATA_NOT_FOUND_IN_STORE:
+ case LowLevelGetException.RECENTLY_FAILED:
dnfs++;
canRetry = true;
break;
Modified: trunk/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/DMT.java 2007-06-22 20:39:26 UTC (rev
13715)
+++ trunk/freenet/src/freenet/io/comm/DMT.java 2007-06-22 20:42:36 UTC (rev
13716)
@@ -521,6 +521,16 @@
return msg;
}
+ public static final MessageType FNPRecentlyFailed = new
MessageType("FNPRecentlyFailed") {{
+ addField(UID, Long.class);
+ }};
+
+ public static final Message createFNPRecentlyFailed(long id) {
+ Message msg = new Message(FNPRecentlyFailed);
+ msg.set(UID, id);
+ return msg;
+ }
+
public static final MessageType FNPCHKDataFound = new
MessageType("FNPCHKDataFound") {{
addField(UID, Long.class);
addField(BLOCK_HEADERS, ShortBuffer.class);
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-06-22
20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-06-22
20:42:36 UTC (rev 13716)
@@ -293,6 +293,7 @@
FetchException.longError.28=Not enough data found; some data was fetched but
redirect may point to nowhere
FetchException.longError.29=Wrong MIME Type: The key was not in the list of
allowed MIME types provided by the client
FetchException.longError.2=Don't know what to do with splitfile
+FetchException.longError.30=The request was terminated by a node because it
had recently received a request for the same key and that request had failed
FetchException.longError.3=Don't know what to do with metadata
FetchException.longError.4=Failed to parse metadata
FetchException.longError.5=Failure in extracting files from an archive
@@ -322,6 +323,7 @@
FetchException.shortError.28=All data not found
FetchException.shortError.29=Wrong MIME type
FetchException.shortError.2=Unknown splitfile metadata
+FetchException.shortError.30=Data not found (recently failed)
FetchException.shortError.3=Unknown metadata
FetchException.shortError.4=Invalid metadata
FetchException.shortError.5=Archive failure
Modified: trunk/freenet/src/freenet/node/LowLevelGetException.java
===================================================================
--- trunk/freenet/src/freenet/node/LowLevelGetException.java 2007-06-22
20:39:26 UTC (rev 13715)
+++ trunk/freenet/src/freenet/node/LowLevelGetException.java 2007-06-22
20:42:36 UTC (rev 13716)
@@ -29,6 +29,8 @@
public static final int VERIFY_FAILED = 8;
/** Request cancelled by user */
public static final int CANCELLED = 9;
+ /** Ran into a failure table */
+ public static final int RECENTLY_FAILED = 10;
static final String getMessage(int reason) {
switch(reason) {
@@ -50,6 +52,8 @@
return "Node sent us invalid data";
case CANCELLED:
return "Request cancelled";
+ case RECENTLY_FAILED:
+ return "Request killed by failure table due to recently
DNFing on a downstream node";
default:
return "Unknown error code: "+reason;
}
Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java 2007-06-22 20:39:26 UTC
(rev 13715)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java 2007-06-22 20:42:36 UTC
(rev 13716)
@@ -526,6 +526,7 @@
} else {
if(rs.hasForwarded() &&
((status ==
RequestSender.DATA_NOT_FOUND) ||
+ (status ==
RequestSender.RECENTLY_FAILED) ||
(status ==
RequestSender.SUCCESS) ||
(status ==
RequestSender.ROUTE_NOT_FOUND) ||
(status ==
RequestSender.VERIFY_FAILURE))) {
@@ -553,6 +554,8 @@
throw new
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
case RequestSender.DATA_NOT_FOUND:
throw new
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
+ case RequestSender.RECENTLY_FAILED:
+ throw new
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
case RequestSender.ROUTE_NOT_FOUND:
throw new
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
case RequestSender.TRANSFER_FAILED:
@@ -635,6 +638,7 @@
} else {
if(rs.hasForwarded() &&
((status ==
RequestSender.DATA_NOT_FOUND) ||
+ (status ==
RequestSender.RECENTLY_FAILED) ||
(status ==
RequestSender.SUCCESS) ||
(status ==
RequestSender.ROUTE_NOT_FOUND) ||
(status ==
RequestSender.VERIFY_FAILURE))) {
@@ -662,6 +666,8 @@
throw new
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
case RequestSender.DATA_NOT_FOUND:
throw new
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
+ case RequestSender.RECENTLY_FAILED:
+ throw new
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
case RequestSender.ROUTE_NOT_FOUND:
throw new
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
case RequestSender.TRANSFER_FAILED:
Modified: trunk/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestHandler.java 2007-06-22 20:39:26 UTC
(rev 13715)
+++ trunk/freenet/src/freenet/node/RequestHandler.java 2007-06-22 20:42:36 UTC
(rev 13716)
@@ -145,6 +145,10 @@
Message dnf = DMT.createFNPDataNotFound(uid);
source.sendSync(dnf, this);
return;
+ case RequestSender.RECENTLY_FAILED:
+ Message rf = DMT.createFNPRecentlyFailed(uid);
+ source.sendSync(rf, this);
+ return;
case RequestSender.GENERATED_REJECTED_OVERLOAD:
case RequestSender.TIMED_OUT:
case RequestSender.INTERNAL_ERROR:
Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java 2007-06-22 20:39:26 UTC
(rev 13715)
+++ trunk/freenet/src/freenet/node/RequestSender.java 2007-06-22 20:42:36 UTC
(rev 13716)
@@ -77,6 +77,7 @@
static final int TIMED_OUT = 6;
static final int GENERATED_REJECTED_OVERLOAD = 7;
static final int INTERNAL_ERROR = 8;
+ static final int RECENTLY_FAILED = 9;
private static boolean logMINOR;
@@ -241,13 +242,14 @@
while(true) {
MessageFilter mfDNF =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPDataNotFound);
+ MessageFilter mfRF =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPRecentlyFailed);
MessageFilter mfDF = makeDataFoundFilter(next);
MessageFilter mfRouteNotFound =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPRouteNotFound);
MessageFilter mfRejectedOverload =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPRejectedOverload);
MessageFilter mfPubKey =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPSSKPubKey);
MessageFilter mfRealDFCHK =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPCHKDataFound);
MessageFilter mfRealDFSSK =
MessageFilter.create().setSource(next).setField(DMT.UID,
uid).setTimeout(FETCH_TIMEOUT).setType(DMT.FNPSSKDataFound);
- MessageFilter mf =
mfDNF.or(mfRouteNotFound.or(mfRejectedOverload.or(mfDF.or(mfPubKey.or(mfRealDFCHK.or(mfRealDFSSK))))));
+ MessageFilter mf =
mfDNF.or(mfRF.or(mfRouteNotFound.or(mfRejectedOverload.or(mfDF.or(mfPubKey.or(mfRealDFCHK.or(mfRealDFSSK)))))));
try {
@@ -273,6 +275,12 @@
return;
}
+ if(msg.getSpec() == DMT.FNPRecentlyFailed) {
+ next.successNotOverload();
+ finish(RECENTLY_FAILED, next);
+ return;
+ }
+
if(msg.getSpec() == DMT.FNPRouteNotFound) {
// Backtrack within available hops
short newHtl = msg.getShort(DMT.HTL);