diff --git a/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index da0243be5ca..fd247a6996c 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -1412,7 +1412,7 @@ public class InternalEngine extends Engine { return new DeleteResult( plan.versionOfDeletion, getPrimaryTerm(), delete.seqNo(), plan.currentlyDeleted == false); } catch (Exception ex) { - if (indexWriter.getTragicException() == null) { + if (ex instanceof AlreadyClosedException == false && indexWriter.getTragicException() == null) { throw new AssertionError("delete operation should never fail at document level", ex); } throw ex; @@ -1515,7 +1515,7 @@ public class InternalEngine extends Engine { doc.add(softDeletesField); indexWriter.addDocument(doc); } catch (Exception ex) { - if (indexWriter.getTragicException() == null) { + if (ex instanceof AlreadyClosedException == false && indexWriter.getTragicException() == null) { throw new AssertionError("noop operation should never fail at document level", ex); } throw ex; diff --git a/server/src/test/java/org/elasticsearch/discovery/DiskDisruptionIT.java b/server/src/test/java/org/elasticsearch/discovery/DiskDisruptionIT.java index 4ac9fb5d32e..dac48d89e78 100644 --- a/server/src/test/java/org/elasticsearch/discovery/DiskDisruptionIT.java +++ b/server/src/test/java/org/elasticsearch/discovery/DiskDisruptionIT.java @@ -98,7 +98,6 @@ public class DiskDisruptionIT extends AbstractDisruptionTestCase { * It simulates a full power outage by preventing translog checkpoint files to be written and restart the cluster. This means that * all un-fsynced data will be lost. */ - @AwaitsFix( bugUrl = "https://github.com/elastic/elasticsearch/issues/43626") public void testGlobalCheckpointIsSafe() throws Exception { startCluster(rarely() ? 5 : 3); diff --git a/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java b/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java index 59bbee9f1bb..38ade1ec746 100644 --- a/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java +++ b/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java @@ -5595,6 +5595,37 @@ public class InternalEngineTests extends EngineTestCase { expectThrows(AlreadyClosedException.class, () -> engine.acquireSearcher("test")); } + public void testNoOpOnClosingEngine() throws Exception { + engine.close(); + Settings settings = Settings.builder() + .put(defaultSettings.getSettings()) + .put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true).build(); + IndexSettings indexSettings = IndexSettingsModule.newIndexSettings( + IndexMetaData.builder(defaultSettings.getIndexMetaData()).settings(settings).build()); + assertTrue(indexSettings.isSoftDeleteEnabled()); + try (Store store = createStore(); + InternalEngine engine = createEngine(config(indexSettings, store, createTempDir(), NoMergePolicy.INSTANCE, null))) { + engine.close(); + expectThrows(AlreadyClosedException.class, () -> engine.noOp( + new Engine.NoOp(2, primaryTerm.get(), LOCAL_TRANSLOG_RECOVERY, System.nanoTime(), "reason"))); + } + } + + public void testSoftDeleteOnClosingEngine() throws Exception { + engine.close(); + Settings settings = Settings.builder() + .put(defaultSettings.getSettings()) + .put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true).build(); + IndexSettings indexSettings = IndexSettingsModule.newIndexSettings( + IndexMetaData.builder(defaultSettings.getIndexMetaData()).settings(settings).build()); + assertTrue(indexSettings.isSoftDeleteEnabled()); + try (Store store = createStore(); + InternalEngine engine = createEngine(config(indexSettings, store, createTempDir(), NoMergePolicy.INSTANCE, null))) { + engine.close(); + expectThrows(AlreadyClosedException.class, () -> engine.delete(replicaDeleteForDoc("test", 42, 7, System.nanoTime()))); + } + } + public void testTrackMaxSeqNoOfUpdatesOrDeletesOnPrimary() throws Exception { engine.close(); Set liveDocIds = new HashSet<>();