[freenet-cvs] r20887 - branches/saltedhashstore/freenet/src/freenet/store

j16sdiz at freenetproject.org j16sdiz at freenetproject.org
Tue Jul 1 08:09:13 UTC 2008


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.




More information about the cvs mailing list