Author: toad
Date: 2009-03-06 22:31:02 +0000 (Fri, 06 Mar 2009)
New Revision: 25909
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
Log:
removeFrom() for splitfile inserts. Clear the CHKs when we put them into
metadata so they don't get removed. Clone cm as needed. Store encode FECJob in
segment, if it is set wait for the encode callback before removing the segment.
Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
2009-03-06 22:27:39 UTC (rev 25908)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
2009-03-06 22:31:02 UTC (rev 25909)
@@ -373,9 +373,11 @@
container.activate(segments[i], 1);
ClientCHK[] data = segments[i].getDataCHKs();
System.arraycopy(data, 0, dataURIs, dpos,
data.length);
+ if(persistent) segments[i].clearDataCHKs();
dpos += data.length;
ClientCHK[] check = segments[i].getCheckCHKs();
System.arraycopy(check, 0, checkURIs, cpos,
check.length);
+ if(persistent) segments[i].clearCheckCHKs();
cpos += check.length;
if(persistent && segments[i] !=
dontDeactivateSegment)
container.deactivate(segments[i], 1);
@@ -395,7 +397,7 @@
if(!missingURIs) {
// Create Metadata
- m = new Metadata(splitfileAlgorithm, dataURIs,
checkURIs, segmentSize, checkSegmentSize, cm, dataLength, archiveType,
compressionCodec, decompressedLength, isMetadata);
+ m = new Metadata(splitfileAlgorithm, dataURIs,
checkURIs, segmentSize, checkSegmentSize, persistent ? cm.clone() : cm,
dataLength, archiveType, compressionCodec, decompressedLength, isMetadata);
}
haveSentMetadata = true;
}
@@ -583,4 +585,18 @@
}
}
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ // parent can remove itself
+ // ctx will be removed by parent
+ // cb will remove itself
+ container.activate(cm, 5);
+ cm.removeFrom(container);
+ // token setter can remove token
+ for(SplitFileInserterSegment segment : segments) {
+ container.activate(segment, 1);
+ segment.removeFrom(container, context);
+ }
+ container.delete(this);
+ }
+
}
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
---
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2009-03-06 22:27:39 UTC (rev 25908)
+++
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
2009-03-06 22:31:02 UTC (rev 25909)
@@ -97,6 +97,8 @@
private final boolean persistent;
+ private FECJob encodeJob;
+
public SplitFileInserterSegment(SplitFileInserter parent, boolean
persistent, BaseClientPutter putter,
short splitfileAlgo, int checkBlockCount, Bucket[]
origDataBlocks,
@@ -417,7 +419,7 @@
for(int
i=0;i<dataBlocks.length;i++)
container.activate(dataBlocks[i], 5);
}
- job = new FECJob(splitfileAlgo,
context.fecQueue, dataBlocks, checkBlocks, CHKBlock.DATA_LENGTH,
blockInsertContext.persistentBucketFactory, this, false,
parent.parent.getPriorityClass(), persistent);
+ job = encodeJob = new
FECJob(splitfileAlgo, context.fecQueue, dataBlocks, checkBlocks,
CHKBlock.DATA_LENGTH, blockInsertContext.persistentBucketFactory, this, false,
parent.parent.getPriorityClass(), persistent);
}
}
fin = false;
@@ -522,7 +524,27 @@
boolean fin;
synchronized(this) {
fin = finished;
+ encodeJob = null;
}
+ if(removeOnEncode) {
+ if(logMINOR) Logger.minor(this, "Removing on encode:
"+this);
+ for(int i=0;i<dataBuckets.length;i++) {
+ if(dataBuckets[i] == null) continue;
+ dataBuckets[i].free();
+ if(persistent)
+ dataBuckets[i].removeFrom(container);
+ dataBuckets[i] = null;
+ }
+ for(int i=0;i<checkBuckets.length;i++) {
+ if(checkBuckets[i] == null) continue;
+ checkBuckets[i].free();
+ if(persistent)
+ checkBuckets[i].removeFrom(container);
+ checkBuckets[i] = null;
+ }
+ removeFrom(container, context);
+ return;
+ }
if(fin) {
Logger.error(this, "Encoded segment even though segment
finished! Freeing buckets...");
for(int i=0;i<dataBuckets.length;i++) {
@@ -752,6 +774,20 @@
return dataURIs;
}
+ public void clearCheckCHKs() {
+ for(int i=0;i<checkURIs.length;i++)
+ checkURIs[i] = null;
+ }
+
+ public void clearDataCHKs() {
+ for(int i=0;i<dataURIs.length;i++)
+ dataURIs[i] = null;
+ }
+
+ /** Get the InsertException for this segment.
+ * NOTE: This will be deleted when the segment is deleted! Do not store
it or pass
+ * it on!
+ */
InsertException getException() {
synchronized (this) {
return toThrow;
@@ -1437,4 +1473,62 @@
if(persistent) container.deactivate(blocks, 1);
return ret;
}
+
+ private boolean removeOnEncode;
+
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ if(encodeJob != null) {
+ if(!encodeJob.cancel(container, context)) {
+ synchronized(this) {
+ removeOnEncode = true;
+ if(logMINOR) Logger.minor(this, "Will
remove after encode finished: "+this);
+ container.store(this);
+ return;
+ }
+ }
+ encodeJob = null;
+ }
+ // parent, putter can deal with themselves
+ for(int i=0;i<dataBlocks.length;i++) {
+ if(dataBlocks[i] == null) continue;
+ container.activate(dataBlocks[i], 1);
+ dataBlocks[i].free();
+ dataBlocks[i].removeFrom(container);
+ dataBlocks[i] = null;
+ }
+ for(int i=0;i<checkBlocks.length;i++) {
+ if(checkBlocks[i] == null) continue;
+ container.activate(checkBlocks[i], 1);
+ checkBlocks[i].free();
+ checkBlocks[i].removeFrom(container);
+ checkBlocks[i] = null;
+ }
+ for(ClientCHK chk : dataURIs) {
+ if(chk != null) {
+ container.activate(chk, 5);
+ chk.removeFrom(container);
+ }
+ }
+ for(ClientCHK chk : checkURIs) {
+ if(chk != null) {
+ container.activate(chk, 5);
+ chk.removeFrom(container);
+ }
+ }
+ container.activate(blocks, 5);
+ for(Integer i : blocks) {
+ container.activate(i, 1);
+ container.delete(i);
+ }
+ container.delete(blocks);
+ if(toThrow != null) {
+ container.activate(toThrow, 5);
+ toThrow.removeFrom(container);
+ }
+ if(errors != null) {
+ container.activate(errors, 1);
+ errors.removeFrom(container);
+ }
+ container.delete(this);
+ }
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs