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;