From 78d46cef0dd3d9a5051a4b60b755244b5077859d Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Mon, 8 Sep 2008 21:05:00 +0000 Subject: Index truncation is no longer in transaction with primary records to avoid deadlock. --- .../carbonado/repo/indexed/IndexedStorage.java | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/main/java/com/amazon/carbonado') diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedStorage.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedStorage.java index 1abb064..6b2fed9 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedStorage.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedStorage.java @@ -142,20 +142,20 @@ class IndexedStorage implements Storage, StorageAccess return; } - Transaction txn = mRepository.enterTransaction(); - try { - mMasterStorage.truncate(); - - // Now truncate the indexes. - for (IndexInfo info : mAllIndexInfoMap.values()) { - if (info instanceof ManagedIndex) { - ((ManagedIndex) info).getIndexEntryStorage().truncate(); - } + // Although the master storage and indexes should be truncated + // atomically, this cannot be guaranteed due to freedom of truncate + // implementation. Also, a transaction can be deadlock prone with + // concurrent queries and updates. Instead, truncate the master first, + // which may cause warnings to be logged if index entries refer to + // missing records. This is harmless. + + mMasterStorage.truncate(); + + // Now truncate the indexes. + for (IndexInfo info : mAllIndexInfoMap.values()) { + if (info instanceof ManagedIndex) { + ((ManagedIndex) info).getIndexEntryStorage().truncate(); } - - txn.commit(); - } finally { - txn.exit(); } } -- cgit v1.2.3