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 27a4b396d345d..f1db530875aa9 100644 --- a/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java +++ b/server/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java @@ -136,6 +136,7 @@ import org.elasticsearch.indices.breaker.NoneCircuitBreakerService; import org.elasticsearch.test.IndexSettingsModule; import org.elasticsearch.test.VersionUtils; +import org.elasticsearch.threadpool.ThreadPool; import org.hamcrest.MatcherAssert; import java.io.Closeable; @@ -6137,4 +6138,41 @@ public void afterRefresh(boolean didRefresh) { } } } + + public void testRefreshDoesNotBlockClosing() throws Exception { + final CountDownLatch refreshStarted = new CountDownLatch(1); + final CountDownLatch engineClosed = new CountDownLatch(1); + final ReferenceManager.RefreshListener refreshListener = new ReferenceManager.RefreshListener() { + + @Override + public void beforeRefresh() { + refreshStarted.countDown(); + try { + engineClosed.await(); + } catch (InterruptedException e) { + throw new AssertionError(e); + } + } + + @Override + public void afterRefresh(boolean didRefresh) { + assertFalse(didRefresh); + } + }; + try (Store store = createStore()) { + final EngineConfig config = config(defaultSettings, store, createTempDir(), newMergePolicy(), null, + refreshListener, null, null, engine.config().getCircuitBreakerService()); + try (InternalEngine engine = createEngine(config)) { + if (randomBoolean()) { + engine.index(indexForDoc(createParsedDoc("id", null))); + } + threadPool.executor(ThreadPool.Names.REFRESH).execute(() -> + expectThrows(AlreadyClosedException.class, + () -> engine.refresh("test", randomFrom(Engine.SearcherScope.values()), true))); + refreshStarted.await(); + engine.close(); + engineClosed.countDown(); + } + } + } }