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); + }