Skip to content

Commit 25ebdf4

Browse files
authored
Replace IntermittentLongGCDisruption with blocking cluster state updates (#115075) (#115580)
In JDK 23 `Thread.resume` has been removed this means that we cannot use `IntermittentLongGCDisruption` that depends on it. We simulate the master node disruption with a `CyclicBarrier` that blocks cluster state updates. Closes: #115045 The backport will close: #112634 (cherry picked from commit 5dec36e) # Conflicts: # modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/LazyRolloverDuringDisruptionIT.java
1 parent 0a3b617 commit 25ebdf4

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed

modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/LazyRolloverDuringDisruptionIT.java

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@
1717
import org.elasticsearch.action.datastreams.GetDataStreamAction;
1818
import org.elasticsearch.action.index.IndexRequest;
1919
import org.elasticsearch.action.support.master.AcknowledgedResponse;
20+
import org.elasticsearch.cluster.ClusterState;
21+
import org.elasticsearch.cluster.ClusterStateUpdateTask;
2022
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
2123
import org.elasticsearch.cluster.metadata.DataStream;
24+
import org.elasticsearch.cluster.service.ClusterService;
2225
import org.elasticsearch.plugins.Plugin;
2326
import org.elasticsearch.test.ESIntegTestCase;
24-
import org.elasticsearch.test.disruption.IntermittentLongGCDisruption;
25-
import org.elasticsearch.test.disruption.SingleNodeDisruption;
2627
import org.elasticsearch.xcontent.XContentType;
2728

2829
import java.util.Collection;
2930
import java.util.List;
3031
import java.util.concurrent.CountDownLatch;
32+
import java.util.concurrent.CyclicBarrier;
3133
import java.util.concurrent.ExecutionException;
3234

3335
import static org.hamcrest.Matchers.equalTo;
@@ -42,25 +44,38 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
4244
}
4345

4446
public void testRolloverIsExecutedOnce() throws ExecutionException, InterruptedException {
45-
String masterNode = internalCluster().startMasterOnlyNode();
47+
internalCluster().startMasterOnlyNode();
4648
internalCluster().startDataOnlyNodes(3);
4749
ensureStableCluster(4);
4850

4951
String dataStreamName = "my-data-stream";
5052
createDataStream(dataStreamName);
5153

5254
// Mark it to lazy rollover
53-
new RolloverRequestBuilder(client()).setRolloverTarget(dataStreamName).lazy(true).execute().get();
55+
safeGet(new RolloverRequestBuilder(client()).setRolloverTarget(dataStreamName).lazy(true).execute());
5456

5557
// Verify that the data stream is marked for rollover and that it has currently one index
5658
DataStream dataStream = getDataStream(dataStreamName);
5759
assertThat(dataStream.rolloverOnWrite(), equalTo(true));
5860
assertThat(dataStream.getBackingIndices().getIndices().size(), equalTo(1));
5961

6062
// Introduce a disruption to the master node that should delay the rollover execution
61-
SingleNodeDisruption masterNodeDisruption = new IntermittentLongGCDisruption(random(), masterNode, 100, 200, 30000, 60000);
62-
internalCluster().setDisruptionScheme(masterNodeDisruption);
63-
masterNodeDisruption.startDisrupting();
63+
final var barrier = new CyclicBarrier(2);
64+
internalCluster().getCurrentMasterNodeInstance(ClusterService.class)
65+
.submitUnbatchedStateUpdateTask("block", new ClusterStateUpdateTask() {
66+
@Override
67+
public ClusterState execute(ClusterState currentState) {
68+
safeAwait(barrier);
69+
safeAwait(barrier);
70+
return currentState;
71+
}
72+
73+
@Override
74+
public void onFailure(Exception e) {
75+
fail(e);
76+
}
77+
});
78+
safeAwait(barrier);
6479

6580
// Start indexing operations
6681
int docs = randomIntBetween(5, 10);
@@ -83,10 +98,10 @@ public void onFailure(Exception e) {
8398
}
8499

85100
// End the disruption so that all pending tasks will complete
86-
masterNodeDisruption.stopDisrupting();
101+
safeAwait(barrier);
87102

88103
// Wait for all the indexing requests to be processed successfully
89-
countDownLatch.await();
104+
safeAwait(countDownLatch);
90105

91106
// Verify that the rollover has happened once
92107
dataStream = getDataStream(dataStreamName);
@@ -95,8 +110,7 @@ public void onFailure(Exception e) {
95110
}
96111

97112
private DataStream getDataStream(String dataStreamName) {
98-
return client().execute(GetDataStreamAction.INSTANCE, new GetDataStreamAction.Request(new String[] { dataStreamName }))
99-
.actionGet()
113+
return safeGet(client().execute(GetDataStreamAction.INSTANCE, new GetDataStreamAction.Request(new String[] { dataStreamName })))
100114
.getDataStreams()
101115
.get(0)
102116
.getDataStream();
@@ -111,15 +125,15 @@ private void createDataStream(String dataStreamName) throws InterruptedException
111125
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false))
112126
.build()
113127
);
114-
final AcknowledgedResponse putComposableTemplateResponse = client().execute(
115-
TransportPutComposableIndexTemplateAction.TYPE,
116-
putComposableTemplateRequest
117-
).actionGet();
128+
final AcknowledgedResponse putComposableTemplateResponse = safeGet(
129+
client().execute(TransportPutComposableIndexTemplateAction.TYPE, putComposableTemplateRequest)
130+
);
118131
assertThat(putComposableTemplateResponse.isAcknowledged(), is(true));
119132

120133
final CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(dataStreamName);
121-
final AcknowledgedResponse createDataStreamResponse = client().execute(CreateDataStreamAction.INSTANCE, createDataStreamRequest)
122-
.get();
134+
final AcknowledgedResponse createDataStreamResponse = safeGet(
135+
client().execute(CreateDataStreamAction.INSTANCE, createDataStreamRequest)
136+
);
123137
assertThat(createDataStreamResponse.isAcknowledged(), is(true));
124138
}
125139
}

0 commit comments

Comments
 (0)