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

Reply via email to