Author: toad
Date: 2005-11-25 20:46:14 +0000 (Fri, 25 Nov 2005)
New Revision: 7610

Modified:
   trunk/freenet/src/freenet/client/FailureCodeTracker.java
   trunk/freenet/src/freenet/client/FetchException.java
   trunk/freenet/src/freenet/client/InserterException.java
   trunk/freenet/src/freenet/client/RetryTracker.java
   trunk/freenet/src/freenet/client/Segment.java
   trunk/freenet/src/freenet/client/SplitFetchException.java
   trunk/freenet/src/freenet/client/SplitInserter.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/Version.java
Log:
229:
Show breakdown of errors on a failure.
Also determine default filename by hash of data.


Modified: trunk/freenet/src/freenet/client/FailureCodeTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/FailureCodeTracker.java    2005-11-25 
19:34:36 UTC (rev 7609)
+++ trunk/freenet/src/freenet/client/FailureCodeTracker.java    2005-11-25 
20:46:14 UTC (rev 7610)
@@ -10,6 +10,12 @@
  */
 public class FailureCodeTracker {

+       public final boolean insert;
+       
+       public FailureCodeTracker(boolean insert) {
+               this.insert = insert;
+       }
+       
        public class Item {
                int x;
        }
@@ -23,20 +29,38 @@
                        map.put(key, i = new Item());
                i.x++;
        }
+
+       public synchronized void inc(Integer key, int val) {
+               Item i = (Item) map.get(key);
+               if(i == null)
+                       map.put(key, i = new Item());
+               i.x+=val;
+       }

        public synchronized String toVerboseString() {
                StringBuffer sb = new StringBuffer();
-               Collection values = map.values();
+               Collection values = map.keySet();
                Iterator i = values.iterator();
                while(i.hasNext()) {
                        Integer x = (Integer) i.next();
                        Item val = (Item) map.get(x);
-                       sb.append(x);
-                       sb.append('=');
+                       String s = insert ? 
InserterException.getMessage(x.intValue()) : 
FetchException.getMessage(x.intValue());
                        sb.append(val.x);
+                       sb.append('\t');
+                       sb.append(s);
                        sb.append('\n');
                }
                return sb.toString();
        }
+
+       public synchronized FailureCodeTracker merge(FailureCodeTracker 
accumulatedFatalErrorCodes) {
+               Iterator keys = map.keySet().iterator();
+               while(keys.hasNext()) {
+                       Integer k = (Integer) keys.next();
+                       Item item = (Item) map.get(k);
+                       inc(k, item.x);
+               }
+               return this;
+       }

 }

Modified: trunk/freenet/src/freenet/client/FetchException.java
===================================================================
--- trunk/freenet/src/freenet/client/FetchException.java        2005-11-25 
19:34:36 UTC (rev 7609)
+++ trunk/freenet/src/freenet/client/FetchException.java        2005-11-25 
20:46:14 UTC (rev 7610)
@@ -12,7 +12,10 @@

        private static final long serialVersionUID = -1106716067841151962L;

-       final int mode;
+       public final int mode;
+
+       /** For collection errors */
+       public final FailureCodeTracker errorCodes;

        /** Get the failure mode. */
        public int getMode() {
@@ -22,12 +25,14 @@
        public FetchException(int m) {
                super(getMessage(m));
                mode = m;
+               errorCodes = null;
                Logger.minor(this, "FetchException("+getMessage(mode)+")", 
this);
        }

        public FetchException(MetadataParseException e) {
                super(getMessage(INVALID_METADATA)+": "+e.getMessage());
                mode = INVALID_METADATA;
+               errorCodes = null;
                initCause(e);
                Logger.minor(this, "FetchException("+getMessage(mode)+"): 
"+e,e);
        }
@@ -35,6 +40,7 @@
        public FetchException(ArchiveFailureException e) {
                super(getMessage(INVALID_METADATA)+": "+e.getMessage());
                mode = ARCHIVE_FAILURE;
+               errorCodes = null;
                initCause(e);
                Logger.minor(this, "FetchException("+getMessage(mode)+"): 
"+e,e);
        }
@@ -42,17 +48,27 @@
        public FetchException(int mode, Throwable t) {
                super(getMessage(mode)+": "+t.getMessage());
                this.mode = mode;
+               errorCodes = null;
                initCause(t);
                Logger.minor(this, "FetchException("+getMessage(mode)+"): 
"+t.getMessage(),t);
        }

+       public FetchException(int mode, FailureCodeTracker errorCodes) {
+               super(getMessage(mode));
+               this.mode = mode;
+               this.errorCodes = errorCodes;
+               Logger.minor(this, "FetchException("+getMessage(mode)+")");
+               
+       }
+       
        public FetchException(int mode, String msg) {
                super(getMessage(mode)+": "+msg);
+               errorCodes = null;
                this.mode = mode;
                Logger.minor(this, "FetchException("+getMessage(mode)+"): 
"+msg,this);
        }

-       private static String getMessage(int mode) {
+       public static String getMessage(int mode) {
                switch(mode) {
                case TOO_DEEP_ARCHIVE_RECURSION:
                        return "Too many levels of recursion into archives";

Modified: trunk/freenet/src/freenet/client/InserterException.java
===================================================================
--- trunk/freenet/src/freenet/client/InserterException.java     2005-11-25 
19:34:36 UTC (rev 7609)
+++ trunk/freenet/src/freenet/client/InserterException.java     2005-11-25 
20:46:14 UTC (rev 7610)
@@ -1,9 +1,6 @@
 package freenet.client;

-import java.io.IOException;
-
 import freenet.keys.FreenetURI;
-import freenet.node.LowLevelPutException;
 import freenet.support.Logger;

 public class InserterException extends Exception {
@@ -11,7 +8,7 @@

        public final int mode;
        /** For collection errors */
-       public final FailureCodeTracker errorCodes;
+       public FailureCodeTracker errorCodes;
        /** If a non-serious error, the URI */
        public final FreenetURI uri;

@@ -68,7 +65,7 @@
        /** Could not insert a splitfile because a block failed too many times 
*/
        public static final int TOO_MANY_RETRIES_IN_BLOCKS = 7;

-       private static String getMessage(int mode) {
+       public static String getMessage(int mode) {
                switch(mode) {
                case INVALID_URI:
                        return "Caller supplied a URI we cannot use";

Modified: trunk/freenet/src/freenet/client/RetryTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/RetryTracker.java  2005-11-25 19:34:36 UTC 
(rev 7609)
+++ trunk/freenet/src/freenet/client/RetryTracker.java  2005-11-25 20:46:14 UTC 
(rev 7610)
@@ -83,10 +83,10 @@
         * @param cb The callback to call .finish(...) when we no longer have
         * anything to do *and* the client has set the finish on empty flag.
         */
-       public RetryTracker(int maxLevel, int targetSuccesses, RandomSource 
random, int maxThreads, boolean killOnFatalError, RetryTrackerCallback cb) {
+       public RetryTracker(int maxLevel, int targetSuccesses, RandomSource 
random, int maxThreads, boolean killOnFatalError, RetryTrackerCallback cb, 
boolean isInsert) {
                levels = new HashMap();
-               fatalErrors = new FailureCodeTracker();
-               nonfatalErrors = new FailureCodeTracker();
+               fatalErrors = new FailureCodeTracker(isInsert);
+               nonfatalErrors = new FailureCodeTracker(isInsert);
                this.targetSuccesses = targetSuccesses;
                this.maxLevel = maxLevel;
                this.random = random;

Modified: trunk/freenet/src/freenet/client/Segment.java
===================================================================
--- trunk/freenet/src/freenet/client/Segment.java       2005-11-25 19:34:36 UTC 
(rev 7609)
+++ trunk/freenet/src/freenet/client/Segment.java       2005-11-25 20:46:14 UTC 
(rev 7610)
@@ -64,7 +64,7 @@
                } else if(splitfileType == Metadata.SPLITFILE_ONION_STANDARD) {
                        minFetched = dataBlocks.length;
                } else throw new MetadataParseException("Unknown splitfile 
type"+splitfileType);
-               tracker = new RetryTracker(fctx.maxSplitfileBlockRetries, 
splitfileDataBlocks.length, fctx.random, fctx.maxSplitfileThreads, false, this);
+               tracker = new RetryTracker(fctx.maxSplitfileBlockRetries, 
splitfileDataBlocks.length, fctx.random, fctx.maxSplitfileThreads, false, this, 
false);
                // Don't add blocks to tracker yet, because don't want to start 
fetch yet.
                parentFetcher = fetcher;
                archiveContext = actx;
@@ -191,7 +191,7 @@
                                parentFetcher.segmentFinished(this);
                        }
                else {
-                       failureException = new 
SplitFetchException(failed.length, fatalErrors.length, succeeded.length, 
minFetched);
+                       failureException = new 
SplitFetchException(failed.length, fatalErrors.length, succeeded.length, 
minFetched, 
tracker.getAccumulatedNonFatalErrorCodes().merge(tracker.getAccumulatedFatalErrorCodes()));
                        finished = true;
                        parentFetcher.segmentFinished(this);
                }

Modified: trunk/freenet/src/freenet/client/SplitFetchException.java
===================================================================
--- trunk/freenet/src/freenet/client/SplitFetchException.java   2005-11-25 
19:34:36 UTC (rev 7609)
+++ trunk/freenet/src/freenet/client/SplitFetchException.java   2005-11-25 
20:46:14 UTC (rev 7610)
@@ -7,8 +7,8 @@
        final int succeeded;
        final int enough;

-       public SplitFetchException(int failed, int fatal, int succeeded, int 
enough) {
-               super(FetchException.SPLITFILE_ERROR);
+       public SplitFetchException(int failed, int fatal, int succeeded, int 
enough, FailureCodeTracker errorCodes) {
+               super(FetchException.SPLITFILE_ERROR, errorCodes);
                this.failed = failed;
                this.fatal = fatal;
                this.succeeded = succeeded;

Modified: trunk/freenet/src/freenet/client/SplitInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/SplitInserter.java 2005-11-25 19:34:36 UTC 
(rev 7609)
+++ trunk/freenet/src/freenet/client/SplitInserter.java 2005-11-25 20:46:14 UTC 
(rev 7610)
@@ -54,7 +54,7 @@
                this.dataLength = data.size();
                segmentSize = ctx.splitfileSegmentDataBlocks;
                checkSegmentSize = splitfileAlgorithm == 
Metadata.SPLITFILE_NONREDUNDANT ? 0 : ctx.splitfileSegmentCheckBlocks;
-               tracker = new RetryTracker(ctx.maxInsertBlockRetries, 
Integer.MAX_VALUE, ctx.random, ctx.maxSplitInsertThreads, true, this);
+               tracker = new RetryTracker(ctx.maxInsertBlockRetries, 
Integer.MAX_VALUE, ctx.random, ctx.maxSplitInsertThreads, true, this, true);
                try {
                        splitIntoBlocks();
                } catch (IOException e) {
@@ -136,7 +136,12 @@

                        // FIXME probably should uncomment below so it doesn't 
get inserted at all?
                        // FIXME this is a hack for small network support... 
but we will need that IRL... hmmm
-                       uri = inserter.run(mblock, true, getCHKOnly/* || 
(fatalErrors > 0 || failed > 0)*/);
+                       try {
+                               uri = inserter.run(mblock, true, getCHKOnly/* 
|| (fatalErrors > 0 || failed > 0)*/);
+                       } catch (InserterException e) {
+                               e.errorCodes = 
tracker.getAccumulatedNonFatalErrorCodes().merge(tracker.getAccumulatedFatalErrorCodes());
+                               throw e;
+                       }

                }
                // Did we succeed?

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-25 
19:34:36 UTC (rev 7609)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-25 
20:46:14 UTC (rev 7610)
@@ -22,13 +22,11 @@
 import freenet.client.events.EventDumper;
 import freenet.crypt.RandomSource;
 import freenet.io.comm.PeerParseException;
-import freenet.keys.CHKEncodeException;
-import freenet.keys.ClientCHK;
-import freenet.keys.ClientCHKBlock;
 import freenet.keys.FreenetURI;
 import freenet.support.ArrayBucket;
 import freenet.support.Bucket;
 import freenet.support.BucketTools;
+import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.io.FileBucket;
@@ -172,7 +170,7 @@
                 String fnam = uri.getDocName();
                 fnam = sanitize(fnam);
                 if(fnam.length() == 0) {
-                    fnam = "freenet-download-"+System.currentTimeMillis();
+                    fnam = 
"freenet-download-"+HexUtil.bytesToHex(BucketTools.hash(data), 0, 10);
                     String ext = 
DefaultMIMETypes.getExtension(cm.getMIMEType());
                     if(ext != null && !ext.equals(""))
                        fnam += "." + ext;
@@ -203,6 +201,9 @@
                 System.out.println("Download rate: "+rate+" bytes / second");
                        } catch (FetchException e) {
                                System.out.println("Error: "+e.getMessage());
+               if(e.getMode() == e.SPLITFILE_ERROR && e.errorCodes != null) {
+                       System.out.println(e.errorCodes.toVerboseString());
+               }
                        }
         } else if(uline.startsWith("QUIT")) {
             System.out.println("Goodbye.");
@@ -285,6 +286,10 @@
                     double rate = 1000.0 * sz / (endTime-startTime);
                     System.out.println("Upload rate: "+rate+" bytes / second");
                }
+               if(e.errorCodes != null) {
+                       System.out.println("Splitfile errors breakdown:");
+                       System.out.println(e.errorCodes.toVerboseString());
+               }
             } catch (Throwable t) {
                 System.out.println("Insert threw: "+t);
                 t.printStackTrace();

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-25 19:34:36 UTC (rev 
7609)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-25 20:46:14 UTC (rev 
7610)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       public static final int buildNumber = 228;
+       public static final int buildNumber = 229;

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


Reply via email to