Fixed an issue where contention on a index key might cause the index to become corrupt. The index now uses the useNoOverwrite method to insert a
new key to prevent the race condition.
Fix for issue 2180
| | |
| | | DatabaseEntry entryIDData = entryID.getDatabaseEntry(); |
| | | DatabaseEntry data = new DatabaseEntry(); |
| | | boolean success = true; |
| | | boolean done = false; |
| | | |
| | | while(!done) |
| | | { |
| | | status = read(txn, key, data, lockMode); |
| | | |
| | | if (status == OperationStatus.SUCCESS) |
| | |
| | | byte[] after = entryIDList.toDatabase(); |
| | | data.setData(after); |
| | | put(txn, key, data); |
| | | done = true; |
| | | } |
| | | else |
| | | { |
| | | if(rebuildRunning || trusted) |
| | | { |
| | | put(txn, key, entryIDData); |
| | | status = insert(txn, key, entryIDData); |
| | | if(status == OperationStatus.SUCCESS) |
| | | { |
| | | done = true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | done = true; |
| | | } |
| | | } |
| | | } |
| | | |