Author: toad
Date: 2008-07-12 20:15:59 +0000 (Sat, 12 Jul 2008)
New Revision: 21116

Modified:
   branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
   branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
Log:
SingleBlockInserter: Deactivate the callback (e.g. InserterSegment) when we're 
done with it, IF it is safe to do so (e.g. because we just selected a block for 
the scheduler).

Modified: 
branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java     
2008-07-12 17:38:13 UTC (rev 21115)
+++ branches/db4o/freenet/src/freenet/client/async/SingleBlockInserter.java     
2008-07-12 20:15:59 UTC (rev 21116)
@@ -115,7 +115,7 @@
                }
        }

-       protected ClientKeyBlock encode(ObjectContainer container, 
ClientContext context) throws InsertException {
+       protected ClientKeyBlock encode(ObjectContainer container, 
ClientContext context, boolean calledByCB) throws InsertException {
                if(persistent) {
                        container.activate(sourceData, 1);
                        container.activate(cb, 1);
@@ -137,6 +137,8 @@
                        cb.onEncode(block.getClientKey(), this, container, 
context);
                if(shouldSend && persistent)
                        container.set(this);
+               if(persistent && !calledByCB)
+                       container.deactivate(cb, 1);
                return block;
        }

@@ -222,24 +224,28 @@
                cb.onFailure(e, this, container, context);
        }

-       public ClientKeyBlock getBlock(ObjectContainer container, ClientContext 
context) {
+       public ClientKeyBlock getBlock(ObjectContainer container, ClientContext 
context, boolean calledByCB) {
                try {
                        synchronized (this) {
                                if(finished) return null;
                        }
                        if(persistent)
                                container.set(this);
-                       return encode(container, context);                      
        
+                       return encode(container, context, calledByCB);
                } catch (InsertException e) {
                        if(persistent)
                                container.activate(cb, 1);
                        cb.onFailure(e, this, container, context);
+                       if(!calledByCB)
+                               container.deactivate(cb, 1);
                        return null;
                } catch (Throwable t) {
                        if(persistent)
                                container.activate(cb, 1);
                        Logger.error(this, "Caught "+t, t);
                        cb.onFailure(new 
InsertException(InsertException.INTERNAL_ERROR, t, null), this, container, 
context);
+                       if(!calledByCB)
+                               container.deactivate(cb, 1);
                        return null;
                }
        }
@@ -255,7 +261,7 @@
                if(getCHKOnly) {
                        if(persistent)
                                container.activate(cb, 1);
-                       ClientKeyBlock block = encode(container, context);
+                       ClientKeyBlock block = encode(container, context, true);
                        cb.onEncode(block.getClientKey(), this, container, 
context);
                        parent.completedBlock(false, container, context);
                        cb.onSuccess(this, container, context);
@@ -281,7 +287,7 @@
                        if(resultingURI != null)
                                return resultingURI;
                }
-               getBlock(container, context);
+               getBlock(container, context, true);
                synchronized(this) {
                        // FIXME not really necessary? resultingURI is never 
dropped, only set.
                        return resultingURI;
@@ -381,7 +387,7 @@
        /** Attempt to encode the block, if necessary */
        public void tryEncode(ObjectContainer container, ClientContext context) 
{
                try {
-                       encode(container, context);
+                       encode(container, context, false);
                } catch (InsertException e) {
                        fail(e, container, context);
                } catch (Throwable t) {
@@ -409,7 +415,7 @@
        public synchronized Object chooseKey(KeysFetchingLocally ignored, 
ObjectContainer container, ClientContext context) {
                if(finished) return null;
                // Ignore KeysFetchingLocally, it's for requests.
-               return getBlock(container, context);
+               return getBlock(container, context, false);
        }

 }

Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-07-12 17:38:13 UTC (rev 21115)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-07-12 20:15:59 UTC (rev 21116)
@@ -239,7 +239,7 @@
                                mcb.arm(container, context);
                                dataPutter.schedule(container, context);
                                if(metaPutter instanceof SingleBlockInserter)
-                                       
((SingleBlockInserter)metaPutter).encode(container, context);
+                                       
((SingleBlockInserter)metaPutter).encode(container, context, true);
                                metaPutter.schedule(container, context);
                                cb.onBlockSetFinished(this, container, context);
                        }
@@ -328,7 +328,7 @@
                                new SingleBlockInserter(parent, data, 
compressionCodec, uri, ctx, cb, isMetadata, sourceLength, token, 
                                                getCHKOnly, addToParent, false, 
this.token, container, context, persistent);
                        if(encodeCHK)
-                               cb.onEncode(sbi.getBlock(container, 
context).getClientKey(), this, container, context);
+                               cb.onEncode(sbi.getBlock(container, context, 
true).getClientKey(), this, container, context);
                        return sbi;
                }



Reply via email to