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());