Author: toad
Date: 2005-11-11 15:11:15 +0000 (Fri, 11 Nov 2005)
New Revision: 7523
Modified:
trunk/freenet/src/freenet/client/BlockFetcher.java
trunk/freenet/src/freenet/client/BlockInserter.java
trunk/freenet/src/freenet/client/DefaultMIMETypes.java
trunk/freenet/src/freenet/client/InsertSegment.java
trunk/freenet/src/freenet/client/RetryTracker.java
trunk/freenet/src/freenet/client/SplitInserter.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/TextModeClientInterface.java
trunk/freenet/src/freenet/node/Version.java
Log:
159:
Lots of bug fixes, lots of new debugging code.
May still deadlock during inserts; this may be a problem with USM.
Modified: trunk/freenet/src/freenet/client/BlockFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/BlockFetcher.java 2005-11-11 00:20:30 UTC
(rev 7522)
+++ trunk/freenet/src/freenet/client/BlockFetcher.java 2005-11-11 15:11:15 UTC
(rev 7523)
@@ -33,6 +33,8 @@
realRun();
} catch (Throwable t) {
fatalError(t, FetchException.INTERNAL_ERROR);
+ } finally {
+ completedTries++;
}
}
Modified: trunk/freenet/src/freenet/client/BlockInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/BlockInserter.java 2005-11-11 00:20:30 UTC
(rev 7522)
+++ trunk/freenet/src/freenet/client/BlockInserter.java 2005-11-11 15:11:15 UTC
(rev 7523)
@@ -53,6 +53,7 @@
try {
realRun();
} catch (Throwable t) {
+ Logger.error(this, "Caught "+t, t);
fatalError(t, InserterException.INTERNAL_ERROR);
} finally {
completedTries++;
Modified: trunk/freenet/src/freenet/client/DefaultMIMETypes.java
===================================================================
--- trunk/freenet/src/freenet/client/DefaultMIMETypes.java 2005-11-11
00:20:30 UTC (rev 7522)
+++ trunk/freenet/src/freenet/client/DefaultMIMETypes.java 2005-11-11
15:11:15 UTC (rev 7523)
@@ -57,7 +57,9 @@
for(int i=0;i<extensions.length;i++) {
String ext = extensions[i].toLowerCase();
if(mimeTypesByExtension.containsKey(ext)) {
- Logger.error(DefaultMIMETypes.class,
"Extension already registered to number "+mimeTypesByExtension.get(ext));
+ // No big deal
+ Short s = (Short)
mimeTypesByExtension.get(ext);
+ Logger.normal(DefaultMIMETypes.class,
"Extension "+ext+" assigned to "+byNumber(s.shortValue())+" in preference to
"+number+":"+type);
} else
mimeTypesByExtension.put(ext, t);
}
Modified: trunk/freenet/src/freenet/client/InsertSegment.java
===================================================================
--- trunk/freenet/src/freenet/client/InsertSegment.java 2005-11-11 00:20:30 UTC
(rev 7522)
+++ trunk/freenet/src/freenet/client/InsertSegment.java 2005-11-11 15:11:15 UTC
(rev 7523)
@@ -33,8 +33,10 @@
*/
public FreenetURI[] getCheckURIs() {
FreenetURI[] uris = new FreenetURI[checkBlocks.length];
- for(int i=0;i<uris.length;i++)
- uris[i] = checkBlocks[i].getURI();
+ for(int i=0;i<uris.length;i++) {
+ FreenetURI uri = checkBlocks[i].getURI();
+ uris[i] = uri;
+ }
return uris;
}
@@ -48,6 +50,8 @@
for(int i=0;i<checkBlocks.length;i++)
checkBlocks[i] = new BlockInserter(null, offset + i,
tracker, ctx, getCHKOnly);
codec.encode(origDataBlocks, checkBlocks, blockLength, bf);
+ for(int i=0;i<checkBlocks.length;i++)
+ tracker.addBlock(checkBlocks[i]);
return checkBlocks.length;
}
Modified: trunk/freenet/src/freenet/client/RetryTracker.java
===================================================================
--- trunk/freenet/src/freenet/client/RetryTracker.java 2005-11-11 00:20:30 UTC
(rev 7522)
+++ trunk/freenet/src/freenet/client/RetryTracker.java 2005-11-11 15:11:15 UTC
(rev 7523)
@@ -12,14 +12,12 @@
*/
public class RetryTracker {
- static class Level {
+ class Level {
final int level;
final Vector blocks;
- final RetryTracker tracker;
- Level(RetryTracker tracker, int l) {
+ Level(int l) {
level = l;
- this.tracker = tracker;
blocks = new Vector();
}
@@ -29,10 +27,10 @@
*/
SplitfileBlock getBlock() {
int len = blocks.size();
- int x = tracker.random.nextInt(len);
+ int x = random.nextInt(len);
SplitfileBlock block = (SplitfileBlock)
blocks.remove(x);
if(blocks.isEmpty())
- tracker.removeLevel(level);
+ removeLevel(level);
return block;
}
@@ -48,7 +46,7 @@
void remove(SplitfileBlock block) {
blocks.remove(block);
if(blocks.isEmpty())
- tracker.removeLevel(level);
+ removeLevel(level);
}
}
@@ -140,7 +138,7 @@
/** Add a level */
private synchronized Level addLevel(int level, Integer x) {
if(level < 0) throw new IllegalArgumentException();
- Level l = new Level(this, level);
+ Level l = new Level(level);
levels.put(x, l);
if(level > curMaxLevel) curMaxLevel = level;
if(level < curMinLevel) curMinLevel = level;
@@ -174,10 +172,7 @@
public synchronized void nonfatalError(SplitfileBlock block, int
reasonCode) {
nonfatalErrors.inc(reasonCode);
runningBlocks.remove(block);
- Level l = makeLevel(block.getRetryCount());
- if(l == null) throw new IllegalArgumentException();
- int levelNumber = l.level;
- l.remove(block);
+ int levelNumber = block.getRetryCount();
levelNumber++;
if(levelNumber > maxLevel) {
failedBlocksTooManyRetries.add(block);
@@ -197,10 +192,6 @@
public synchronized void fatalError(SplitfileBlock block, int
reasonCode) {
fatalErrors.inc(reasonCode);
runningBlocks.remove(block);
- Level l = makeLevel(block.getRetryCount());
- if(l == null) throw new IllegalArgumentException();
- if(l.tracker != this) throw new
IllegalArgumentException("Belongs to wrong tracker");
- l.remove(block);
failedBlocksFatalErrors.add(block);
maybeStart(false);
}
@@ -212,6 +203,8 @@
public synchronized void maybeStart(boolean cantCallFinished) {
Logger.minor(this, "succeeded: "+succeededBlocks.size()+",
target: "+targetSuccesses+
", running: "+runningBlocks.size()+", levels:
"+levels.size()+", finishOnEmpty: "+finishOnEmpty);
+ if(runningBlocks.size() == 1)
+ Logger.minor(this, "Only block running:
"+runningBlocks.toArray()[0]);
if((succeededBlocks.size() >= targetSuccesses)
|| (runningBlocks.isEmpty() && levels.isEmpty()
&& finishOnEmpty)) {
Logger.minor(this, "Finishing");
@@ -250,7 +243,16 @@
*/
public synchronized SplitfileBlock getBlock() {
Level l = (Level) levels.get(new Integer(curMinLevel));
- if(l == null) return null;
+ if(l == null) {
+ if(!levels.isEmpty()) {
+ Integer x = (Integer)
levels.keySet().toArray()[0];
+ Logger.error(this, "Inconsistent: min level =
"+curMinLevel+", max level = "+curMaxLevel+" but level exists: "+x, new
Exception("error"));
+ curMinLevel = x.intValue();
+ curMaxLevel = x.intValue();
+ return getBlock();
+ }
+ return null;
+ }
return l.getBlock();
}
Modified: trunk/freenet/src/freenet/client/SplitInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/SplitInserter.java 2005-11-11 00:20:30 UTC
(rev 7522)
+++ trunk/freenet/src/freenet/client/SplitInserter.java 2005-11-11 15:11:15 UTC
(rev 7523)
@@ -28,7 +28,7 @@
InsertSegment encodingSegment;
InsertSegment[] segments;
final Vector unstartedSegments = new Vector();
- private boolean allSegmentsFinished = false;
+ private boolean finishedInserting = false;
private boolean getCHKOnly;
private int succeeded;
private int failed;
@@ -83,7 +83,7 @@
private FreenetURI waitForCompletion() throws InserterException {
tracker.setFinishOnEmpty();
synchronized(this) {
- while(!allSegmentsFinished) {
+ while(!finishedInserting) {
try {
wait(10*1000);
} catch (InterruptedException e) {
@@ -102,24 +102,29 @@
if(missingURIs && fatalErrors == 0 && failed == 0)
throw new IllegalStateException();
- Metadata metadata = new Metadata(splitfileAlgorithm, dataURIs,
checkURIs, clientMetadata, dataLength, compressionCodec);
+ FreenetURI uri = null;
- Bucket mbucket;
- try {
- mbucket = BucketTools.makeImmutableBucket(ctx.bf,
metadata.writeToByteArray());
- } catch (IOException e) {
- throw new
InserterException(InserterException.BUCKET_ERROR);
+ if(!missingURIs) {
+
+ Metadata metadata = new Metadata(splitfileAlgorithm,
dataURIs, checkURIs, clientMetadata, dataLength, compressionCodec);
+
+ Bucket mbucket;
+ try {
+ mbucket =
BucketTools.makeImmutableBucket(ctx.bf, metadata.writeToByteArray());
+ } catch (IOException e) {
+ throw new
InserterException(InserterException.BUCKET_ERROR);
+ }
+
+ if(inserter == null)
+ inserter = new FileInserter(ctx);
+
+ InsertBlock mblock = new InsertBlock(mbucket,
clientMetadata, FreenetURI.EMPTY_CHK_URI);
+
+ // 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)*/);
+
}
-
- if(inserter == null)
- inserter = new FileInserter(ctx);
-
- InsertBlock mblock = new InsertBlock(mbucket, clientMetadata,
FreenetURI.EMPTY_CHK_URI);
-
- // 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
- FreenetURI uri = inserter.run(mblock, true, getCHKOnly/* ||
(fatalErrors > 0 || failed > 0)*/);
-
// Did we succeed?
if(fatalErrors > 0) {
@@ -218,7 +223,7 @@
public void finished(SplitfileBlock[] succeeded, SplitfileBlock[]
failed, SplitfileBlock[] fatalErrors) {
synchronized(this) {
- allSegmentsFinished = true;
+ finishedInserting = true;
this.succeeded = succeeded.length;
this.failed = failed.length;
this.fatalErrorBlocks = fatalErrors;
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2005-11-11 00:20:30 UTC (rev
7522)
+++ trunk/freenet/src/freenet/node/Node.java 2005-11-11 15:11:15 UTC (rev
7523)
@@ -425,7 +425,10 @@
String msg = "Failed inserting "+block+" : "+is.getStatusString();
if(status == InsertSender.ROUTE_NOT_FOUND)
msg += " - this is normal on small networks; the data will
still be propagated, but it can't find the 20+ nodes needed for full success";
- Logger.error(this, msg);
+ if(is.getStatus() != InsertSender.ROUTE_NOT_FOUND)
+ Logger.error(this, msg);
+ else
+ Logger.normal(this, msg);
switch(is.getStatus()) {
case InsertSender.NOT_FINISHED:
Logger.error(this, "IS still running in putCHK!: "+is);
@@ -437,7 +440,6 @@
default:
Logger.error(this, "Unknown InsertSender code in
putCHK: "+is.getStatus()+" on "+is);
throw new
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-
}
}
}
Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-11
00:20:30 UTC (rev 7522)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2005-11-11
15:11:15 UTC (rev 7523)
@@ -77,8 +77,8 @@
System.out.println("CONNECT:<filename> - connect to a node from its
ref in a file.");
System.out.println("CONNECT:\n<noderef including an End on a line by
itself> - enter a noderef directly.");
System.out.println("NAME:<new node name> - change the node's name.");
- System.out.println("SUBFILE:<filename> - append all data received from
subscriptions to a file, rather than sending it to stdout.");
- System.out.println("SAY:<text> - send text to the last created/pushed
stream");
+// System.out.println("SUBFILE:<filename> - append all data received
from subscriptions to a file, rather than sending it to stdout.");
+// System.out.println("SAY:<text> - send text to the last
created/pushed stream");
System.out.println("STATUS - display some status information on the
node including its reference and connections.");
System.out.println("QUIT - exit the program");
// Read command, and data
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2005-11-11 00:20:30 UTC (rev
7522)
+++ trunk/freenet/src/freenet/node/Version.java 2005-11-11 15:11:15 UTC (rev
7523)
@@ -20,10 +20,10 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- public static final int buildNumber = 158;
+ public static final int buildNumber = 159;
/** Oldest build of Fred we will talk to */
- public static final int lastGoodBuild = 153;
+ public static final int lastGoodBuild = 159;
/** The highest reported build of fred */
public static int highestSeenBuild = buildNumber;