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);


Reply via email to