diff options
Diffstat (limited to 'src/main')
-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) {
|