Author: toad
Date: 2009-03-06 22:39:55 +0000 (Fri, 06 Mar 2009)
New Revision: 25917
Modified:
branches/db4o/freenet/src/freenet/client/async/BinaryBlobInserter.java
branches/db4o/freenet/src/freenet/client/async/ClientPutState.java
branches/db4o/freenet/src/freenet/client/async/ClientPutter.java
branches/db4o/freenet/src/freenet/client/async/USKInserter.java
Log:
removeFrom(): implement it, call it. clone stuff where needed, etc.
Modified: branches/db4o/freenet/src/freenet/client/async/BinaryBlobInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/BinaryBlobInserter.java
2009-03-06 22:38:11 UTC (rev 25916)
+++ branches/db4o/freenet/src/freenet/client/async/BinaryBlobInserter.java
2009-03-06 22:39:55 UTC (rev 25917)
@@ -213,5 +213,10 @@
else
parent.onFailure(new
InsertException(InsertException.TOO_MANY_RETRIES_IN_BLOCKS, errors, null),
this, container, context);
}
+
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ // FIXME: Persistent blob inserts are not supported.
+ throw new UnsupportedOperationException();
+ }
}
Modified: branches/db4o/freenet/src/freenet/client/async/ClientPutState.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientPutState.java
2009-03-06 22:38:11 UTC (rev 25916)
+++ branches/db4o/freenet/src/freenet/client/async/ClientPutState.java
2009-03-06 22:39:55 UTC (rev 25917)
@@ -33,4 +33,11 @@
/** Serialize current progress to a SimpleFieldSet.
* Does not have to be complete! */
public abstract SimpleFieldSet getProgressFieldset();
+
+ /**
+ * Once the callback has finished with this fetch, it will call
removeFrom() to instruct the fetch
+ * to remove itself and all its subsidiary objects from the database.
+ * @param container
+ */
+ public void removeFrom(ObjectContainer container, ClientContext
context);
}
Modified: branches/db4o/freenet/src/freenet/client/async/ClientPutter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/ClientPutter.java
2009-03-06 22:38:11 UTC (rev 25916)
+++ branches/db4o/freenet/src/freenet/client/async/ClientPutter.java
2009-03-06 22:39:55 UTC (rev 25917)
@@ -191,11 +191,17 @@
public void onSuccess(ClientPutState state, ObjectContainer container,
ClientContext context) {
if(persistent())
container.activate(client, 1);
+ ClientPutState oldState;
synchronized(this) {
finished = true;
+ oldState = currentState;
currentState = null;
oldProgress = null;
}
+ if(oldState != null && persistent())
+ oldState.removeFrom(container, context);
+ if(state != null && state != oldState && persistent())
+ state.removeFrom(container, context);
if(super.failedBlocks > 0 || super.fatallyFailedBlocks > 0 ||
super.successfulBlocks < super.totalBlocks) {
Logger.error(this, "Failed blocks: "+failedBlocks+",
Fatally failed blocks: "+fatallyFailedBlocks+
", Successful blocks:
"+successfulBlocks+", Total blocks: "+totalBlocks+" but success?! on "+this+"
from "+state,
@@ -209,11 +215,17 @@
public void onFailure(InsertException e, ClientPutState state,
ObjectContainer container, ClientContext context) {
if(persistent())
container.activate(client, 1);
+ ClientPutState oldState;
synchronized(this) {
finished = true;
+ oldState = currentState;
currentState = null;
oldProgress = null;
}
+ if(oldState != null && persistent())
+ oldState.removeFrom(container, context);
+ if(state != null && state != oldState && persistent())
+ state.removeFrom(container, context);
if(persistent())
container.store(this);
client.onFailure(e, this, container);
@@ -230,6 +242,11 @@
if(persistent())
container.activate(client, 1);
synchronized(this) {
+ if(this.uri != null) {
+ Logger.error(this, "onEncode() called twice?
Already have a uri: "+uri+" for "+this);
+ if(persistent())
+ this.uri.removeFrom(container);
+ }
this.uri = key.getURI();
if(targetFilename != null)
uri = uri.pushMetaString(targetFilename);
@@ -271,6 +288,7 @@
public void onTransition(ClientPutState oldState, ClientPutState
newState, ObjectContainer container) {
if(newState == null) throw new NullPointerException();
+ // onTransition is *not* responsible for removing the old
state, the caller is.
synchronized (this) {
if (currentState == oldState) {
currentState = newState;
Modified: branches/db4o/freenet/src/freenet/client/async/USKInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/USKInserter.java
2009-03-06 22:38:11 UTC (rev 25916)
+++ branches/db4o/freenet/src/freenet/client/async/USKInserter.java
2009-03-06 22:39:55 UTC (rev 25917)
@@ -161,10 +161,14 @@
Logger.minor(this, "URI should be "+targetURI+"
actually is "+realURI);
context.uskManager.update(pubUSK, edition, context);
}
+ if(persistent) state.removeFrom(container, context);
// FINISHED!!!! Yay!!!
}
- public synchronized void onFailure(InsertException e, ClientPutState
state, ObjectContainer container, ClientContext context) {
+ public void onFailure(InsertException e, ClientPutState state,
ObjectContainer container, ClientContext context) {
+ ClientPutState oldSBI;
+ synchronized(this) {
+ oldSBI = sbi;
sbi = null;
if(e.getMode() == InsertException.COLLISION) {
// Try the next slot
@@ -176,6 +180,14 @@
} else {
cb.onFailure(e, state, container, context);
}
+ }
+ if(state != null && persistent) {
+ state.removeFrom(container, context);
+ }
+ if(oldSBI != null && oldSBI != state) {
+ container.activate(oldSBI, 1);
+ oldSBI.removeFrom(container, context);
+ }
}
public USKInserter(BaseClientPutter parent, Bucket data, short
compressionCodec, FreenetURI uri,
@@ -208,14 +220,19 @@
}
public void cancel(ObjectContainer container, ClientContext context) {
- if(fetcher != null)
- fetcher.cancel(container, context);
- if(sbi != null)
- sbi.cancel(container, context);
+ USKFetcherTag tag;
synchronized(this) {
- finished = true;
+ tag = fetcher;
fetcher = null;
}
+ if(tag != null)
+ tag.cancel(container, context);
+ if(sbi != null) {
+ sbi.cancel(container, context); // will call onFailure,
which will removeFrom()
+ }
+ synchronized(this) {
+ finished = true;
+ }
if(freeData) {
data.free();
if(persistent) data.removeFrom(container);
@@ -277,4 +294,30 @@
return parent.getPriorityClass();
}
+ public void removeFrom(ObjectContainer container, ClientContext
context) {
+ // parent will remove self
+ if(freeData && data != null && container.ext().isStored(data)) {
+ try {
+ data.free();
+ } catch (Throwable t) {
+ Logger.error(this, "Already freed? Caught in
removeFrom on "+this+" : "+data+" : "+t, t);
+ }
+ data.removeFrom(container);
+ }
+ // ctx is passed in, cb will deal with
+ // cb will remove self
+ // tokenObject will be removed by creator
+ privUSK.removeFrom(container);
+ pubUSK.removeFrom(container);
+ if(fetcher != null) {
+ Logger.error(this, "Fetcher tag still present:
"+fetcher+" in removeFrom() for "+this);
+ fetcher.removeFrom(container, context);
+ }
+ if(sbi != null) {
+ Logger.error(this, "sbi still present: "+sbi+" in
removeFrom() for "+this);
+ sbi.removeFrom(container, context);
+ }
+ container.delete(this);
+ }
+
}
_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs