Browse Source

Add transport version to main response (#96900)

The root endpoint for Elasticsearch contains diagnostic information
about what Elasticsearch is running. This commit adds TransportVersion
to this diagnostic information, alongside the existing version
information.
Ryan Ernst 2 years ago
parent
commit
3d11f42888

+ 3 - 1
docs/reference/setup/install/check-running.asciidoc

@@ -41,7 +41,8 @@ GET /
     "build_snapshot" : false,
     "lucene_version" : "{lucene_version}",
     "minimum_wire_compatibility_version" : "1.2.3",
-    "minimum_index_compatibility_version" : "1.2.3"
+    "minimum_index_compatibility_version" : "1.2.3",
+    "transport_version" : "123456"
   },
   "tagline" : "You Know, for Search"
 }
@@ -54,4 +55,5 @@ GET /
 // TESTRESPONSE[s/"build_snapshot" : false,/"build_snapshot" : $body.version.build_snapshot,/]
 // TESTRESPONSE[s/"minimum_wire_compatibility_version" : "1.2.3"/"minimum_wire_compatibility_version" : $body.version.minimum_wire_compatibility_version/]
 // TESTRESPONSE[s/"minimum_index_compatibility_version" : "1.2.3"/"minimum_index_compatibility_version" : $body.version.minimum_index_compatibility_version/]
+// TESTRESPONSE[s/"transport_version" : "123456"/"transport_version" : $body.version.transport_version/]
 // So much s/// but at least we test that the layout is close to matching....

+ 25 - 2
modules/rest-root/src/main/java/org/elasticsearch/rest/root/MainResponse.java

@@ -9,6 +9,7 @@
 package org.elasticsearch.rest.root;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.Version;
 import org.elasticsearch.action.ActionResponse;
 import org.elasticsearch.cluster.ClusterName;
@@ -27,6 +28,7 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
 
     private String nodeName;
     private Version version;
+    private TransportVersion transportVersion;
     private ClusterName clusterName;
     private String clusterUuid;
     private Build build;
@@ -37,14 +39,23 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
         super(in);
         nodeName = in.readString();
         version = Version.readVersion(in);
+        transportVersion = in.getTransportVersion().onOrAfter(TransportVersion.V_8_500_014) ? TransportVersion.readVersion(in) : null;
         clusterName = new ClusterName(in);
         clusterUuid = in.readString();
         build = Build.readBuild(in);
     }
 
-    public MainResponse(String nodeName, Version version, ClusterName clusterName, String clusterUuid, Build build) {
+    public MainResponse(
+        String nodeName,
+        Version version,
+        TransportVersion transportVersion,
+        ClusterName clusterName,
+        String clusterUuid,
+        Build build
+    ) {
         this.nodeName = nodeName;
         this.version = version;
+        this.transportVersion = transportVersion;
         this.clusterName = clusterName;
         this.clusterUuid = clusterUuid;
         this.build = build;
@@ -58,6 +69,10 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
         return version;
     }
 
+    public TransportVersion getTransportVersion() {
+        return transportVersion;
+    }
+
     public ClusterName getClusterName() {
         return clusterName;
     }
@@ -74,6 +89,9 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
     public void writeTo(StreamOutput out) throws IOException {
         out.writeString(nodeName);
         Version.writeVersion(version, out);
+        if (out.getTransportVersion().onOrAfter(TransportVersion.V_8_500_014)) {
+            TransportVersion.writeVersion(transportVersion, out);
+        }
         clusterName.writeTo(out);
         out.writeString(clusterUuid);
         Build.writeBuild(build, out);
@@ -95,6 +113,7 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
             .field("lucene_version", version.luceneVersion().toString())
             .field("minimum_wire_compatibility_version", version.minimumCompatibilityVersion().toString())
             .field("minimum_index_compatibility_version", version.minimumIndexCompatibilityVersion().toString())
+            .field("transport_version", transportVersion.toString())
             .endObject();
         builder.field("tagline", "You Know, for Search");
         builder.endObject();
@@ -128,6 +147,7 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
             response.version = Version.fromString(
                 ((String) value.get("number")).replace("-SNAPSHOT", "").replaceFirst("-(alpha\\d+|beta\\d+|rc\\d+)", "")
             );
+            response.transportVersion = TransportVersion.fromString(((String) value.get("transport_version")));
         }, (parser, context) -> parser.map(), new ParseField("version"));
     }
 
@@ -146,6 +166,7 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
         MainResponse other = (MainResponse) o;
         return Objects.equals(nodeName, other.nodeName)
             && Objects.equals(version, other.version)
+            && Objects.equals(transportVersion, other.transportVersion)
             && Objects.equals(clusterUuid, other.clusterUuid)
             && Objects.equals(build, other.build)
             && Objects.equals(clusterName, other.clusterName);
@@ -153,7 +174,7 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
 
     @Override
     public int hashCode() {
-        return Objects.hash(nodeName, version, clusterUuid, build, clusterName);
+        return Objects.hash(nodeName, version, transportVersion, clusterUuid, build, clusterName);
     }
 
     @Override
@@ -164,6 +185,8 @@ public class MainResponse extends ActionResponse implements ToXContentObject {
             + '\''
             + ", version="
             + version
+            + ", transportVersion="
+            + transportVersion
             + ", clusterName="
             + clusterName
             + ", clusterUuid='"

+ 9 - 1
modules/rest-root/src/main/java/org/elasticsearch/rest/root/TransportMainAction.java

@@ -9,6 +9,7 @@
 package org.elasticsearch.rest.root;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.Version;
 import org.elasticsearch.action.ActionListener;
 import org.elasticsearch.action.support.ActionFilters;
@@ -42,7 +43,14 @@ public class TransportMainAction extends HandledTransportAction<MainRequest, Mai
     protected void doExecute(Task task, MainRequest request, ActionListener<MainResponse> listener) {
         ClusterState clusterState = clusterService.state();
         listener.onResponse(
-            new MainResponse(nodeName, Version.CURRENT, clusterState.getClusterName(), clusterState.metadata().clusterUUID(), Build.CURRENT)
+            new MainResponse(
+                nodeName,
+                Version.CURRENT,
+                TransportVersion.current(),
+                clusterState.getClusterName(),
+                clusterState.metadata().clusterUUID(),
+                Build.CURRENT
+            )
         );
     }
 }

+ 14 - 6
modules/rest-root/src/test/java/org/elasticsearch/rest/root/MainResponseTests.java

@@ -9,12 +9,14 @@
 package org.elasticsearch.rest.root;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.Version;
 import org.elasticsearch.cluster.ClusterName;
 import org.elasticsearch.common.Strings;
 import org.elasticsearch.common.io.stream.Writeable;
 import org.elasticsearch.common.xcontent.XContentHelper;
 import org.elasticsearch.test.AbstractXContentSerializingTestCase;
+import org.elasticsearch.test.TransportVersionUtils;
 import org.elasticsearch.test.VersionUtils;
 import org.elasticsearch.xcontent.ToXContent;
 import org.elasticsearch.xcontent.XContentBuilder;
@@ -33,8 +35,9 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
         String nodeName = randomAlphaOfLength(10);
         final String date = new Date(randomNonNegativeLong()).toString();
         Version version = VersionUtils.randomIndexCompatibleVersion(random());
+        TransportVersion transportVersion = TransportVersionUtils.randomVersion();
         Build build = new Build(Build.Type.UNKNOWN, randomAlphaOfLength(8), date, randomBoolean(), version.toString());
-        return new MainResponse(nodeName, version, clusterName, clusterUuid, build);
+        return new MainResponse(nodeName, version, transportVersion, clusterName, clusterUuid, build);
     }
 
     @Override
@@ -52,7 +55,8 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
         final Build current = Build.CURRENT;
         Build build = new Build(current.type(), current.hash(), current.date(), current.isSnapshot(), current.qualifiedVersion());
         Version version = Version.CURRENT;
-        MainResponse response = new MainResponse("nodeName", version, new ClusterName("clusterName"), clusterUUID, build);
+        TransportVersion transportVersion = TransportVersion.current();
+        MainResponse response = new MainResponse("nodeName", version, transportVersion, new ClusterName("clusterName"), clusterUUID, build);
         XContentBuilder builder = XContentFactory.jsonBuilder();
         response.toXContent(builder, ToXContent.EMPTY_PARAMS);
         assertEquals(
@@ -72,7 +76,8 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
                                 "build_snapshot": %s,
                                 "lucene_version": "%s",
                                 "minimum_wire_compatibility_version": "%s",
-                                "minimum_index_compatibility_version": "%s"
+                                "minimum_index_compatibility_version": "%s",
+                                "transport_version": "%s"
                             },
                             "tagline": "You Know, for Search"
                         }
@@ -85,7 +90,8 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
                     current.isSnapshot(),
                     version.luceneVersion().toString(),
                     version.minimumCompatibilityVersion().toString(),
-                    version.minimumIndexCompatibilityVersion().toString()
+                    version.minimumIndexCompatibilityVersion().toString(),
+                    transportVersion.toString()
                 )
             ),
             Strings.toString(builder)
@@ -97,9 +103,10 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
         String clusterUuid = mutateInstance.getClusterUuid();
         Build build = mutateInstance.getBuild();
         Version version = mutateInstance.getVersion();
+        TransportVersion transportVersion = mutateInstance.getTransportVersion();
         String nodeName = mutateInstance.getNodeName();
         ClusterName clusterName = mutateInstance.getClusterName();
-        switch (randomIntBetween(0, 4)) {
+        switch (randomIntBetween(0, 5)) {
             case 0 -> clusterUuid = clusterUuid + randomAlphaOfLength(5);
             case 1 -> nodeName = nodeName + randomAlphaOfLength(5);
             case 2 ->
@@ -107,7 +114,8 @@ public class MainResponseTests extends AbstractXContentSerializingTestCase<MainR
                 build = new Build(Build.Type.UNKNOWN, build.hash(), build.date(), build.isSnapshot() == false, build.qualifiedVersion());
             case 3 -> version = randomValueOtherThan(version, () -> VersionUtils.randomVersion(random()));
             case 4 -> clusterName = new ClusterName(clusterName + randomAlphaOfLength(5));
+            case 5 -> transportVersion = randomValueOtherThan(transportVersion, () -> TransportVersionUtils.randomVersion(random()));
         }
-        return new MainResponse(nodeName, version, clusterName, clusterUuid, build);
+        return new MainResponse(nodeName, version, transportVersion, clusterName, clusterUuid, build);
     }
 }

+ 5 - 2
modules/rest-root/src/test/java/org/elasticsearch/rest/root/RestMainActionTests.java

@@ -9,6 +9,7 @@
 package org.elasticsearch.rest.root;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.Version;
 import org.elasticsearch.cluster.ClusterName;
 import org.elasticsearch.common.bytes.BytesReference;
@@ -34,9 +35,10 @@ public class RestMainActionTests extends ESTestCase {
         final ClusterName clusterName = new ClusterName("cluster1");
         final String clusterUUID = randomAlphaOfLengthBetween(10, 20);
         final Version version = Version.CURRENT;
+        final TransportVersion transportVersion = TransportVersion.current();
         final Build build = Build.CURRENT;
 
-        final MainResponse mainResponse = new MainResponse(nodeName, version, clusterName, clusterUUID, build);
+        final MainResponse mainResponse = new MainResponse(nodeName, version, transportVersion, clusterName, clusterUUID, build);
         XContentBuilder builder = JsonXContent.contentBuilder();
         RestRequest restRequest = new FakeRestRequest() {
             @Override
@@ -58,10 +60,11 @@ public class RestMainActionTests extends ESTestCase {
         final ClusterName clusterName = new ClusterName("cluster1");
         final String clusterUUID = randomAlphaOfLengthBetween(10, 20);
         final Version version = Version.CURRENT;
+        final TransportVersion transportVersion = TransportVersion.current();
         final Build build = Build.CURRENT;
         final boolean prettyPrint = randomBoolean();
 
-        final MainResponse mainResponse = new MainResponse(nodeName, version, clusterName, clusterUUID, build);
+        final MainResponse mainResponse = new MainResponse(nodeName, version, transportVersion, clusterName, clusterUUID, build);
         XContentBuilder builder = JsonXContent.contentBuilder();
 
         Map<String, String> params = new HashMap<>();

+ 2 - 1
server/src/main/java/org/elasticsearch/TransportVersion.java

@@ -143,9 +143,10 @@ public record TransportVersion(int id) implements Comparable<TransportVersion> {
     public static final TransportVersion V_8_500_016 = registerTransportVersion(8_500_016, "492C94FB-AAEA-4C9E-8375-BDB67A398584");
     public static final TransportVersion V_8_500_017 = registerTransportVersion(8_500_017, "0EDCB5BA-049C-443C-8AB1-5FA58FB996FB");
     public static final TransportVersion V_8_500_018 = registerTransportVersion(8_500_018, "827C32CE-33D9-4AC3-A773-8FB768F59EAF");
+    public static final TransportVersion V_8_500_019 = registerTransportVersion(8_500_019, "09bae57f-cab8-423c-aab3-c9778509ffe3");
 
     private static class CurrentHolder {
-        private static final TransportVersion CURRENT = findCurrent(V_8_500_018);
+        private static final TransportVersion CURRENT = findCurrent(V_8_500_019);
 
         // finds the pluggable current version, or uses the given fallback
         private static TransportVersion findCurrent(TransportVersion fallback) {

+ 3 - 1
x-pack/plugin/sql/jdbc/src/test/java/org/elasticsearch/xpack/sql/jdbc/WebServerTestCase.java

@@ -8,6 +8,7 @@
 package org.elasticsearch.xpack.sql.jdbc;
 
 import org.elasticsearch.Build;
+import org.elasticsearch.TransportVersion;
 import org.elasticsearch.Version;
 import org.elasticsearch.cluster.ClusterName;
 import org.elasticsearch.rest.root.MainResponse;
@@ -49,7 +50,8 @@ public abstract class WebServerTestCase extends ESTestCase {
         String nodeName = randomAlphaOfLength(10);
         final String date = new Date(randomNonNegativeLong()).toString();
         Build build = new Build(Build.Type.UNKNOWN, randomAlphaOfLength(8), date, randomBoolean(), version.toString());
-        return new MainResponse(nodeName, version, clusterName, clusterUuid, build);
+        TransportVersion transportVersion = TransportVersion.current();
+        return new MainResponse(nodeName, version, transportVersion, clusterName, clusterUuid, build);
     }
 
     String webServerAddress() {