Author: j16sdiz
Date: 2008-06-28 14:14:11 +0000 (Sat, 28 Jun 2008)
New Revision: 20842

Modified:
   
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
fine-grained locks, rebuild bloom filter on resize


Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-06-28 14:07:45 UTC (rev 20841)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-06-28 14:14:11 UTC (rev 20842)
@@ -802,6 +802,9 @@
                        prevStoreSize = raf.readLong();
                        keyCount.set(raf.readLong());
                        generation = raf.readByte();
+                       
+                       if (prevStoreSize != 0)
+                               rebuildBloom = true;

                        raf.close();
                }
@@ -835,7 +838,8 @@

        // ------------- Store resizing
        private long prevStoreSize = 0;
-       private static Object cleanerLock = new Object();
+       private Object cleanerLock = new Object(); // local to this datastore
+       private static Lock cleanerGlobalLock = new ReentrantLock(); // global 
across all datastore
        private Cleaner cleanerThread;

        private class Cleaner extends Thread {
@@ -865,22 +869,30 @@
                                                configLock.readLock().unlock();
                                        }

-                                       if (_prevStoreSize != 0)
-                                               resizeStore(_prevStoreSize);
+                                       if (_prevStoreSize != 0 && 
cleanerGlobalLock.tryLock()) {
+                                               try {
+                                                       
resizeStore(_prevStoreSize);
+                                               } finally {
+                                                       
cleanerGlobalLock.unlock();
+                                               }
+                                       }

-                                       if (_rebuildBloom)
-                                               rebuildBloom();
-                               }
+                                       if (_rebuildBloom && 
cleanerGlobalLock.tryLock()) {
+                                               try {
+                                                       rebuildBloom();
+                                               } finally {
+                                                       
cleanerGlobalLock.unlock();
+                                               }
+                                       }

-                               try {
-                                       writeConfigFile();
-                               } catch (IOException e) {
-                                       Logger.error(this, "Can't write config 
file", e);
-                               }
+                                       try {
+                                               writeConfigFile();
+                                       } catch (IOException e) {
+                                               Logger.error(this, "Can't write 
config file", e);
+                                       }

-                               synchronized (cleanerLock) {
-                                       // FIXME use seprate lock for rebuild / 
write config file
-                                       // cleanerLock.notifyAll();
+                                       cleanerLock.notifyAll();
+
                                        try {
                                                
cleanerLock.wait(CLEANER_PERIOD);
                                        } catch (InterruptedException e) {
@@ -1223,11 +1235,13 @@

                                prevStoreSize = storeSize;
                                storeSize = newStoreSize;
+                               rebuildBloom = true;
                                writeConfigFile();
                        } finally {
                                configLock.writeLock().unlock();
                        }
-                       // don't notify for now, or we will be held here for a 
long time
+
+                       cleanerLock.notify();
                }
        }



Reply via email to