diff options
author | Benoit Foucher <benoit@zeroc.com> | 2013-01-29 09:26:34 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2013-01-29 09:26:34 +0100 |
commit | 0c86c3b2013261eb55347317474310831892a8fa (patch) | |
tree | c8b61f87cd4235b02a41c2b76c8939e9ef9f039d /java/src/Freeze/MapInternal/MapI.java | |
parent | Fixed Ice for Python/Ruby/PHP to not copy data from output stream (diff) | |
download | ice-0c86c3b2013261eb55347317474310831892a8fa.tar.bz2 ice-0c86c3b2013261eb55347317474310831892a8fa.tar.xz ice-0c86c3b2013261eb55347317474310831892a8fa.zip |
Fixed ICE-5128: Freeze map clear failure
Diffstat (limited to 'java/src/Freeze/MapInternal/MapI.java')
-rw-r--r-- | java/src/Freeze/MapInternal/MapI.java | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/java/src/Freeze/MapInternal/MapI.java b/java/src/Freeze/MapInternal/MapI.java index 8e1dacf2db5..f46a70bf0b6 100644 --- a/java/src/Freeze/MapInternal/MapI.java +++ b/java/src/Freeze/MapInternal/MapI.java @@ -757,8 +757,8 @@ public abstract class MapI<K, V> extends java.util.AbstractMap<K, V> { if(_trace.deadlockWarning) { - _trace.logger.warning("Deadlock in Freeze.MapInternal.MapI.containsValue while " + "iterating over Db \"" + - _dbName + "\"; retrying..."); + _trace.logger.warning("Deadlock in Freeze.MapInternal.MapI.containsValue while " + + "iterating over Db \"" + _dbName + "\"; retrying..."); } // @@ -898,13 +898,55 @@ public abstract class MapI<K, V> extends java.util.AbstractMap<K, V> } com.sleepycat.db.Transaction txn = _connection.dbTxn(); + if(txn == null) + { + closeAllIterators(); + } + com.sleepycat.db.DatabaseEntry keyEntry = new com.sleepycat.db.DatabaseEntry(); + keyEntry.setPartial(true); + + com.sleepycat.db.DatabaseEntry valueEntry = new com.sleepycat.db.DatabaseEntry(); + valueEntry.setPartial(true); + for(;;) { try { - _db.db().truncate(txn, false); - break; + com.sleepycat.db.Cursor dbc = null; + Transaction tx = null; + try + { + if(txn == null) + { + tx = _connection.beginTransaction(); + txn = _connection.dbTxn(); + } + + dbc = _db.db().openCursor(txn, null); + while(dbc.getNext(keyEntry, valueEntry, null) == com.sleepycat.db.OperationStatus.SUCCESS) + { + dbc.delete(); + } + break; + } + finally + { + try + { + if(dbc != null) + { + dbc.close(); + } + } + finally + { + if(tx != null) + { + tx.commit(); + } + } + } } catch(com.sleepycat.db.DeadlockException e) { |