Skip to content

Commit d2d1e05

Browse files
authored
[8.16] Backporting full CompatibilityVersions to NodeInfo (#116576)
1 parent 146f2f8 commit d2d1e05

File tree

14 files changed

+78
-31
lines changed

14 files changed

+78
-31
lines changed

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ static TransportVersion def(int id) {
247247
public static final TransportVersion ML_INFERENCE_ATTACH_TO_EXISTSING_DEPLOYMENT = def(8_771_00_0);
248248
public static final TransportVersion CONVERT_FAILURE_STORE_OPTIONS_TO_SELECTOR_OPTIONS_INTERNALLY = def(8_772_00_0);
249249
public static final TransportVersion INFERENCE_DONT_PERSIST_ON_READ_BACKPORT_8_16 = def(8_772_00_1);
250+
public static final TransportVersion ADD_COMPATIBILITY_VERSIONS_TO_NODE_INFO_BACKPORT_8_16 = def(8_772_00_2);
250251

251252
/*
252253
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfo.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
import org.elasticsearch.Version;
1616
import org.elasticsearch.action.support.nodes.BaseNodeResponse;
1717
import org.elasticsearch.cluster.node.DiscoveryNode;
18+
import org.elasticsearch.cluster.version.CompatibilityVersions;
1819
import org.elasticsearch.common.io.stream.StreamInput;
1920
import org.elasticsearch.common.io.stream.StreamOutput;
2021
import org.elasticsearch.common.settings.Settings;
2122
import org.elasticsearch.common.unit.ByteSizeValue;
2223
import org.elasticsearch.core.Nullable;
2324
import org.elasticsearch.http.HttpInfo;
2425
import org.elasticsearch.index.IndexVersion;
26+
import org.elasticsearch.indices.SystemIndexDescriptor;
2527
import org.elasticsearch.ingest.IngestInfo;
2628
import org.elasticsearch.monitor.jvm.JvmInfo;
2729
import org.elasticsearch.monitor.os.OsInfo;
@@ -42,7 +44,7 @@
4244
public class NodeInfo extends BaseNodeResponse {
4345

4446
private final String version;
45-
private final TransportVersion transportVersion;
47+
private final CompatibilityVersions compatibilityVersions;
4648
private final IndexVersion indexVersion;
4749
private final Map<String, Integer> componentVersions;
4850
private final Build build;
@@ -64,15 +66,19 @@ public NodeInfo(StreamInput in) throws IOException {
6466
super(in);
6567
if (in.getTransportVersion().onOrAfter(TransportVersions.V_8_12_0)) {
6668
version = in.readString();
67-
transportVersion = TransportVersion.readVersion(in);
69+
if (in.getTransportVersion().isPatchFrom(TransportVersions.ADD_COMPATIBILITY_VERSIONS_TO_NODE_INFO_BACKPORT_8_16)) {
70+
compatibilityVersions = CompatibilityVersions.readVersion(in);
71+
} else {
72+
compatibilityVersions = new CompatibilityVersions(TransportVersion.readVersion(in), Map.of()); // unknown mappings versions
73+
}
6874
indexVersion = IndexVersion.readVersion(in);
6975
} else {
7076
Version legacyVersion = Version.readVersion(in);
7177
version = legacyVersion.toString();
7278
if (in.getTransportVersion().onOrAfter(TransportVersions.V_8_8_0)) {
73-
transportVersion = TransportVersion.readVersion(in);
79+
compatibilityVersions = new CompatibilityVersions(TransportVersion.readVersion(in), Map.of()); // unknown mappings versions
7480
} else {
75-
transportVersion = TransportVersion.fromId(legacyVersion.id);
81+
compatibilityVersions = new CompatibilityVersions(TransportVersion.fromId(legacyVersion.id), Map.of());
7682
}
7783
if (in.getTransportVersion().onOrAfter(TransportVersions.V_8_11_X)) {
7884
indexVersion = IndexVersion.readVersion(in);
@@ -114,7 +120,7 @@ public NodeInfo(StreamInput in) throws IOException {
114120

115121
public NodeInfo(
116122
String version,
117-
TransportVersion transportVersion,
123+
CompatibilityVersions compatibilityVersions,
118124
IndexVersion indexVersion,
119125
Map<String, Integer> componentVersions,
120126
Build build,
@@ -134,7 +140,7 @@ public NodeInfo(
134140
) {
135141
super(node);
136142
this.version = version;
137-
this.transportVersion = transportVersion;
143+
this.compatibilityVersions = compatibilityVersions;
138144
this.indexVersion = indexVersion;
139145
this.componentVersions = componentVersions;
140146
this.build = build;
@@ -171,7 +177,7 @@ public String getVersion() {
171177
* The most recent transport version that can be used by this node
172178
*/
173179
public TransportVersion getTransportVersion() {
174-
return transportVersion;
180+
return compatibilityVersions.transportVersion();
175181
}
176182

177183
/**
@@ -188,6 +194,13 @@ public Map<String, Integer> getComponentVersions() {
188194
return componentVersions;
189195
}
190196

197+
/**
198+
* A map of system index names to versions for their mappings supported by this node.
199+
*/
200+
public Map<String, SystemIndexDescriptor.MappingsVersion> getCompatibilityVersions() {
201+
return compatibilityVersions.systemIndexMappingsVersion();
202+
}
203+
191204
/**
192205
* The build version of the node.
193206
*/
@@ -240,8 +253,10 @@ public void writeTo(StreamOutput out) throws IOException {
240253
} else {
241254
Version.writeVersion(Version.fromString(version), out);
242255
}
243-
if (out.getTransportVersion().onOrAfter(TransportVersions.V_8_8_0)) {
244-
TransportVersion.writeVersion(transportVersion, out);
256+
if (out.getTransportVersion().isPatchFrom(TransportVersions.ADD_COMPATIBILITY_VERSIONS_TO_NODE_INFO_BACKPORT_8_16)) {
257+
compatibilityVersions.writeTo(out);
258+
} else if (out.getTransportVersion().onOrAfter(TransportVersions.V_8_8_0)) {
259+
TransportVersion.writeVersion(compatibilityVersions.transportVersion(), out);
245260
}
246261
if (out.getTransportVersion().onOrAfter(TransportVersions.V_8_11_X)) {
247262
IndexVersion.writeVersion(indexVersion, out);

server/src/main/java/org/elasticsearch/node/NodeConstruction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,8 @@ private void construct(
10771077
searchTransportService,
10781078
indexingLimits,
10791079
searchModule.getValuesSourceRegistry().getUsageService(),
1080-
repositoriesService
1080+
repositoriesService,
1081+
compatibilityVersions
10811082
);
10821083

10831084
final TimeValue metricsInterval = settings.getAsTime("telemetry.agent.metrics_interval", TimeValue.timeValueSeconds(10));

server/src/main/java/org/elasticsearch/node/NodeService.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
package org.elasticsearch.node;
1111

1212
import org.elasticsearch.Build;
13-
import org.elasticsearch.TransportVersion;
1413
import org.elasticsearch.Version;
1514
import org.elasticsearch.action.admin.cluster.node.info.ComponentVersionNumber;
1615
import org.elasticsearch.action.admin.cluster.node.info.NodeInfo;
@@ -19,6 +18,7 @@
1918
import org.elasticsearch.action.search.SearchTransportService;
2019
import org.elasticsearch.cluster.coordination.Coordinator;
2120
import org.elasticsearch.cluster.service.ClusterService;
21+
import org.elasticsearch.cluster.version.CompatibilityVersions;
2222
import org.elasticsearch.common.settings.Settings;
2323
import org.elasticsearch.common.settings.SettingsFilter;
2424
import org.elasticsearch.common.unit.ByteSizeValue;
@@ -65,6 +65,7 @@ public class NodeService implements Closeable {
6565
private final Coordinator coordinator;
6666
private final RepositoriesService repositoriesService;
6767
private final Map<String, Integer> componentVersions;
68+
private final CompatibilityVersions compatibilityVersions;
6869

6970
NodeService(
7071
Settings settings,
@@ -84,7 +85,8 @@ public class NodeService implements Closeable {
8485
SearchTransportService searchTransportService,
8586
IndexingPressure indexingPressure,
8687
AggregationUsageService aggregationUsageService,
87-
RepositoriesService repositoriesService
88+
RepositoriesService repositoriesService,
89+
CompatibilityVersions compatibilityVersions
8890
) {
8991
this.settings = settings;
9092
this.threadPool = threadPool;
@@ -104,6 +106,7 @@ public class NodeService implements Closeable {
104106
this.aggregationUsageService = aggregationUsageService;
105107
this.repositoriesService = repositoriesService;
106108
this.componentVersions = findComponentVersions(pluginService);
109+
this.compatibilityVersions = compatibilityVersions;
107110
clusterService.addStateApplier(ingestService);
108111
}
109112

@@ -124,7 +127,7 @@ public NodeInfo info(
124127
return new NodeInfo(
125128
// TODO: revert to Build.current().version() when Kibana is updated
126129
Version.CURRENT.toString(),
127-
TransportVersion.current(),
130+
compatibilityVersions,
128131
IndexVersion.current(),
129132
componentVersions,
130133
Build.current(),

server/src/test/java/org/elasticsearch/action/admin/cluster/node/info/NodeInfoTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.Build;
1313
import org.elasticsearch.TransportVersion;
1414
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
15+
import org.elasticsearch.cluster.version.CompatibilityVersions;
1516
import org.elasticsearch.index.IndexVersion;
1617
import org.elasticsearch.index.IndexVersions;
1718
import org.elasticsearch.monitor.jvm.JvmInfo;
@@ -40,7 +41,7 @@ public class NodeInfoTests extends ESTestCase {
4041
public void testGetInfo() {
4142
NodeInfo nodeInfo = new NodeInfo(
4243
Build.current().version(),
43-
TransportVersion.current(),
44+
new CompatibilityVersions(TransportVersion.current(), Map.of()),
4445
IndexVersion.current(),
4546
Map.of(),
4647
Build.current(),

server/src/test/java/org/elasticsearch/action/admin/cluster/remote/RemoteClusterNodesActionTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.cluster.ClusterName;
2727
import org.elasticsearch.cluster.node.DiscoveryNode;
2828
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
29+
import org.elasticsearch.cluster.version.CompatibilityVersions;
2930
import org.elasticsearch.common.settings.Settings;
3031
import org.elasticsearch.common.transport.BoundTransportAddress;
3132
import org.elasticsearch.common.transport.TransportAddress;
@@ -78,7 +79,7 @@ public void testDoExecuteForRemoteServerNodes() {
7879
nodeInfos.add(
7980
new NodeInfo(
8081
Build.current().version(),
81-
TransportVersion.current(),
82+
new CompatibilityVersions(TransportVersion.current(), Map.of()),
8283
IndexVersion.current(),
8384
Map.of(),
8485
null,
@@ -156,7 +157,7 @@ public void testDoExecuteForRemoteNodes() {
156157
nodeInfos.add(
157158
new NodeInfo(
158159
Build.current().version(),
159-
TransportVersion.current(),
160+
new CompatibilityVersions(TransportVersion.current(), Map.of()),
160161
IndexVersion.current(),
161162
Map.of(),
162163
null,

server/src/test/java/org/elasticsearch/action/admin/cluster/stats/ClusterStatsNodesTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.elasticsearch.action.admin.cluster.node.stats.NodeStats;
1616
import org.elasticsearch.action.admin.cluster.node.stats.NodeStatsTests;
1717
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
18+
import org.elasticsearch.cluster.version.CompatibilityVersions;
1819
import org.elasticsearch.common.network.InetAddresses;
1920
import org.elasticsearch.common.network.NetworkModule;
2021
import org.elasticsearch.common.settings.Settings;
@@ -327,7 +328,7 @@ private static NodeInfo createNodeInfo(String nodeId, String transportType, Stri
327328
}
328329
return new NodeInfo(
329330
Build.current().version(),
330-
TransportVersion.current(),
331+
new CompatibilityVersions(TransportVersion.current(), Map.of()),
331332
IndexVersion.current(),
332333
Map.of(),
333334
Build.current(),

server/src/test/java/org/elasticsearch/action/ingest/ReservedPipelineActionTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.elasticsearch.cluster.node.DiscoveryNode;
2121
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
2222
import org.elasticsearch.cluster.service.ClusterService;
23+
import org.elasticsearch.cluster.version.CompatibilityVersions;
2324
import org.elasticsearch.common.settings.ClusterSettings;
2425
import org.elasticsearch.common.settings.Settings;
2526
import org.elasticsearch.common.util.concurrent.EsExecutors;
@@ -105,7 +106,7 @@ public void setup() {
105106

106107
NodeInfo nodeInfo = new NodeInfo(
107108
Build.current().version(),
108-
TransportVersion.current(),
109+
new CompatibilityVersions(TransportVersion.current(), Map.of()),
109110
IndexVersion.current(),
110111
Map.of(),
111112
Build.current(),

server/src/test/java/org/elasticsearch/cluster/service/TransportVersionsFixupListenerTests.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,22 @@
2727
import org.elasticsearch.common.transport.TransportAddress;
2828
import org.elasticsearch.common.util.Maps;
2929
import org.elasticsearch.features.FeatureService;
30+
import org.elasticsearch.indices.SystemIndexDescriptor;
3031
import org.elasticsearch.test.ESTestCase;
3132
import org.elasticsearch.threadpool.Scheduler;
3233
import org.mockito.ArgumentCaptor;
3334

3435
import java.util.HashMap;
3536
import java.util.List;
3637
import java.util.Map;
38+
import java.util.Set;
3739
import java.util.concurrent.Executor;
3840

41+
import static java.util.Map.entry;
3942
import static org.elasticsearch.test.LambdaMatchers.transformedMatch;
4043
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
4144
import static org.hamcrest.Matchers.equalTo;
45+
import static org.hamcrest.Matchers.everyItem;
4246
import static org.mockito.ArgumentMatchers.any;
4347
import static org.mockito.ArgumentMatchers.anyString;
4448
import static org.mockito.ArgumentMatchers.same;
@@ -77,7 +81,7 @@ private static <T> Map<String, T> versions(T... versions) {
7781
return tvs;
7882
}
7983

80-
private static NodesInfoResponse getResponse(Map<String, TransportVersion> responseData) {
84+
private static NodesInfoResponse getResponse(Map<String, CompatibilityVersions> responseData) {
8185
return new NodesInfoResponse(
8286
ClusterName.DEFAULT,
8387
responseData.entrySet()
@@ -207,10 +211,19 @@ public void testVersionsAreFixed() {
207211
argThat(transformedMatch(NodesInfoRequest::nodesIds, arrayContainingInAnyOrder("node1", "node2"))),
208212
action.capture()
209213
);
210-
action.getValue().onResponse(getResponse(Map.of("node1", NEXT_TRANSPORT_VERSION, "node2", NEXT_TRANSPORT_VERSION)));
214+
action.getValue()
215+
.onResponse(
216+
getResponse(
217+
Map.ofEntries(
218+
entry("node1", new CompatibilityVersions(NEXT_TRANSPORT_VERSION, Map.of())),
219+
entry("node2", new CompatibilityVersions(NEXT_TRANSPORT_VERSION, Map.of()))
220+
)
221+
)
222+
);
211223
verify(taskQueue).submitTask(anyString(), task.capture(), any());
212224

213-
assertThat(task.getValue().results(), equalTo(Map.of("node1", NEXT_TRANSPORT_VERSION, "node2", NEXT_TRANSPORT_VERSION)));
225+
assertThat(task.getValue().results().keySet(), equalTo(Set.of("node1", "node2")));
226+
assertThat(task.getValue().results().values(), everyItem(equalTo(NEXT_TRANSPORT_VERSION)));
214227
}
215228

216229
public void testConcurrentChangesDoNotOverlap() {
@@ -259,12 +272,17 @@ public void testFailedRequestsAreRetried() {
259272
Scheduler scheduler = mock(Scheduler.class);
260273
Executor executor = mock(Executor.class);
261274

275+
var compatibilityVersions = new CompatibilityVersions(
276+
TransportVersion.current(),
277+
Map.of(".system-index-1", new SystemIndexDescriptor.MappingsVersion(1, 1234))
278+
);
262279
ClusterState testState1 = ClusterState.builder(ClusterState.EMPTY_STATE)
263-
.nodes(node(NEXT_VERSION, NEXT_VERSION, NEXT_VERSION))
280+
.nodes(node(Version.CURRENT, Version.CURRENT, Version.CURRENT))
264281
.nodeIdsToCompatibilityVersions(
265-
Maps.transformValues(
266-
versions(NEXT_TRANSPORT_VERSION, TransportVersions.V_8_8_0, TransportVersions.V_8_8_0),
267-
transportVersion -> new CompatibilityVersions(transportVersion, Map.of())
282+
Map.ofEntries(
283+
entry("node0", compatibilityVersions),
284+
entry("node1", new CompatibilityVersions(TransportVersions.V_8_8_0, Map.of())),
285+
entry("node2", new CompatibilityVersions(TransportVersions.V_8_8_0, Map.of()))
268286
)
269287
)
270288
.build();

server/src/test/java/org/elasticsearch/nodesinfo/NodeInfoStreamingTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.action.admin.cluster.node.info.PluginsAndModules;
1515
import org.elasticsearch.cluster.node.DiscoveryNode;
1616
import org.elasticsearch.cluster.node.DiscoveryNodeUtils;
17+
import org.elasticsearch.cluster.version.CompatibilityVersions;
1718
import org.elasticsearch.common.Strings;
1819
import org.elasticsearch.common.io.stream.BytesStreamOutput;
1920
import org.elasticsearch.common.io.stream.StreamInput;
@@ -241,7 +242,7 @@ private static NodeInfo createNodeInfo() {
241242
}
242243
return new NodeInfo(
243244
randomAlphaOfLengthBetween(6, 32),
244-
TransportVersionUtils.randomVersion(random()),
245+
new CompatibilityVersions(TransportVersionUtils.randomVersion(random()), Map.of()),
245246
IndexVersionUtils.randomVersion(random()),
246247
componentVersions,
247248
build,

0 commit comments

Comments
 (0)