From 7283752c177a5d38776905f0fa115c2405ae2175 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Thu, 26 Aug 2010 00:31:18 +0000 Subject: More robust corruption repairs. --- .../carbonado/repo/indexed/ManagedIndex.java | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) (limited to 'src/main/java/com/amazon/carbonado/repo/indexed') 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 1b6fe8d..2bb2f49 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java @@ -207,7 +207,18 @@ class ManagedIndex implements IndexEntryAccessor { /** Assumes caller is in a transaction */ boolean deleteIndexEntry(S userStorable) throws PersistException { - return makeIndexEntry(userStorable).tryDelete(); + try { + return makeIndexEntry(userStorable).tryDelete(); + } catch (PersistException e) { + Throwable cause = e.getCause(); + if (cause instanceof IllegalArgumentException) { + // Can be caused by a corrupt master record, which is + // attempting do assign an illegal value to the index. There's + // no way to find the old index entry to delete. + return false; + } + throw e; + } } /** Assumes caller is in a transaction */ @@ -219,13 +230,26 @@ class ManagedIndex implements IndexEntryAccessor { boolean updateIndexEntry(S userStorable, S oldUserStorable) throws PersistException { Storable newIndexEntry = makeIndexEntry(userStorable); - if (oldUserStorable != null) { - Storable oldIndexEntry = makeIndexEntry(oldUserStorable); + if (oldUserStorable != null) deleteOldEntry: { + Storable oldIndexEntry; + try { + oldIndexEntry = makeIndexEntry(oldUserStorable); + } catch (PersistException e) { + Throwable cause = e.getCause(); + if (cause instanceof IllegalArgumentException) { + // Can be caused by a corrupt master record, which is + // attempting do assign an illegal value to the index. There's + // no way to find the old index entry to delete. + break deleteOldEntry; + } + throw e; + } + if (oldIndexEntry.equalPrimaryKeys(newIndexEntry)) { - // Index entry didn't change, so nothing to do. If the - // index entry has a version, it will lag behind the - // master's version until the index entry changes, at which - // point the version will again match the master. + // Index entry didn't change, so nothing to do. If the index + // entry has a version, it will lag behind the master's version + // until the index entry changes, at which point the version + // will again match the master. return true; } -- cgit v1.2.3