Skip to content

Commit 2ea21c1

Browse files
committed
Optimize index template registry
1 parent ac6c7a9 commit 2ea21c1

File tree

5 files changed

+39
-13
lines changed

5 files changed

+39
-13
lines changed

server/src/main/java/org/elasticsearch/cluster/ClusterChangedEvent.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.cluster.metadata.IndexGraveyard.IndexGraveyardDiff;
1414
import org.elasticsearch.cluster.metadata.IndexMetadata;
1515
import org.elasticsearch.cluster.metadata.Metadata;
16+
import org.elasticsearch.cluster.metadata.ProjectId;
1617
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1718
import org.elasticsearch.cluster.node.DiscoveryNodes;
1819
import org.elasticsearch.cluster.routing.IndexRoutingTable;
@@ -122,6 +123,10 @@ public boolean metadataChanged() {
122123
return state.metadata() != previousState.metadata();
123124
}
124125

126+
public boolean projectChanged(ProjectId projectId) {
127+
return state.metadata().projects().get(projectId) != previousState.metadata().projects().get(projectId);
128+
}
129+
125130
/**
126131
* Returns a set of custom meta data types when any custom metadata for the cluster has changed
127132
* between the previous cluster state and the new cluster state. custom meta data types are

test/framework/src/main/java/org/elasticsearch/action/support/replication/ClusterStateCreationUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,4 +811,11 @@ private static Metadata.Builder addHealthNode(Metadata.Builder metadataBuilder,
811811
tasks.addTask(HealthNode.TASK_NAME, HealthNode.TASK_NAME, HealthNodeTaskParams.INSTANCE, assignment);
812812
return metadataBuilder.putCustom(ClusterPersistentTasksCustomMetadata.TYPE, tasks.build());
813813
}
814+
815+
public static ClusterState stateWithUpdatedProject(ClusterState state, ProjectId projectId) {
816+
if (state.metadata().hasProject(projectId)) {
817+
return ClusterState.builder(state).putProjectMetadata(ProjectMetadata.builder(state.metadata().getProject(projectId))).build();
818+
}
819+
return ClusterState.builder(state).putProjectMetadata(ProjectMetadata.builder(projectId)).build();
820+
}
814821
}

x-pack/plugin/core/src/internalClusterTest/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistryRolloverIT.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313
import org.elasticsearch.action.datastreams.GetDataStreamAction;
1414
import org.elasticsearch.action.index.IndexRequest;
1515
import org.elasticsearch.action.support.master.AcknowledgedResponse;
16+
import org.elasticsearch.action.support.replication.ClusterStateCreationUtils;
1617
import org.elasticsearch.client.internal.Client;
1718
import org.elasticsearch.cluster.ClusterChangedEvent;
1819
import org.elasticsearch.cluster.ClusterState;
1920
import org.elasticsearch.cluster.metadata.DataStream;
21+
import org.elasticsearch.cluster.metadata.Metadata;
2022
import org.elasticsearch.cluster.project.TestProjectResolvers;
2123
import org.elasticsearch.cluster.service.ClusterService;
2224
import org.elasticsearch.datastreams.DataStreamsPlugin;
2325
import org.elasticsearch.index.mapper.DateFieldMapper;
2426
import org.elasticsearch.plugins.Plugin;
27+
import org.elasticsearch.test.ClusterServiceUtils;
2528
import org.elasticsearch.test.ESIntegTestCase;
2629
import org.elasticsearch.xcontent.XContentType;
2730
import org.junit.Before;
@@ -66,9 +69,16 @@ public void setup() {
6669
}
6770

6871
public void testRollover() throws Exception {
69-
ClusterState state = clusterService.state();
70-
registry.clusterChanged(new ClusterChangedEvent(IndexTemplateRegistryRolloverIT.class.getName(), state, state));
71-
assertBusy(() -> { assertTrue(clusterService.state().metadata().getProject().templatesV2().containsKey(TEST_INDEX_TEMPLATE_ID)); });
72+
ClusterState initialState = clusterService.state();
73+
final var projectId = Metadata.DEFAULT_PROJECT_ID;
74+
final var newState = ClusterStateCreationUtils.stateWithUpdatedProject(initialState, projectId);
75+
registry.clusterChanged(new ClusterChangedEvent(IndexTemplateRegistryRolloverIT.class.getName(), newState, initialState));
76+
ClusterServiceUtils.awaitClusterState(
77+
logger,
78+
state -> state.metadata().hasProject(projectId)
79+
&& state.metadata().getProject(projectId).templatesV2().containsKey(TEST_INDEX_TEMPLATE_ID),
80+
clusterService
81+
);
7282
String dsName = TEST_INDEX_PATTERN.replace('*', '1');
7383
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(
7484
TEST_REQUEST_TIMEOUT,
@@ -79,7 +89,7 @@ public void testRollover() throws Exception {
7989
assertTrue(acknowledgedResponse.isAcknowledged());
8090
assertNumberOfBackingIndices(1);
8191
registry.incrementVersion();
82-
registry.clusterChanged(new ClusterChangedEvent(IndexTemplateRegistryRolloverIT.class.getName(), clusterService.state(), state));
92+
registry.clusterChanged(new ClusterChangedEvent(IndexTemplateRegistryRolloverIT.class.getName(), clusterService.state(), newState));
8393
assertBusy(() -> assertTrue(getDataStream().rolloverOnWrite()));
8494
assertNumberOfBackingIndices(1);
8595

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/template/IndexTemplateRegistry.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ public void clusterChanged(ClusterChangedEvent event) {
247247
return;
248248
}
249249
for (ProjectMetadata project : event.state().metadata().projects().values()) {
250+
if (event.projectChanged(project.id()) == false) {
251+
continue;
252+
}
250253
addIngestPipelinesIfMissing(project);
251254
addTemplatesIfMissing(project);
252255
addIndexLifecyclePoliciesIfMissing(project);

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/MlIndexTemplateRegistryTests.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.elasticsearch.action.ActionListener;
1010
import org.elasticsearch.action.admin.indices.template.put.TransportPutComposableIndexTemplateAction;
1111
import org.elasticsearch.action.support.master.AcknowledgedResponse;
12+
import org.elasticsearch.action.support.replication.ClusterStateCreationUtils;
1213
import org.elasticsearch.client.internal.AdminClient;
1314
import org.elasticsearch.client.internal.Client;
1415
import org.elasticsearch.client.internal.IndicesAdminClient;
@@ -17,7 +18,7 @@
1718
import org.elasticsearch.cluster.ClusterName;
1819
import org.elasticsearch.cluster.ClusterState;
1920
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
20-
import org.elasticsearch.cluster.node.DiscoveryNode;
21+
import org.elasticsearch.cluster.metadata.Metadata;
2122
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
2223
import org.elasticsearch.cluster.node.DiscoveryNodes;
2324
import org.elasticsearch.cluster.project.TestProjectResolvers;
@@ -49,9 +50,6 @@
4950

5051
public class MlIndexTemplateRegistryTests extends ESTestCase {
5152

52-
private final DiscoveryNode node = DiscoveryNodeUtils.create("node");
53-
private final DiscoveryNodes nodes = DiscoveryNodes.builder().localNodeId("node").masterNodeId("node").add(node).build();
54-
5553
private NamedXContentRegistry xContentRegistry;
5654
private ClusterService clusterService;
5755
private ThreadPool threadPool;
@@ -96,7 +94,7 @@ public void testStateTemplate() {
9694
TestProjectResolvers.mustExecuteFirst()
9795
);
9896

99-
registry.clusterChanged(createClusterChangedEvent(nodes));
97+
registry.clusterChanged(createClusterChangedEvent());
10098

10199
verify(client, times(4)).execute(
102100
same(TransportPutComposableIndexTemplateAction.TYPE),
@@ -125,7 +123,7 @@ public void testStatsTemplate() {
125123
TestProjectResolvers.mustExecuteFirst()
126124
);
127125

128-
registry.clusterChanged(createClusterChangedEvent(nodes));
126+
registry.clusterChanged(createClusterChangedEvent());
129127

130128
verify(client, times(4)).execute(
131129
same(TransportPutComposableIndexTemplateAction.TYPE),
@@ -152,11 +150,14 @@ private static <Response> Answer<Response> withResponse(Response response) {
152150
};
153151
}
154152

155-
private static ClusterChangedEvent createClusterChangedEvent(DiscoveryNodes nodes) {
153+
private static ClusterChangedEvent createClusterChangedEvent() {
154+
final var initialState = ClusterState.builder(ClusterName.DEFAULT)
155+
.nodes(DiscoveryNodes.builder().localNodeId("node").masterNodeId("node").add(DiscoveryNodeUtils.create("node")).build())
156+
.build();
156157
return new ClusterChangedEvent(
157158
"created-from-test",
158-
ClusterState.builder(new ClusterName("test")).nodes(nodes).build(),
159-
ClusterState.builder(new ClusterName("test")).build()
159+
ClusterStateCreationUtils.stateWithUpdatedProject(initialState, Metadata.DEFAULT_PROJECT_ID),
160+
initialState
160161
);
161162
}
162163
}

0 commit comments

Comments
 (0)