From 5f440f35b7a69a45388275ec2affac54e182cab0 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Mon, 6 Jan 2020 11:56:46 +0000 Subject: [PATCH] Automatically delete corrupt indexes upon detection --- .../search3/FDBDirectorySearchHandlerFactory.java | 8 ++++++++ src/main/java/com/cloudant/search3/Search.java | 5 +++++ .../java/com/cloudant/search3/SearchHandlerFactory.java | 2 ++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/com/cloudant/search3/FDBDirectorySearchHandlerFactory.java b/src/main/java/com/cloudant/search3/FDBDirectorySearchHandlerFactory.java index 37549c7..4c7e2db 100644 --- a/src/main/java/com/cloudant/search3/FDBDirectorySearchHandlerFactory.java +++ b/src/main/java/com/cloudant/search3/FDBDirectorySearchHandlerFactory.java @@ -59,6 +59,14 @@ public SearchHandler open(final Database db, final Subspace index, final Analyze return new FDBDirectorySearchHandler(dir, writer, manager, analyzer); } + @Override + public void delete(final Database db, final Subspace index) { + db.run(txn -> { + txn.clear(index.range()); + return null; + }); + } + /** * The current holder of the lock will know they lost the lock on their next * attempt at a destructive operation and will crash cleanly. diff --git a/src/main/java/com/cloudant/search3/Search.java b/src/main/java/com/cloudant/search3/Search.java index e8c85b5..0663c14 100644 --- a/src/main/java/com/cloudant/search3/Search.java +++ b/src/main/java/com/cloudant/search3/Search.java @@ -29,6 +29,7 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute; +import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.util.BytesRef; @@ -294,6 +295,10 @@ private void execute( try { final SearchHandler handler = getOrOpen(index); f.accept(handler); + } catch (final CorruptIndexException e) { + searchHandlerFactory.delete(db, toSubspace(index)); + failedHandler(index, e); + responseObserver.onError(fromThrowable(e)); } catch (final IOException | AlreadyClosedException e) { failedHandler(index, e); responseObserver.onError(fromThrowable(e)); diff --git a/src/main/java/com/cloudant/search3/SearchHandlerFactory.java b/src/main/java/com/cloudant/search3/SearchHandlerFactory.java index b6da4a7..5bd089c 100644 --- a/src/main/java/com/cloudant/search3/SearchHandlerFactory.java +++ b/src/main/java/com/cloudant/search3/SearchHandlerFactory.java @@ -25,4 +25,6 @@ public interface SearchHandlerFactory { SearchHandler open(final Database db, final Subspace index, final Analyzer analyzer) throws IOException; + void delete(final Database db, final Subspace index); + }