Author: j16sdiz
Date: 2008-05-09 17:02:34 +0000 (Fri, 09 May 2008)
New Revision: 19881

Modified:
   
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
Store resize tweak


Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-05-09 17:02:14 UTC (rev 19880)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-05-09 17:02:34 UTC (rev 19881)
@@ -28,9 +28,6 @@
 import freenet.support.io.FileUtil;
 import freenet.support.math.RunningAverage;
 import freenet.support.math.SimpleRunningAverage;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;

 /**
  * Index-less data store based on salted hash
@@ -602,7 +599,7 @@
                        }
                }
        }
-       
+
        // ------------- Configuration
        /**
         * Configuration File
@@ -707,13 +704,9 @@
                }

                /**
-                * Maximum memory to be used on resize
-                */
-               private static final int RESIZE_MEMORY = 2 * 1024 * 1024; // 
2MiB
-               /**
                 * Phase 1 Rounds
                 */
-               private static final int RESIZE_PHASE1_ROUND = 12;
+               private static final int RESIZE_PHASE1_ROUND = 8;
                /**
                 * Maximum resize round
                 */
@@ -788,9 +781,17 @@
                        resolvedEntries = 0;
                        droppedEntries = 0;

-                       List oldItems = null;
+                       File oldItemFile = null;
+                       RandomAccessFile oldItemsRAF = null;
+                       FileChannel oldItemsFC = null;
                        if (queueItem) {
-                               oldItems = new ArrayList();
+                               try {
+                                       oldItemFile = new File(baseDir, name + 
".oldItems");
+                                       oldItemsRAF = new 
RandomAccessFile(oldItemFile, "rw");
+                                       oldItemsRAF.seek(oldItemsRAF.length());
+                                       oldItemsFC = oldItemsRAF.getChannel();
+                               } catch (IOException e) {
+                               }
                        }

                        long maxOffset = maxOldItemOffset;
@@ -852,16 +853,18 @@
                                                                
resolvedEntries++;
                                                        } else if (queueItem) {
                                                                // break tie by 
moveing old item to queue
-                                                               if 
(oldItems.size() * entryTotalLength < RESIZE_MEMORY) {
-                                                                       
oldItems.add(newOffsetEntry);
-                                                                       if 
(newOffset > offset) {
-                                                                               
oldEntries++; // newOffset wasn't counted count it
-                                                                       }
+                                                               if (logDEBUG)
+                                                                       
Logger.debug(this, "Write item "
+                                                                               
+ HexUtil.bytesToHex(newOffsetEntry.digestedRoutingKey)
+                                                                               
+ " to old item file");
+                                                               
writeOldItem(oldItemsFC, newOffsetEntry);
+                                                               if (newOffset > 
offset) {
+                                                                       
oldEntries++; // newOffset wasn't counted count it
+                                                               }

-                                                                       
writeEntry(entry);
-                                                                       
freeOffset(offset);
-                                                                       
resolvedEntries++;
-                                                               }
+                                                               
writeEntry(entry);
+                                                               
freeOffset(offset);
+                                                               
resolvedEntries++;
                                                        }
                                                } finally {
                                                        unlockEntry(newOffset);
@@ -875,25 +878,38 @@
                        }

                        if (queueItem) {
-                               putBackOldItems(oldItems);
+                               try {
+                                       oldItemsRAF.seek(0);
+                                       putBackOldItems(oldItemsFC);
+                               } catch (IOException e) {
+                               } finally {
+                                       try {
+                                               oldItemsRAF.close();
+                                               oldItemFile.delete();
+                                       } catch (IOException e2) {
+                                       }
+                               }
                        }
                }

                /**
                 * Put back oldItems with best effort
+                * 
+                * @throws IOException
                 */
-               private void putBackOldItems(List oldItems) {
-                       Iterator it = oldItems.iterator();
-                       while (it.hasNext()) {
-                               boolean done = false;
+               private void putBackOldItems(FileChannel oldItems) throws 
IOException {
+                       while (true) {
+                               Entry entry = readOldItem(oldItems);
+                               if (entry == null)
+                                       break;

-                               Entry entry = (Entry) it.next();
                                entry.setStoreSize(storeSize);

                                long newOffset = entry.getOffset();

                                if (!lockEntry(newOffset)) // lock
                                        continue;
+                               boolean done = false;
                                try {
                                        if (isFree(newOffset)) {
                                                if (logDEBUG)
@@ -908,7 +924,6 @@
                                        Logger.debug(this, "IOExcception on 
putBackOldItems", e);
                                } finally {
                                        unlockEntry(newOffset);
-                                       it.remove();

                                        if (done)
                                                resolvedEntries++;
@@ -916,9 +931,23 @@
                                                droppedEntries++;
                                }
                        }
-                       oldItems.clear();
                }

+               private void writeOldItem(FileChannel fc, Entry e) throws 
IOException {
+                       ByteBuffer bf = e.toByteBuffer();
+                       do {
+                               fc.write(bf);
+                       } while (bf.hasRemaining());
+               }
+
+               private Entry readOldItem(FileChannel fc) throws IOException {
+                       ByteBuffer bf = ByteBuffer.allocate((int) 
entryTotalLength);
+                       do {
+                               fc.read(bf);
+                       } while (bf.hasRemaining());
+                       return new Entry(bf);
+               }
+
                /**
                 * Samples to take on key count estimation
                 */


Reply via email to