summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian S. O'Neill <bronee@gmail.com>2007-02-18 03:19:54 +0000
committerBrian S. O'Neill <bronee@gmail.com>2007-02-18 03:19:54 +0000
commitb7ac911eb0747e43e24c49c4540b5b43e568235e (patch)
tree567e3595ecfd075c0eda052b0f28899131f21c84 /src
parentc4954dc33c91c3815dda286b765e7164ec2b3eba (diff)
Index creation does a better job of picking up where it left off, avoiding unnecessary delete/insert pairs.
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java18
1 files changed, 15 insertions, 3 deletions
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<S extends Storable> implements IndexEntryAccessor<S> {
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) {