From 13a8ba4740f1bda86fd06fa6a56afe07f3c3bd3a Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Tue, 20 Feb 2018 09:34:20 +0100 Subject: [PATCH] [TEST] Fix flaky IndexServiceTests#testRefreshActuallyWorks --- .../index/IndexServiceTests.java | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/index/IndexServiceTests.java b/server/src/test/java/org/elasticsearch/index/IndexServiceTests.java index df6aa962f31..bd2170dc1ee 100644 --- a/server/src/test/java/org/elasticsearch/index/IndexServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/IndexServiceTests.java @@ -194,25 +194,46 @@ public class IndexServiceTests extends ESSingleNodeTestCase { IndexService.AsyncRefreshTask refreshTask = indexService.getRefreshTask(); assertEquals(1000, refreshTask.getInterval().millis()); assertTrue(indexService.getRefreshTask().mustReschedule()); - - // now disable - IndexMetaData metaData = IndexMetaData.builder(indexService.getMetaData()).settings(Settings.builder().put(indexService.getMetaData().getSettings()).put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), -1)).build(); - indexService.updateMetaData(metaData); - client().prepareIndex("test", "test", "1").setSource("{\"foo\": \"bar\"}", XContentType.JSON).get(); IndexShard shard = indexService.getShard(0); - try (Engine.Searcher searcher = shard.acquireSearcher("test")) { - TopDocs search = searcher.searcher().search(new MatchAllDocsQuery(), 10); - assertEquals(0, search.totalHits); - } - // refresh every millisecond - metaData = IndexMetaData.builder(indexService.getMetaData()).settings(Settings.builder().put(indexService.getMetaData().getSettings()).put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), "1ms")).build(); + client().prepareIndex("test", "test", "0").setSource("{\"foo\": \"bar\"}", XContentType.JSON).get(); + // now disable the refresh + IndexMetaData metaData = IndexMetaData.builder(indexService.getMetaData()) + .settings(Settings.builder().put(indexService.getMetaData().getSettings()) + .put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), -1)).build(); + // when we update we reschedule the existing task AND fire off an async refresh to make sure we make everything visible + // before that this is why we need to wait for the refresh task to be unscheduled and the first doc to be visible indexService.updateMetaData(metaData); + assertTrue(refreshTask.isClosed()); + refreshTask = indexService.getRefreshTask(); assertBusy(() -> { + // this one either becomes visible due to a concurrently running scheduled refresh OR due to the force refresh + // we are running on updateMetaData if the interval changes try (Engine.Searcher searcher = shard.acquireSearcher("test")) { TopDocs search = searcher.searcher().search(new MatchAllDocsQuery(), 10); assertEquals(1, search.totalHits); - } catch (IOException e) { - fail(e.getMessage()); + } + }); + assertFalse(refreshTask.isClosed()); + // refresh every millisecond + client().prepareIndex("test", "test", "1").setSource("{\"foo\": \"bar\"}", XContentType.JSON).get(); + metaData = IndexMetaData.builder(indexService.getMetaData()) + .settings(Settings.builder().put(indexService.getMetaData().getSettings()) + .put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), "1ms")).build(); + indexService.updateMetaData(metaData); + assertTrue(refreshTask.isClosed()); + assertBusy(() -> { + // this one becomes visible due to the force refresh we are running on updateMetaData if the interval changes + try (Engine.Searcher searcher = shard.acquireSearcher("test")) { + TopDocs search = searcher.searcher().search(new MatchAllDocsQuery(), 10); + assertEquals(2, search.totalHits); + } + }); + client().prepareIndex("test", "test", "2").setSource("{\"foo\": \"bar\"}", XContentType.JSON).get(); + assertBusy(() -> { + // this one becomes visible due to the scheduled refresh + try (Engine.Searcher searcher = shard.acquireSearcher("test")) { + TopDocs search = searcher.searcher().search(new MatchAllDocsQuery(), 10); + assertEquals(3, search.totalHits); } }); }