Skip to content

Commit 01b34a8

Browse files
authored
Fix race condition in IndexServiceTests (#19281)
One test method had a race condition when getting an index after closing. This change extracts the common pattern of polling until the index is available and uses it everywhere. Signed-off-by: Andrew Ross <[email protected]>
1 parent 625b59e commit 01b34a8

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

server/src/test/java/org/opensearch/index/IndexServiceTests.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import java.util.Collections;
6868
import java.util.Map;
6969
import java.util.concurrent.CountDownLatch;
70+
import java.util.concurrent.TimeUnit;
7071
import java.util.concurrent.atomic.AtomicInteger;
7172
import java.util.concurrent.atomic.AtomicReference;
7273
import java.util.stream.Collectors;
@@ -77,7 +78,9 @@
7778
import static org.opensearch.test.hamcrest.OpenSearchAssertions.assertAcked;
7879
import static org.opensearch.test.hamcrest.OpenSearchAssertions.assertHitCount;
7980
import static org.hamcrest.Matchers.containsInAnyOrder;
81+
import static org.hamcrest.Matchers.notNullValue;
8082
import static org.hamcrest.core.IsEqual.equalTo;
83+
import static org.awaitility.Awaitility.await;
8184

8285
/** Unit test(s) for IndexService */
8386
public class IndexServiceTests extends OpenSearchSingleNodeTestCase {
@@ -155,18 +158,15 @@ protected void runInternal() {
155158
// now close the index
156159
final Index index = indexService.index();
157160
assertAcked(client().admin().indices().prepareClose(index.getName()));
158-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
159-
160-
final IndexService closedIndexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
161+
final IndexService closedIndexService = getIndexService(index);
161162
assertNotSame(indexService, closedIndexService);
162163
assertFalse(task.mustReschedule());
163164
assertFalse(task.isClosed());
164165
assertEquals(1000000, task.getInterval().millis());
165166

166167
// now reopen the index
167168
assertAcked(client().admin().indices().prepareOpen(index.getName()));
168-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
169-
indexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
169+
indexService = getIndexService(index);
170170
assertNotSame(closedIndexService, indexService);
171171

172172
task = new IndexService.BaseAsyncTask(indexService, TimeValue.timeValueMillis(100000)) {
@@ -245,9 +245,7 @@ public void testRefreshTaskIsUpdated() throws Exception {
245245
// now close the index
246246
final Index index = indexService.index();
247247
assertAcked(client().admin().indices().prepareClose(index.getName()));
248-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
249-
250-
final IndexService closedIndexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
248+
final IndexService closedIndexService = getIndexService(index);
251249
assertNotSame(indexService, closedIndexService);
252250
assertNotSame(refreshTask, closedIndexService.getRefreshTask());
253251
assertFalse(closedIndexService.getRefreshTask().mustReschedule());
@@ -256,8 +254,7 @@ public void testRefreshTaskIsUpdated() throws Exception {
256254

257255
// now reopen the index
258256
assertAcked(client().admin().indices().prepareOpen(index.getName()));
259-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
260-
indexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
257+
indexService = getIndexService(index);
261258
assertNotSame(closedIndexService, indexService);
262259
refreshTask = indexService.getRefreshTask();
263260
assertTrue(indexService.getRefreshTask().mustReschedule());
@@ -283,9 +280,7 @@ public void testFsyncTaskIsRunning() throws Exception {
283280
// now close the index
284281
final Index index = indexService.index();
285282
assertAcked(client().admin().indices().prepareClose(index.getName()));
286-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
287-
288-
final IndexService closedIndexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
283+
final IndexService closedIndexService = getIndexService(index);
289284
assertNotSame(indexService, closedIndexService);
290285
assertNotSame(fsyncTask, closedIndexService.getFsyncTask());
291286
assertFalse(closedIndexService.getFsyncTask().mustReschedule());
@@ -294,8 +289,7 @@ public void testFsyncTaskIsRunning() throws Exception {
294289

295290
// now reopen the index
296291
assertAcked(client().admin().indices().prepareOpen(index.getName()));
297-
assertBusy(() -> assertTrue("Index not found: " + index.getName(), getInstanceFromNode(IndicesService.class).hasIndex(index)));
298-
indexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(index);
292+
indexService = getIndexService(index);
299293
assertNotSame(closedIndexService, indexService);
300294
fsyncTask = indexService.getFsyncTask();
301295
assertTrue(indexService.getRefreshTask().mustReschedule());
@@ -462,16 +456,14 @@ public void testAsyncTranslogTrimTaskOnClosedIndex() throws Exception {
462456
assertThat(translog.totalOperations(), equalTo(translogOps));
463457
assertThat(translog.stats().estimatedNumberOfOperations(), equalTo(translogOps));
464458
assertAcked(client().admin().indices().prepareClose("test").setWaitForActiveShards(ActiveShardCount.DEFAULT));
465-
466-
indexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(indexService.index());
459+
indexService = getIndexService(indexService.index());
467460
assertTrue(indexService.getTrimTranslogTask().mustReschedule());
468461

469462
final Engine readOnlyEngine = getEngine(indexService.getShard(0));
470463
assertBusy(() -> assertTrue(isTranslogEmpty(readOnlyEngine)));
471464

472465
assertAcked(client().admin().indices().prepareOpen("test").setWaitForActiveShards(ActiveShardCount.DEFAULT));
473-
474-
indexService = getInstanceFromNode(IndicesService.class).indexServiceSafe(indexService.index());
466+
indexService = getIndexService(indexService.index());
475467
translog = IndexShardTestCase.getTranslog(indexService.getShard(0));
476468
assertThat(translog.totalOperations(), equalTo(0));
477469
assertThat(translog.stats().estimatedNumberOfOperations(), equalTo(0));
@@ -886,6 +878,10 @@ public void testRefreshTaskUpdatesWithDynamicShardLevelRefreshes() throws Except
886878

887879
// OS test case fails if test leaves behind transient cluster setting so need to clear it.
888880
client().admin().cluster().prepareUpdateSettings().setTransientSettings(Settings.builder().putNull("*")).get();
881+
}
889882

883+
private IndexService getIndexService(Index index) {
884+
return await().atMost(10, TimeUnit.SECONDS)
885+
.until(() -> getInstanceFromNode(IndicesService.class).indexService(index), notNullValue());
890886
}
891887
}

0 commit comments

Comments
 (0)