diff options
author | Brian S. O'Neill <bronee@gmail.com> | 2007-02-18 03:19:54 +0000 |
---|---|---|
committer | Brian S. O'Neill <bronee@gmail.com> | 2007-02-18 03:19:54 +0000 |
commit | b7ac911eb0747e43e24c49c4540b5b43e568235e (patch) | |
tree | 567e3595ecfd075c0eda052b0f28899131f21c84 /src | |
parent | c4954dc33c91c3815dda286b765e7164ec2b3eba (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.java | 18 |
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) {
|