Author: toad
Date: 2009-03-06 22:31:02 +0000 (Fri, 06 Mar 2009)
New Revision: 25909

Modified:
   branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
   branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
Log:
removeFrom() for splitfile inserts. Clear the CHKs when we put them into 
metadata so they don't get removed. Clone cm as needed. Store encode FECJob in 
segment, if it is set wait for the encode callback before removing the segment.


Modified: branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java       
2009-03-06 22:27:39 UTC (rev 25908)
+++ branches/db4o/freenet/src/freenet/client/async/SplitFileInserter.java       
2009-03-06 22:31:02 UTC (rev 25909)
@@ -373,9 +373,11 @@
                                        container.activate(segments[i], 1);
                                ClientCHK[] data = segments[i].getDataCHKs();
                                System.arraycopy(data, 0, dataURIs, dpos, 
data.length);
+                               if(persistent) segments[i].clearDataCHKs();
                                dpos += data.length;
                                ClientCHK[] check = segments[i].getCheckCHKs();
                                System.arraycopy(check, 0, checkURIs, cpos, 
check.length);
+                               if(persistent) segments[i].clearCheckCHKs();
                                cpos += check.length;
                                if(persistent && segments[i] != 
dontDeactivateSegment)
                                        container.deactivate(segments[i], 1);
@@ -395,7 +397,7 @@
                        
                        if(!missingURIs) {
                                // Create Metadata
-                               m = new Metadata(splitfileAlgorithm, dataURIs, 
checkURIs, segmentSize, checkSegmentSize, cm, dataLength, archiveType, 
compressionCodec, decompressedLength, isMetadata);
+                               m = new Metadata(splitfileAlgorithm, dataURIs, 
checkURIs, segmentSize, checkSegmentSize, persistent ? cm.clone() : cm, 
dataLength, archiveType, compressionCodec, decompressedLength, isMetadata);
                        }
                        haveSentMetadata = true;
                }
@@ -583,4 +585,18 @@
                }
        }
 
+       public void removeFrom(ObjectContainer container, ClientContext 
context) {
+               // parent can remove itself
+               // ctx will be removed by parent
+               // cb will remove itself
+               container.activate(cm, 5);
+               cm.removeFrom(container);
+               // token setter can remove token
+               for(SplitFileInserterSegment segment : segments) {
+                       container.activate(segment, 1);
+                       segment.removeFrom(container, context);
+               }
+               container.delete(this);
+       }
+
 }

Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java    
    2009-03-06 22:27:39 UTC (rev 25908)
+++ 
branches/db4o/freenet/src/freenet/client/async/SplitFileInserterSegment.java    
    2009-03-06 22:31:02 UTC (rev 25909)
@@ -97,6 +97,8 @@
        
        private final boolean persistent;
        
+       private FECJob encodeJob;
+       
 
        public SplitFileInserterSegment(SplitFileInserter parent, boolean 
persistent, BaseClientPutter putter,
                        short splitfileAlgo, int checkBlockCount, Bucket[] 
origDataBlocks,
@@ -417,7 +419,7 @@
                                                        for(int 
i=0;i<dataBlocks.length;i++)
                                                                
container.activate(dataBlocks[i], 5);
                                                }
-                                               job = new FECJob(splitfileAlgo, 
context.fecQueue, dataBlocks, checkBlocks, CHKBlock.DATA_LENGTH, 
blockInsertContext.persistentBucketFactory, this, false, 
parent.parent.getPriorityClass(), persistent);
+                                               job = encodeJob = new 
FECJob(splitfileAlgo, context.fecQueue, dataBlocks, checkBlocks, 
CHKBlock.DATA_LENGTH, blockInsertContext.persistentBucketFactory, this, false, 
parent.parent.getPriorityClass(), persistent);
                                        }
                                }                               
                                fin = false;
@@ -522,7 +524,27 @@
                boolean fin;
                synchronized(this) {
                        fin = finished;
+                       encodeJob = null;
                }
+               if(removeOnEncode) {
+                       if(logMINOR) Logger.minor(this, "Removing on encode: 
"+this);
+                       for(int i=0;i<dataBuckets.length;i++) {
+                               if(dataBuckets[i] == null) continue;
+                               dataBuckets[i].free();
+                               if(persistent)
+                                       dataBuckets[i].removeFrom(container);
+                               dataBuckets[i] = null;
+                       }
+                       for(int i=0;i<checkBuckets.length;i++) {
+                               if(checkBuckets[i] == null) continue;
+                               checkBuckets[i].free();
+                               if(persistent)
+                                       checkBuckets[i].removeFrom(container);
+                               checkBuckets[i] = null;
+                       }
+                       removeFrom(container, context);
+                       return;
+               }
                if(fin) {
                        Logger.error(this, "Encoded segment even though segment 
finished! Freeing buckets...");
                        for(int i=0;i<dataBuckets.length;i++) {
@@ -752,6 +774,20 @@
                return dataURIs;
        }
 
+       public void clearCheckCHKs() {
+               for(int i=0;i<checkURIs.length;i++)
+                       checkURIs[i] = null;
+       }
+       
+       public void clearDataCHKs() {
+               for(int i=0;i<dataURIs.length;i++)
+                       dataURIs[i] = null;
+       }
+       
+       /** Get the InsertException for this segment.
+        * NOTE: This will be deleted when the segment is deleted! Do not store 
it or pass 
+        * it on!
+        */
        InsertException getException() {
                synchronized (this) {
                        return toThrow;
@@ -1437,4 +1473,62 @@
                if(persistent) container.deactivate(blocks, 1);
                return ret;
        }
+
+       private boolean removeOnEncode;
+       
+       public void removeFrom(ObjectContainer container, ClientContext 
context) {
+               if(encodeJob != null) {
+                       if(!encodeJob.cancel(container, context)) {
+                               synchronized(this) {
+                                       removeOnEncode = true;
+                                       if(logMINOR) Logger.minor(this, "Will 
remove after encode finished: "+this);
+                                       container.store(this);
+                                       return;
+                               }
+                       }
+                       encodeJob = null;
+               }
+               // parent, putter can deal with themselves
+               for(int i=0;i<dataBlocks.length;i++) {
+                       if(dataBlocks[i] == null) continue;
+                       container.activate(dataBlocks[i], 1);
+                       dataBlocks[i].free();
+                       dataBlocks[i].removeFrom(container);
+                       dataBlocks[i] = null;
+               }
+               for(int i=0;i<checkBlocks.length;i++) {
+                       if(checkBlocks[i] == null) continue;
+                       container.activate(checkBlocks[i], 1);
+                       checkBlocks[i].free();
+                       checkBlocks[i].removeFrom(container);
+                       checkBlocks[i] = null;
+               }
+               for(ClientCHK chk : dataURIs) {
+                       if(chk != null) {
+                               container.activate(chk, 5);
+                               chk.removeFrom(container);
+                       }
+               }
+               for(ClientCHK chk : checkURIs) {
+                       if(chk != null) {
+                               container.activate(chk, 5);
+                               chk.removeFrom(container);
+                       }
+               }
+               container.activate(blocks, 5);
+               for(Integer i : blocks) {
+                       container.activate(i, 1);
+                       container.delete(i);
+               }
+               container.delete(blocks);
+               if(toThrow != null) {
+                       container.activate(toThrow, 5);
+                       toThrow.removeFrom(container);
+               }
+               if(errors != null) {
+                       container.activate(errors, 1);
+                       errors.removeFrom(container);
+               }
+               container.delete(this);
+       }
 }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to