diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java index 6c977940890..343dbeb5cbb 100644 --- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java +++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java @@ -1097,7 +1097,6 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable, flush(true, true); waitForMerges(); commitInternal(config.getMergePolicy()); - rollbackInternal(); // ie close, since we just committed } catch (Throwable t) { // Be certain to close the index on any exception try { @@ -1107,6 +1106,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit, Accountable, } throw t; } + rollbackInternal(); // if we got that far lets rollback and close } } diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java index ca1782547a0..2594f2f6d9f 100644 --- a/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java +++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java @@ -2023,4 +2023,44 @@ public class TestIndexWriterExceptions extends LuceneTestCase { dir.close(); } + + + public void testOnlyRollbackOnceOnException() throws IOException { + AtomicBoolean once = new AtomicBoolean(false); + InfoStream stream = new InfoStream() { + @Override + public void message(String component, String message) { + if ("TP".equals(component) && "rollback before checkpoint".equals(message)) { + if (once.compareAndSet(false, true)) { + throw new RuntimeException("boom"); + } else { + throw new AssertionError("has been rolled back twice"); + } + + } + } + + @Override + public boolean isEnabled(String component) { + return "TP".equals(component); + } + + @Override + public void close() { + } + }; + try (Directory dir = newDirectory()) { + try (IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig().setInfoStream(stream)){ + @Override + protected boolean isEnableTestPoints() { + return true; + } + }) { + } + } catch (RuntimeException e) { + assertEquals("boom", e.getMessage()); + assertEquals("has suppressed exceptions: " + Arrays.toString(e.getSuppressed()), 0, e.getSuppressed().length); + assertNull(e.getCause()); + } + } }