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