Author: toad
Date: 2008-08-13 12:10:01 +0000 (Wed, 13 Aug 2008)
New Revision: 21795

Modified:
   
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
Log:
Missing file for last commit: bulk remove of block numbers.
Also paranoia, refactoring, possible NPE fix.


Modified: 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-08-13 12:08:56 UTC (rev 21794)
+++ 
branches/db4o/freenet/src/freenet/client/async/SplitFileFetcherSubSegment.java  
    2008-08-13 12:10:01 UTC (rev 21795)
@@ -2,6 +2,7 @@

 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Vector;

@@ -768,6 +769,18 @@
                return found;
        }

+       public void removeBlockNums(int[] blockNos, ObjectContainer container) {
+               if(persistent)
+                       container.activate(blockNums, 2);
+               boolean store = false;
+               for(int i=0;i<blockNos.length;i++)
+                       store |= removeBlockNum(blockNos[i], container, true);
+               if(persistent) {
+                       if(store) container.set(blockNums);
+                       container.deactivate(blockNums, 2);
+               }
+       }
+
        @Override
        public List<PersistentChosenBlock> makeBlocks(PersistentChosenRequest 
request, RequestScheduler sched, ObjectContainer container, ClientContext 
context) {
                if(persistent) {
@@ -779,16 +792,24 @@
                        blockNumbers = (Integer[]) blockNums.toArray(new 
Integer[blockNums.size()]);
                }
                ArrayList<PersistentChosenBlock> blocks = new 
ArrayList<PersistentChosenBlock>();
+               Arrays.sort(blockNumbers);
+               int prevBlockNumber = -1;
                for(int i=0;i<blockNumbers.length;i++) {
-                       ClientKey key = segment.getBlockKey(blockNumbers[i], 
container);
+                       int blockNumber = blockNumbers[i];
+                       if(blockNumber == prevBlockNumber) {
+                               Logger.error(this, "Duplicate block number in 
makeBlocks() in "+this+": two copies of "+blockNumber);
+                               continue;
+                       }
+                       prevBlockNumber = blockNumber;
+                       ClientKey key = segment.getBlockKey(blockNumber, 
container).cloneKey();
                        if(key == null) {
                                if(logMINOR)
-                                       Logger.minor(this, "Block 
"+blockNumbers[i]+" is null, maybe race condition");
+                                       Logger.minor(this, "Block 
"+blockNumber+" is null, maybe race condition");
                                continue;
                        }
                        Key k = key.getNodeKey();
-                       container.activate(k, 5);
-                       PersistentChosenBlock block = new 
PersistentChosenBlock(false, request, blockNumbers[i], k, key, sched);
+                       PersistentChosenBlock block = new 
PersistentChosenBlock(false, request, blockNumber, k, key, sched);
+                       if(logMINOR) Logger.minor(this, "Created block 
"+block+" for block number "+blockNumber+" on "+this);
                        blocks.add(block);
                }
                blocks.trimToSize();


Reply via email to