Author: j16sdiz
Date: 2008-07-01 08:09:13 +0000 (Tue, 01 Jul 2008)
New Revision: 20887

Modified:
   
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
don't write not-modified entry

Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-07-01 07:36:20 UTC (rev 20886)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-07-01 08:09:13 UTC (rev 20887)
@@ -434,6 +434,9 @@
                        isEncrypted = true;
                }

+               private Entry() {
+        }
+
                public ByteBuffer toByteBuffer() {
                        ByteBuffer out = ByteBuffer.allocate((int) 
entryTotalLength);
                        encrypt();
@@ -863,8 +866,11 @@
        private static Lock cleanerGlobalLock = new ReentrantLock(); // global 
across all datastore
        private Cleaner cleanerThread;

-       private interface BatchProcessor {
+       private final Entry NOT_MODIFIED = new Entry();
+
+       private interface BatchProcessor {      
                // return <code>null</code> to free the entry
+               // return NOT_MODIFIED to keep the old entry
                Entry processs(Entry entry);
        }

@@ -955,7 +961,7 @@
                                batchReadEntries(curOffset, 
RESIZE_MEMORY_ENTRIES, new BatchProcessor() {
                                        public Entry processs(Entry entry) {
                                                if (entry.getStoreSize() == 
storeSize) // new size
-                                                       return entry;
+                                                       return NOT_MODIFIED;

                                                oldEntryList.add(entry);
                                                return null;
@@ -1026,8 +1032,11 @@
                                                if (entry.getGeneration() != 
generation) {
                                                        
bloomFilter.updateFilter(entry.getDigestedRoutingKey());
                                                        
keyCount.incrementAndGet();
+                                                       
+                                                       
entry.setGeneration(generation);
+                                                       return entry;
                                                }
-                                               return entry;
+                                               return NOT_MODIFIED;
                                        }
                                });

@@ -1113,12 +1122,7 @@
                                                                continue; // 
not occupied

                                                        Entry newEntry = 
processor.processs(entry);
-                                                       if (newEntry != null) {
-                                                               // write back
-                                                               
buf.position((int) (j * entryTotalLength));
-                                                               
buf.put(newEntry.toByteBuffer());
-                                                               dirty = true;
-                                                       } else { // free the 
offset
+                                                       if (newEntry == null) 
{// free the offset
                                                                try {
                                                                        
freeOffset(entry.curOffset);
                                                                        
keyCount.decrementAndGet();
@@ -1126,7 +1130,13 @@
                                                                        if 
(!shutdown)
                                                                                
Logger.error(this, "error freeing entry " + entry.curOffset, ioe);
                                                                }
-                                                       }
+                                                       } else if (newEntry == 
NOT_MODIFIED) {
+                                                       } else {
+                                                               // write back
+                                                               
buf.position((int) (j * entryTotalLength));
+                                                               
buf.put(newEntry.toByteBuffer());
+                                                               dirty = true;
+                                                       } 
                                                }
                                        } finally {
                                                // write back.


Reply via email to