Author: j16sdiz
Date: 2008-06-12 13:19:28 +0000 (Thu, 12 Jun 2008)
New Revision: 20275

Modified:
   
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
Log:
fix deadlock


Modified: 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java
===================================================================
--- 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-06-12 04:26:08 UTC (rev 20274)
+++ 
branches/saltedhashstore/freenet/src/freenet/store/SaltedHashFreenetStore.java  
    2008-06-12 13:19:28 UTC (rev 20275)
@@ -822,27 +822,17 @@
                public void run() {
                        while (!shutdown) {
                                synchronized (cleanerLock) {
-                                       boolean resizeFinished = false;
-
+                                       long _prevStoreSize;
+                                       
                                        configLock.readLock().lock();
                                        try {
-                                               if (prevStoreSize != 0)
-                                                       resizeFinished = 
resizeStore();
+                                               _prevStoreSize = prevStoreSize;
                                        } finally {
                                                configLock.readLock().unlock();
                                        }

-                                       if (resizeFinished) {
-                                               configLock.writeLock().lock();
-                                               try {
-                                                       prevStoreSize = 0;
-                                                       writeConfigFile();
-                                               } catch (IOException ioe) {
-                                                       Logger.error(this, 
"can't write store config file", ioe);
-                                               } finally {
-                                                       
configLock.writeLock().unlock();
-                                               }
-                                       }
+                                       if (_prevStoreSize != 0)
+                                               resizeStore(_prevStoreSize);

                                        cleanerLock.notifyAll();
                                        try {
@@ -860,11 +850,11 @@
                /**
                 * Move old entries to new location and resize store
                 */
-               private boolean resizeStore() {
+               private void resizeStore(long _prevStoreSize) {
                        Logger.normal(this, "Starting datastore resize");
                        long startTime = System.currentTimeMillis();

-                       if (storeSize > prevStoreSize)
+                       if (storeSize > _prevStoreSize)
                                setStoreFileSize(storeSize);

                        initOldEntriesFile();
@@ -872,14 +862,14 @@
                        List<Entry> oldEntryList = new LinkedList<Entry>();

                        // start from end of store, make store shrinking 
quicker 
-                       long startOffset = (prevStoreSize / 
RESIZE_MEMORY_ENTRIES) * RESIZE_MEMORY_ENTRIES;
+                       long startOffset = (_prevStoreSize / 
RESIZE_MEMORY_ENTRIES) * RESIZE_MEMORY_ENTRIES;
                        for (long curOffset = startOffset; curOffset >= 0; 
curOffset -= RESIZE_MEMORY_ENTRIES) {
                                if (shutdown)
-                                       return false;
+                                       return;

                                batchReadEntries(curOffset, 
RESIZE_MEMORY_ENTRIES, oldEntryList);

-                               if (storeSize < prevStoreSize)
+                               if (storeSize < _prevStoreSize)
                                        setStoreFileSize(Math.max(storeSize, 
curOffset));

                                // try to resolve the list
@@ -896,8 +886,8 @@
                                        it.remove();
                                }

-                               long processed = prevStoreSize - curOffset;
-                               Logger.normal(this, "Store resize " + callback 
+ ": " + processed + "/" + prevStoreSize);
+                               long processed = _prevStoreSize - curOffset;
+                               Logger.normal(this, "Store resize " + callback 
+ ": " + processed + "/" + _prevStoreSize);
                        }

                        resolveOldEntriesFile();
@@ -905,7 +895,17 @@
                        long endTime = System.currentTimeMillis();
                        Logger.normal(this, "Finish resizing " + callback + " 
in " + (endTime - startTime) / 1000 + "s");

-                       return true;
+                       configLock.writeLock().lock();
+                       try {
+                               assert _prevStoreSize == prevStoreSize;
+                               prevStoreSize = 0;
+                               writeConfigFile();
+                       } catch (IOException e) {
+                               Logger.error(this, "Can't write config file", 
e);
+                               prevStoreSize = _prevStoreSize; // try again ?
+                       } finally {
+                               configLock.writeLock().unlock();
+                       }
                }

                /**


Reply via email to