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

j16sdiz at freenetproject.org j16sdiz at freenetproject.org
Tue Jul 1 09:27:58 UTC 2008


Author: j16sdiz
Date: 2008-07-01 09:27:58 +0000 (Tue, 01 Jul 2008)
New Revision: 20892

Modified:
   branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
prevent http timeout on store resize

Modified: branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java	2008-07-01 09:27:35 UTC (rev 20891)
+++ branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java	2008-07-01 09:27:58 UTC (rev 20892)
@@ -860,7 +860,8 @@
 
 	// ------------- Store resizing
 	private long prevStoreSize = 0;
-	private Object cleanerLock = new Object(); // local to this datastore
+	private Lock cleanerLock = new ReentrantLock(); // local to this datastore
+	private Condition cleanerCondition = cleanerLock.newCondition();
 	private static Lock cleanerGlobalLock = new ReentrantLock(); // global across all datastore
 	private Cleaner cleanerThread;
 
@@ -887,7 +888,8 @@
 		@Override
 		public void run() {
 			while (!shutdown) {
-				synchronized (cleanerLock) {
+				cleanerLock.lock();
+				try {
 					long _prevStoreSize;
 					boolean _rebuildBloom;
 					
@@ -907,7 +909,7 @@
 						}
 					}
 					
-					if (_rebuildBloom && cleanerGlobalLock.tryLock()) {
+					if (_rebuildBloom && prevStoreSize == 0 && cleanerGlobalLock.tryLock()) {
 						try {
 							rebuildBloom();
 						} finally {
@@ -922,13 +924,14 @@
 						Logger.error(this, "Can't force bloom filter", e);
 					}
 					writeConfigFile();
-					cleanerLock.notifyAll();
 
 					try {
-						cleanerLock.wait(CLEANER_PERIOD);
+						cleanerCondition.await(CLEANER_PERIOD, TimeUnit.MILLISECONDS);
 					} catch (InterruptedException e) {
 						Logger.debug(this, "interrupted", e);
 					}
+				} finally {
+					cleanerLock.unlock();
 				}
 			}
 		}
@@ -954,7 +957,7 @@
 			long startOffset = (_prevStoreSize / RESIZE_MEMORY_ENTRIES) * RESIZE_MEMORY_ENTRIES;
 			int i = 0;
 			for (long curOffset = startOffset; curOffset >= 0; curOffset -= RESIZE_MEMORY_ENTRIES) {
-				if (shutdown)
+				if (shutdown || _prevStoreSize != prevStoreSize)
 					return;
 
 				batchProcessEntries(curOffset, RESIZE_MEMORY_ENTRIES, new BatchProcessor() {
@@ -996,7 +999,8 @@
 			
 			configLock.writeLock().lock();
 			try {
-				assert _prevStoreSize == prevStoreSize;
+				if (_prevStoreSize != prevStoreSize)
+					return;
 				prevStoreSize = 0;
 			} finally {
 				configLock.writeLock().unlock();
@@ -1024,7 +1028,7 @@
 
 			int i = 0;
 			for (long curOffset = 0; curOffset < storeSize; curOffset += RESIZE_MEMORY_ENTRIES) {
-				if (shutdown) {
+				if (shutdown || prevStoreSize != 0) {
 					bloomFilter.discard();
 					return;
 				}
@@ -1283,27 +1287,28 @@
 	public void setMaxKeys(long newStoreSize, boolean shrinkNow) throws IOException {
 		Logger.normal(this, "[" + name + "] Resize newStoreSize=" + newStoreSize + ", shinkNow=" + shrinkNow);
 
-		synchronized (cleanerLock) {
-			configLock.writeLock().lock();
-			try {
-				if (newStoreSize == this.storeSize)
-					return;
+		configLock.writeLock().lock();
+		try {
+			if (newStoreSize == this.storeSize)
+				return;
 
-				if (prevStoreSize != 0) {
-					Logger.normal(this, "[" + name + "] resize already in progress, ignore resize request");
-					return;
-				}
-
-				prevStoreSize = storeSize;
-				storeSize = newStoreSize;
-				flags |= FLAG_REBUILD_BLOOM;
-				writeConfigFile();
-			} finally {
-				configLock.writeLock().unlock();
+			if (prevStoreSize != 0) {
+				Logger.normal(this, "[" + name + "] resize already in progress, ignore resize request");
+				return;
 			}
 
-			cleanerLock.notify();
+			prevStoreSize = storeSize;
+			storeSize = newStoreSize;
+			flags |= FLAG_REBUILD_BLOOM;
+			writeConfigFile();
+		} finally {
+			configLock.writeLock().unlock();
 		}
+
+		if (cleanerLock.tryLock()) {
+			cleanerCondition.signal();
+			cleanerLock.unlock();
+		}
 	}
 
 	// ------------- Locking




More information about the cvs mailing list