Author: toad
Date: 2009-03-06 22:22:49 +0000 (Fri, 06 Mar 2009)
New Revision: 25906
Modified:
branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
Log:
Add removeFrom()'s, remove the InsertBlock using the previous commit, remove
self when transitioning. The removeFrom()'s will not be called yet.
Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
2009-03-06 22:20:19 UTC (rev 25905)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
2009-03-06 22:22:49 UTC (rev 25906)
@@ -44,7 +44,7 @@
private static boolean logMINOR;
final BaseClientPutter parent;
- final InsertBlock block;
+ InsertBlock block;
final InsertContext ctx;
final boolean metadata;
final PutCompletionCallback cb;
@@ -244,9 +244,12 @@
cb.onBlockSetFinished(this, container, context);
started = true;
if(persistent) {
- container.store(this);
if(!parentWasActive)
container.deactivate(parent, 1);
+ block.nullData();
+ block.removeFrom(container);
+ block = null;
+ removeFrom(container, context);
}
return;
}
@@ -283,7 +286,7 @@
Logger.error(this, "Caught "+e, e);
throw new
InsertException(InsertException.INTERNAL_ERROR, "Got
MetadataUnresolvedException in SingleFileInserter: "+e.toString(), null);
}
- ClientPutState metaPutter =
createInserter(parent, metadataBucket, (short) -1, block.desiredURI, ctx, mcb,
true, (int)origSize, -1, getCHKOnly, true, false, container, context, true);
+ ClientPutState metaPutter =
createInserter(parent, metadataBucket, (short) -1, persistent ?
block.desiredURI.clone() : block.desiredURI, ctx, mcb, true, (int)origSize, -1,
getCHKOnly, true, false, container, context, true);
if(logMINOR)
Logger.minor(this, "Inserting metadata:
"+metaPutter+" for "+this);
mcb.addURIGenerator(metaPutter, container);
@@ -299,9 +302,12 @@
}
started = true;
if(persistent) {
- container.store(this);
if(!parentWasActive)
container.deactivate(parent, 1);
+ block.nullData();
+ block.removeFrom(container);
+ block = null;
+ removeFrom(container, context);
}
return;
}
@@ -321,6 +327,9 @@
container.store(sfi);
container.deactivate(sfi, 1);
}
+ block.nullData();
+ block = null;
+ removeFrom(container, context);
} else {
SplitHandler sh = new SplitHandler();
SplitFileInserter sfi = new SplitFileInserter(parent,
sh, data, bestCodec, origSize, block.clientMetadata, ctx, getCHKOnly, metadata,
token, archiveType, shouldFreeData, persistent, container, context);
@@ -336,10 +345,11 @@
container.store(sfi);
container.deactivate(sfi, 1);
}
+ started = true;
+ if(persistent)
+ container.store(this);
}
- started = true;
if(persistent) {
- container.store(this);
if(!parentWasActive)
container.deactivate(parent, 1);
}
@@ -438,7 +448,7 @@
getCHKOnly, addToParent, false,
this.token, container, context, persistent, freeData);
if(encodeCHK) {
ClientKey key = sbi.getBlock(container,
context, true).getClientKey();
- cb.onEncode(key, this, container, context);
+ //cb.onEncode(key, this, container, context); -
will be called by getBlock()
}
return sbi;
}
@@ -549,6 +559,7 @@
logMINOR = Logger.shouldLog(Logger.MINOR, this);
if(logMINOR) Logger.minor(this, "onSuccess("+state+")
for "+this);
boolean lateStart = false;
+ ClientPutState toRemove = null;
synchronized(this) {
if(finished){
if(freeData) {
@@ -566,9 +577,13 @@
} else {
if(logMINOR) Logger.minor(this,
"Metadata already started for "+this+" : success="+metaInsertSuccess+"
started="+metaInsertStarted);
}
+ sfi = null;
+ toRemove = state;
} else if(state == metadataPutter) {
if(logMINOR) Logger.minor(this,
"Metadata insert succeeded for "+this+" : "+state);
metaInsertSuccess = true;
+ metadataPutter = null;
+ toRemove = state;
} else {
Logger.error(this, "Unknown: "+state+"
for "+this, new Exception("debug"));
}
@@ -577,6 +592,8 @@
finished = true;
}
}
+ if(toRemove != null)
+ toRemove.removeFrom(container, context);
if(persistent)
container.store(this);
if(lateStart)
@@ -594,13 +611,27 @@
if(persistent) {
container.activate(block, 1);
}
+ boolean toFail = true;
+ boolean toRemove = false;
synchronized(this) {
+ if(state == sfi) {
+ toRemove = true;
+ sfi = null;
+ } else if(state == metadataPutter) {
+ toRemove = true;
+ metadataPutter = null;
+ } else {
+ Logger.error(this, "onFailure() on
unknown state "+state+" on "+this);
+ }
if(finished){
if(freeData)
block.free(container);
- return;
+ toFail = false; // Already failed
}
}
+ if(toRemove)
+ state.removeFrom(container, context);
+ if(toFail)
fail(e, container, context);
}
@@ -895,6 +926,12 @@
// Chain to containing class, since we use its members
extensively.
container.activate(SingleFileInserter.this, 1);
}
+
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ container.delete(this);
+ // Remove parent as well, since we always transition
from parent to SH i.e. it will not get a removeFrom().
+ SingleFileInserter.this.removeFrom(container, context);
+ }
}
@@ -940,4 +977,16 @@
boolean started() {
return started;
}
+
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ // parent removes self
+ // token is passed in, creator of token is responsible for
removing it
+ if(block != null) {
+ container.activate(block, 1);
+ block.removeFrom(container);
+ }
+ // ctx is passed in, creator is responsible for removing it
+ // cb removes itself
+ container.delete(this);
+ }
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs