From b7ac911eb0747e43e24c49c4540b5b43e568235e Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Sun, 18 Feb 2007 03:19:54 +0000 Subject: Index creation does a better job of picking up where it left off, avoiding unnecessary delete/insert pairs. --- RELEASE-NOTES.txt | 2 ++ .../amazon/carbonado/repo/indexed/ManagedIndex.java | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index ea9ff54..1d9d7ca 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -10,6 +10,8 @@ Carbonado change history - ReplicatedRepository installs user triggers on the replica again, but it now disables all triggers during resync to prevent errors. When triggers were on master, downstream triggers would not see changes made by earlier triggers. +- Index creation does a better job of picking up where it left off, avoiding + unnecessary delete/insert pairs. 1.1-BETA9 to 1.1-BETA10 ------------------------------- diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java b/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java index 274c452..958bd7b 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java @@ -370,9 +370,21 @@ class ManagedIndex implements IndexEntryAccessor { for (Object obj : buffer) { Storable indexEntry = (Storable) obj; if (!indexEntry.tryInsert()) { - // repair - indexEntry.tryDelete(); - indexEntry.tryInsert(); + // Couldn't insert because an index entry already exists. + Storable existing = indexEntry.copy(); + if (existing.tryLoad()) { + if (!existing.equalProperties(indexEntry)) { + // Existing entry differs, so update it. + indexEntry.copyUnequalProperties(existing); + existing.tryUpdate(); + indexEntry = existing; + } + } else { + // Couldn't find existing entry for some reason, so + // repair by brute force. + indexEntry.tryDelete(); + indexEntry.tryInsert(); + } } totalInserted++; if (totalInserted % POPULATE_BATCH_SIZE == 0) { -- cgit v1.2.3