Author: toad
Date: 2008-06-26 14:46:48 +0000 (Thu, 26 Jun 2008)
New Revision: 20740
Modified:
branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
Log:
Deactivation: where we iterate over every segment, activating it, checking
something, and eventually deciding (most of the time) to do nothing; we can
deactivate all the segments except for the caller.
Note that these methods are called relatively rarely - once per segment each
typically.
Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
2008-06-26 14:42:04 UTC (rev 20739)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
2008-06-26 14:46:48 UTC (rev 20740)
@@ -259,6 +259,10 @@
synchronized(this) {
encode = forceEncode;
for(int i=0;i<segments.length;i++) {
+ if(segments[i] != segment) {
+ if(persistent)
+ container.activate(segments[i],
1);
+ }
if((segments[i] == null) ||
!segments[i].isEncoded()) {
ret = true;
break;
@@ -266,7 +270,13 @@
}
}
if(encode) segment.forceEncode(container, context);
- if(ret) return;
+ if(ret) {
+ for(int i=0;i<segments.length;i++) {
+ if(segments[i] != segment)
+ container.deactivate(segments[i], 1);
+ }
+ return;
+ }
if(persistent)
container.activate(cb, 1);
cb.onBlockSetFinished(this, container, context);
@@ -289,18 +299,26 @@
container.activate(segments[i], 1);
if(!segments[i].hasURIs()) {
if(logMINOR) Logger.minor(this,
"Segment does not have URIs: "+segments[i]);
+ if(persistent) {
+ for(int j=0;j<i;j++) {
+ if(segments[j] ==
segment) continue;
+
container.deactivate(segments[i], 1);
+ }
+ }
return;
}
}
}
if(logMINOR) Logger.minor(this, "Have URIs from all segments");
- encodeMetadata(container, context);
+ encodeMetadata(container, context, segment);
}
- private void encodeMetadata(ObjectContainer container, ClientContext
context) {
+ private void encodeMetadata(ObjectContainer container, ClientContext
context, SplitFileInserterSegment dontDeactivateSegment) {
boolean missingURIs;
Metadata m = null;
+ if(persistent)
+ activateSegments(container, dontDeactivateSegment);
synchronized(this) {
// Create metadata
ClientCHK[] dataURIs = getDataCHKs(container);
@@ -316,6 +334,8 @@
}
haveSentMetadata = true;
}
+ if(persistent)
+ deactivateSegments(container, dontDeactivateSegment);
if(missingURIs) {
if(logMINOR) Logger.minor(this, "Missing URIs");
// Error
@@ -328,6 +348,20 @@
}
}
+ private void activateSegments(ObjectContainer container,
SplitFileInserterSegment notMe) {
+ for(int i=0;i<segments.length;i++) {
+ if(segments[i] == notMe) continue;
+ container.activate(segments[i], 1);
+ }
+ }
+
+ private void deactivateSegments(ObjectContainer container,
SplitFileInserterSegment notMe) {
+ for(int i=0;i<segments.length;i++) {
+ if(segments[i] == notMe) continue;
+ container.deactivate(segments[i], 1);
+ }
+ }
+
private void fail(InsertException e, ObjectContainer container,
ClientContext context) {
synchronized(this) {
if(finished) return;
@@ -347,6 +381,12 @@
return false;
}
+ /**
+ * Segments MUST BE ACTIVATED TO DEPTH 1 BEFORE CALLING,
+ * and should be deactivated by caller.
+ * @param container
+ * @return
+ */
private ClientCHK[] getCheckCHKs(ObjectContainer container) {
// Copy check blocks from each segment into a FreenetURI[].
ClientCHK[] uris = new ClientCHK[countCheckBlocks];
@@ -370,6 +410,12 @@
return uris;
}
+ /**
+ * Segments MUST BE ACTIVATED TO DEPTH 1 BEFORE CALLING,
+ * and should be deactivated by caller.
+ * @param container
+ * @return
+ */
private ClientCHK[] getDataCHKs(ObjectContainer container) {
// Copy check blocks from each segment into a FreenetURI[].
ClientCHK[] uris = new ClientCHK[countDataBlocks];
@@ -411,9 +457,17 @@
return;
}
for(int i=0;i<segments.length;i++) {
+ if(persistent && segments[i] != segment)
+ container.activate(segments[i], 1);
if(!segments[i].isFinished()) {
if(logMINOR) Logger.minor(this,
"Segment not finished: "+i+": "+segments[i]);
allGone = false;
+ if(persistent) {
+ for(int j=0;j<=i;j++) {
+ if(segments[j] ==
segment) continue;
+
container.deactivate(segments[i], 1);
+ }
+ }
break;
}
}
@@ -437,8 +491,16 @@
if(finished) return;
if(fetchable) return;
for(int i=0;i<segments.length;i++) {
+ if(persistent && segments[i] != segment)
+ container.activate(segments[i], 1);
if(!segments[i].isFetchable()) {
if(logMINOR) Logger.minor(this,
"Segment not fetchable: "+i+": "+segments[i]);
+ if(persistent) {
+ for(int j=0;j<=i;j++) {
+ if(segments[j] ==
segment) continue;
+
container.deactivate(segments[i], 1);
+ }
+ }
return;
}
}
@@ -520,6 +582,8 @@
if(persistent)
container.activate(segments[i], 1);
segments[i].forceEncode(container, context);
+ if(persistent)
+ container.deactivate(segments[i], 1);
}
}