Author: toad
Date: 2008-04-08 20:24:02 +0000 (Tue, 08 Apr 2008)
New Revision: 19094

Modified:
   trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
Always close the cursor even if we throw when overwriting the LRU block.
It is just possible that this will fix the occasionally seen datastore 
deadlocks.

Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-08 
19:23:21 UTC (rev 19093)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2008-04-08 
20:24:02 UTC (rev 19094)
@@ -1530,12 +1530,16 @@
        private void overwriteLRUBlock(byte[] header, byte[] data, Transaction 
t, DatabaseEntry routingkeyDBE, byte[] fullKey) throws DatabaseException, 
IOException {
                // Overwrite an other block
                Cursor c = accessTimeDB.openCursor(t,null);
+               StoreBlock oldStoreBlock;
+               try {
                DatabaseEntry keyDBE = new DatabaseEntry();
                DatabaseEntry dataDBE = new DatabaseEntry();
                c.getFirst(keyDBE,dataDBE,LockMode.RMW);
-               StoreBlock oldStoreBlock = (StoreBlock) 
storeBlockTupleBinding.entryToObject(dataDBE);
+               oldStoreBlock = (StoreBlock) 
storeBlockTupleBinding.entryToObject(dataDBE);
                c.delete();
+               } finally {
                c.close();
+               }
                // Deleted, so we can now reuse it.
                // Because we acquired a write lock, nobody else has taken it.
                StoreBlock storeBlock = new StoreBlock(this, 
oldStoreBlock.getOffset());


Reply via email to