Author: toad
Date: 2006-11-10 18:25:53 +0000 (Fri, 10 Nov 2006)
New Revision: 10857
Modified:
trunk/freenet/src/freenet/client/ArchiveStoreContext.java
trunk/freenet/src/freenet/client/RealArchiveStoreItem.java
trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
Log:
Fix several bugs related to archives and splitfile fetches.
Including the Null: data block 0 bug and the infinite recursion in fetchArchive
bug.
Modified: trunk/freenet/src/freenet/client/ArchiveStoreContext.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveStoreContext.java 2006-11-10
17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/ArchiveStoreContext.java 2006-11-10
18:25:53 UTC (rev 10857)
@@ -128,4 +128,11 @@
return archiveType;
}
+ public FreenetURI getKey() {
+ return key;
+ }
+
+ public void extractToCache(Bucket bucket, ArchiveContext actx) throws
ArchiveFailureException, ArchiveRestartException {
+ manager.extractToCache(key, archiveType, bucket, actx, this);
+ }
}
Modified: trunk/freenet/src/freenet/client/RealArchiveStoreItem.java
===================================================================
--- trunk/freenet/src/freenet/client/RealArchiveStoreItem.java 2006-11-10
17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/RealArchiveStoreItem.java 2006-11-10
18:25:53 UTC (rev 10857)
@@ -14,10 +14,10 @@
class RealArchiveStoreItem extends ArchiveStoreItem {
private final ArchiveManager manager;
- boolean finalized;
- File myFilename;
- PaddedEphemerallyEncryptedBucket bucket;
- FileBucket underBucket;
+ private boolean finalized;
+ private final File myFilename;
+ private final PaddedEphemerallyEncryptedBucket bucket;
+ private final FileBucket underBucket;
/**
* Create an ArchiveStoreElement from a TempStoreElement.
Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2006-11-10 17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
2006-11-10 18:25:53 UTC (rev 10857)
@@ -300,7 +300,7 @@
onSuccess(new
FetchResult(this.clientMetadata, out));
return;
} else {
- if(logMINOR) Logger.minor(this,
"Fetching archive");
+ if(logMINOR) Logger.minor(this,
"Fetching archive (thisKey="+thisKey+")");
// Metadata cannot contain pointers to
files which don't exist.
// We enforce this in ArchiveHandler.
// Therefore, the archive needs to be
fetched.
@@ -402,7 +402,7 @@
if((len > ctx.maxOutputLength) ||
(len > ctx.maxTempLength)) {
- onFailure(new
FetchException(FetchException.TOO_BIG, len, isFinal && decompressors.isEmpty(),
clientMetadata.getMIMEType()));
+ onFailure(new
FetchException(FetchException.TOO_BIG, len, isFinal && decompressors.size() <=
(metadata.isCompressed() ? 1 : 0), clientMetadata.getMIMEType()));
return;
}
@@ -459,7 +459,7 @@
public void onSuccess(FetchResult result, ClientGetState state)
{
try {
- ctx.archiveManager.extractToCache(thisKey,
ah.getArchiveType(), result.asBucket(), actx, ah);
+ ah.extractToCache(result.asBucket(), actx);
} catch (ArchiveFailureException e) {
SingleFileFetcher.this.onFailure(new
FetchException(e));
} catch (ArchiveRestartException e) {
Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
2006-11-10 17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
2006-11-10 18:25:53 UTC (rev 10857)
@@ -81,9 +81,9 @@
splitfileDataBlocks = metadata.getSplitfileDataKeys();
splitfileCheckBlocks = metadata.getSplitfileCheckKeys();
for(int i=0;i<splitfileDataBlocks.length;i++)
- if(splitfileDataBlocks[i] == null) throw new
NullPointerException("Null: data block "+i);
+ if(splitfileDataBlocks[i] == null) throw new
NullPointerException("Null: data block "+i+" of "+splitfileDataBlocks.length);
for(int i=0;i<splitfileCheckBlocks.length;i++)
- if(splitfileCheckBlocks[i] == null) throw new
NullPointerException("Null: check block "+i);
+ if(splitfileCheckBlocks[i] == null) throw new
NullPointerException("Null: check block "+i+" of "+splitfileCheckBlocks.length);
long finalLength = splitfileDataBlocks.length *
CHKBlock.DATA_LENGTH;
if(finalLength > overrideLength) {
if(finalLength - overrideLength > CHKBlock.DATA_LENGTH)
@@ -116,7 +116,15 @@
Logger.minor(this, "Algorithm: "+splitfileType+",
blocks per segment: "+blocksPerSegment+", check blocks per segment:
"+checkBlocksPerSegment+", segments: "+segmentCount);
segments = new SplitFileFetcherSegment[segmentCount]; //
initially null on all entries
if(segmentCount == 1) {
- segments[0] = new
SplitFileFetcherSegment(splitfileType, splitfileDataBlocks,
splitfileCheckBlocks, this, archiveContext, fetchContext, maxTempLength,
splitUseLengths, recursionLevel);
+ // splitfile* will be overwritten, this is bad
+ // so copy them
+ FreenetURI[] newSplitfileDataBlocks = new
FreenetURI[splitfileDataBlocks.length];
+ FreenetURI[] newSplitfileCheckBlocks = new
FreenetURI[splitfileCheckBlocks.length];
+ System.arraycopy(splitfileDataBlocks, 0,
newSplitfileDataBlocks, 0, splitfileDataBlocks.length);
+ if(splitfileCheckBlocks.length > 0)
+ System.arraycopy(splitfileCheckBlocks, 0,
newSplitfileCheckBlocks, 0, splitfileCheckBlocks.length);
+ segments[0] = new
SplitFileFetcherSegment(splitfileType, newSplitfileDataBlocks,
newSplitfileCheckBlocks,
+ this, archiveContext, fetchContext,
maxTempLength, splitUseLengths, recursionLevel);
} else {
int dataBlocksPtr = 0;
int checkBlocksPtr = 0;
@@ -240,6 +248,8 @@
cb.onSuccess(new FetchResult(clientMetadata, data),
this);
} catch (FetchException e) {
cb.onFailure(e, this);
+ } catch (Throwable t) {
+ cb.onFailure(new
FetchException(FetchException.INTERNAL_ERROR, t), this);
}
}