From 340136cddb494f6e3a24690aa80213d2465dbebb Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 17 Jul 2025 15:17:34 -0700 Subject: [PATCH 01/25] add primary patch version to transport version --- .../org/elasticsearch/TransportVersion.java | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index f1e20ac4bb77e..2af58e4f17ac3 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -57,7 +57,27 @@ * different version value. If you need to know whether the cluster as a whole speaks a new enough {@link TransportVersion} to understand a * newly-added feature, use {@link org.elasticsearch.cluster.ClusterState#getMinTransportVersion}. */ -public record TransportVersion(int id) implements VersionId { +public class TransportVersion implements VersionId { + + private final int id; + private final TransportVersion patchVersion; + + public TransportVersion(int id) { + this(id, null); + } + + public TransportVersion(int id, TransportVersion patchVersion) { + this.id = id; + this.patchVersion = patchVersion; + } + + public int id() { + return id; + } + + public TransportVersion patchVersion() { + return patchVersion; + } public static TransportVersion readVersion(StreamInput in) throws IOException { return fromId(in.readVInt()); @@ -75,7 +95,7 @@ public static TransportVersion fromId(int id) { return known; } // this is a version we don't otherwise know about - just create a placeholder - return new TransportVersion(id); + return new TransportVersion(id, null); } public static void writeVersion(TransportVersion version, StreamOutput out) throws IOException { @@ -171,6 +191,20 @@ public boolean isPatchFrom(TransportVersion version) { return onOrAfter(version) && id < version.id + 100 - (version.id % 100); } + public boolean supports(TransportVersion version) { + if (onOrAfter(version)) { + return true; + } + TransportVersion patchVersion = this.patchVersion; + while (patchVersion != null) { + if (isPatchFrom(version)) { + return true; + } + patchVersion = patchVersion.patchVersion; + } + return false; + } + /** * Returns a string representing the Elasticsearch release version of this transport version, * if applicable for this deployment, otherwise the raw version number. From 46cf098143fd1a0938e7b013bbda3f5abc0f056b Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 17 Jul 2025 15:40:49 -0700 Subject: [PATCH 02/25] add loading for new transport version model --- .../org/elasticsearch/TransportVersion.java | 172 +++++++++++++++++- .../org/elasticsearch/TransportVersions.java | 13 -- 2 files changed, 166 insertions(+), 19 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 2af58e4f17ac3..83d7fe5aaacf7 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -14,14 +14,23 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.internal.VersionExtension; import org.elasticsearch.plugins.ExtensionLoader; +import org.elasticsearch.xcontent.ConstructingObjectParser; +import org.elasticsearch.xcontent.ParseField; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.function.Function; +import java.util.function.IntFunction; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -79,6 +88,32 @@ public TransportVersion patchVersion() { return patchVersion; } + private static final ParseField NAME = new ParseField("name"); + private static final ParseField IDS = new ParseField("ids"); + + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>( + TransportVersion.class.getCanonicalName(), + false, + (args, latestTransportId) -> { + @SuppressWarnings("unchecked") + List ids = (List) args[1]; + ids.sort(Integer::compareTo); + TransportVersion transportVersion = null; + for (int idIndex = 0; idIndex < ids.size(); ++idIndex) { + if (ids.get(idIndex) > latestTransportId) { + break; + } + transportVersion = new TransportVersion(ids.get(idIndex), transportVersion); + } + return transportVersion; + } + ); + + static { + PARSER.declareString(ConstructingObjectParser.constructorArg(), NAME); + PARSER.declareIntArray(ConstructingObjectParser.constructorArg(), IDS); + } + public static TransportVersion readVersion(StreamInput in) throws IOException { return fromId(in.readVInt()); } @@ -90,7 +125,7 @@ public static TransportVersion readVersion(StreamInput in) throws IOException { * The new instance is not registered in {@code TransportVersion.getAllVersions}. */ public static TransportVersion fromId(int id) { - TransportVersion known = VersionsHolder.ALL_VERSIONS_MAP.get(id); + TransportVersion known = VersionsHolder.ALL_VERSIONS_BY_ID.get(id); if (known != null) { return known; } @@ -143,7 +178,7 @@ public static List getAllVersions() { * in the wild (they're sent over the wire by numeric ID) but we don't know how to communicate using such versions. */ public boolean isKnown() { - return VersionsHolder.ALL_VERSIONS_MAP.containsKey(id); + return VersionsHolder.ALL_VERSIONS_BY_ID.containsKey(id); } /** @@ -155,7 +190,7 @@ public TransportVersion bestKnownVersion() { return this; } TransportVersion bestSoFar = TransportVersions.ZERO; - for (final var knownVersion : VersionsHolder.ALL_VERSIONS_MAP.values()) { + for (final var knownVersion : VersionsHolder.ALL_VERSIONS_BY_ID.values()) { if (knownVersion.after(bestSoFar) && knownVersion.before(this)) { bestSoFar = knownVersion; } @@ -210,7 +245,7 @@ public boolean supports(TransportVersion version) { * if applicable for this deployment, otherwise the raw version number. */ public String toReleaseVersion() { - return TransportVersions.VERSION_LOOKUP.apply(id); + return VersionsHolder.VERSION_LOOKUP_BY_RELEASE.apply(id); } @Override @@ -219,8 +254,97 @@ public String toString() { } private static class VersionsHolder { + + /*public class TransportVersionSet { + + + + private static final Map TRANSPORT_VERSION_SETS = loadTransportVersionSets(); + public static final List TRANSPORT_VERSIONS = collectTransportVersions(); + + + + private static List collectTransportVersions() { + List transportVersions = new ArrayList<>(); + for (TransportVersionSet transportVersionSet : TRANSPORT_VERSION_SETS.values()) { + transportVersions.addAll(transportVersionSet.versions); + } + transportVersions.sort(TransportVersion::compareTo); + return transportVersions; + } + + private static TransportVersionSet fromXContent(InputStream inputStream, int maxTransportId) throws IOException { + XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream); + return PARSER.parse(parser, maxTransportId); + } + + public static TransportVersionSet get(String name) { + TransportVersionSet transportVersionSet = TRANSPORT_VERSION_SETS.get(name); + if (transportVersionSet == null) { + // TODO: throw + } + return transportVersionSet; + } + + public static TransportVersion local(String name) { + return get(name).local(); + } + + public static TransportVersion oldest(String name) { + return get(name).oldest(); + } + + public static boolean isCompatible(String name, TransportVersion version) { + return get(name).isCompatible(version); + } + + private final String name; + private final List versions; + + private TransportVersionSet(String name, List versions) { + this.name = name; + this.versions = versions; + } + + public String name() { + return name; + } + + public TransportVersion local() { + return versions.get(0); + } + + public TransportVersion oldest() { + return versions.get(versions.size() - 1); + } + + public boolean isCompatible(TransportVersion version) { + boolean compatible = version.onOrAfter(local()); + for (int v = 1; v < versions.size(); ++v) { + compatible |= version.isPatchFrom(versions.get(v)); + } + return compatible; + } + + public boolean isNotCompatible(TransportVersion version) { + boolean compatible = version.before(local()); + for (int v = 1; v < versions.size(); ++v) { + compatible &= version.isPatchFrom(versions.get(v)) == false; + } + return compatible; + } + + @Override + public String toString() { + return "TransportVersionSet{" + "name='" + name + '\'' + ", versions=" + versions + '}'; + } + }*/ + + private static final List ALL_VERSIONS; - private static final Map ALL_VERSIONS_MAP; + private static final Map ALL_VERSIONS_BY_ID; + private static final Map ALL_VERSIONS_BY_NAME; + private static final IntFunction VERSION_LOOKUP_BY_RELEASE; private static final TransportVersion CURRENT; static { @@ -234,9 +358,45 @@ private static class VersionsHolder { ALL_VERSIONS = Stream.concat(TransportVersions.DEFINED_VERSIONS.stream(), extendedVersions.stream()).sorted().toList(); } - ALL_VERSIONS_MAP = ALL_VERSIONS.stream().collect(Collectors.toUnmodifiableMap(TransportVersion::id, Function.identity())); + ALL_VERSIONS_BY_ID = ALL_VERSIONS.stream().collect(Collectors.toUnmodifiableMap(TransportVersion::id, Function.identity())); CURRENT = ALL_VERSIONS.getLast(); + ReleaseVersions.generateVersionsLookup(TransportVersions.class, LATEST_DEFINED.id()); + } + + private static Map loadTransportVersions() { + Map transportVersions = new HashMap<>(); + + String latestLocation = "transport/" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; + int latestId; + try (InputStream inputStream = TransportVersionSet.class.getResourceAsStream(latestLocation)) { + TransportVersionSet latest = fromXContent(inputStream, Integer.MAX_VALUE); + // TODO: validation of latest tranport version set + latestId = latest.versions.get(0).id(); + } catch (IOException ioe) { + throw new UncheckedIOException("latest transport version file not found at [" + latestLocation + "]", ioe); + } + + String manifestLocation = "META-INF/transport-versions-files-manifest.txt"; + List versionNames; + try (InputStream transportVersionManifest = TransportVersionSet.class.getClassLoader().getResourceAsStream(manifestLocation)) { + BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionManifest, StandardCharsets.UTF_8)); + versionNames = reader.lines().filter(line -> line.isBlank() == false).toList(); + } catch (IOException ioe) { + throw new UncheckedIOException("transport version metadata manifest file not found at [" + manifestLocation + "]", ioe); + } + + for (String name : versionNames) { + String versionLocation = "transport/" + name; + try (InputStream inputStream = TransportVersionSet.class.getResourceAsStream(versionLocation)) { + TransportVersionSet transportVersionSet = TransportVersionSet.fromXContent(inputStream, latestId); + transportVersionSets.put(transportVersionSet.name, transportVersionSet); + } catch (IOException ioe) { + throw new UncheckedIOException("transport version set file not found at [ " + versionLocation + "]", ioe); + } + } + + return Collections.unmodifiableMap(transportVersionSets); } } } diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 11a0103cd22e0..ab60480d62488 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -19,7 +19,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; -import java.util.function.IntFunction; /** *

Transport version is used to coordinate compatible wire protocol communication between nodes, at a fine-grained level. This replaces @@ -415,16 +414,6 @@ static TransportVersion def(int id) { */ static final List DEFINED_VERSIONS = collectAllVersionIdsDefinedInClass(TransportVersions.class); - // the highest transport version constant defined - static final TransportVersion LATEST_DEFINED; - static { - LATEST_DEFINED = DEFINED_VERSIONS.getLast(); - - // see comment on IDS field - // now we're registered all the transport versions, we can clear the map - IDS = null; - } - public static List collectAllVersionIdsDefinedInClass(Class cls) { Map versionIdFields = new HashMap<>(); List definedTransportVersions = new ArrayList<>(); @@ -466,8 +455,6 @@ public static List collectAllVersionIdsDefinedInClass(Class return List.copyOf(definedTransportVersions); } - static final IntFunction VERSION_LOOKUP = ReleaseVersions.generateVersionsLookup(TransportVersions.class, LATEST_DEFINED.id()); - // no instance private TransportVersions() {} } From a4ec0d60c1552ec7d15b322853fa336ae668228c Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 17 Jul 2025 16:27:23 -0700 Subject: [PATCH 03/25] update transport versions holder --- .../org/elasticsearch/TransportVersion.java | 203 ++++++++---------- .../org/elasticsearch/TransportVersions.java | 1 - ...ated-transport-versions-files-manifest.txt | 1 + ...nference-azure-ai-studio-rerank-added.json | 6 + .../transport/latest/9.2-LATEST.json | 6 + .../AzureAiStudioRerankServiceSettings.java | 3 +- .../AzureAiStudioRerankTaskSettings.java | 3 +- 7 files changed, 101 insertions(+), 122 deletions(-) create mode 100644 server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt create mode 100644 server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json create mode 100644 server/src/main/resources/transport/latest/9.2-LATEST.json diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 83d7fe5aaacf7..b7d7f59ec9093 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -16,6 +16,9 @@ import org.elasticsearch.plugins.ExtensionLoader; import org.elasticsearch.xcontent.ConstructingObjectParser; import org.elasticsearch.xcontent.ParseField; +import org.elasticsearch.xcontent.XContentParser; +import org.elasticsearch.xcontent.XContentParserConfiguration; +import org.elasticsearch.xcontent.json.JsonXContent; import java.io.BufferedReader; import java.io.IOException; @@ -23,6 +26,7 @@ import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -32,7 +36,6 @@ import java.util.function.Function; import java.util.function.IntFunction; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Represents the version of the wire protocol used to communicate between a pair of ES nodes. @@ -68,18 +71,24 @@ */ public class TransportVersion implements VersionId { + private final String name; private final int id; private final TransportVersion patchVersion; public TransportVersion(int id) { - this(id, null); + this(null, id, null); } - public TransportVersion(int id, TransportVersion patchVersion) { + public TransportVersion(String name, int id, TransportVersion patchVersion) { + this.name = name; this.id = id; this.patchVersion = patchVersion; } + public String name() { + return name; + } + public int id() { return id; } @@ -95,6 +104,7 @@ public TransportVersion patchVersion() { TransportVersion.class.getCanonicalName(), false, (args, latestTransportId) -> { + String name = (String) args[0]; @SuppressWarnings("unchecked") List ids = (List) args[1]; ids.sort(Integer::compareTo); @@ -103,7 +113,7 @@ public TransportVersion patchVersion() { if (ids.get(idIndex) > latestTransportId) { break; } - transportVersion = new TransportVersion(ids.get(idIndex), transportVersion); + transportVersion = new TransportVersion(name, ids.get(idIndex), transportVersion); } return transportVersion; } @@ -114,6 +124,14 @@ public TransportVersion patchVersion() { PARSER.declareIntArray(ConstructingObjectParser.constructorArg(), IDS); } + public static TransportVersion fromXContent(InputStream inputStream, Integer latest) { + try (XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream)) { + return PARSER.apply(parser, latest); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + public static TransportVersion readVersion(StreamInput in) throws IOException { return fromId(in.readVInt()); } @@ -130,7 +148,15 @@ public static TransportVersion fromId(int id) { return known; } // this is a version we don't otherwise know about - just create a placeholder - return new TransportVersion(id, null); + return new TransportVersion(null, id, null); + } + + public static TransportVersion fromName(String name) { + TransportVersion known = VersionsHolder.ALL_VERSIONS_BY_NAME.get(name); + if (known == null) { + throw new IllegalStateException("unknown transport version [" + name + "]"); + } + return known; } public static void writeVersion(TransportVersion version, StreamOutput out) throws IOException { @@ -250,97 +276,11 @@ public String toReleaseVersion() { @Override public String toString() { - return Integer.toString(id); + return "TransportVersion{" + "name='" + name + '\'' + ", id=" + id + ", patchVersion=" + patchVersion + '}'; } private static class VersionsHolder { - /*public class TransportVersionSet { - - - - private static final Map TRANSPORT_VERSION_SETS = loadTransportVersionSets(); - public static final List TRANSPORT_VERSIONS = collectTransportVersions(); - - - - private static List collectTransportVersions() { - List transportVersions = new ArrayList<>(); - for (TransportVersionSet transportVersionSet : TRANSPORT_VERSION_SETS.values()) { - transportVersions.addAll(transportVersionSet.versions); - } - transportVersions.sort(TransportVersion::compareTo); - return transportVersions; - } - - private static TransportVersionSet fromXContent(InputStream inputStream, int maxTransportId) throws IOException { - XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream); - return PARSER.parse(parser, maxTransportId); - } - - public static TransportVersionSet get(String name) { - TransportVersionSet transportVersionSet = TRANSPORT_VERSION_SETS.get(name); - if (transportVersionSet == null) { - // TODO: throw - } - return transportVersionSet; - } - - public static TransportVersion local(String name) { - return get(name).local(); - } - - public static TransportVersion oldest(String name) { - return get(name).oldest(); - } - - public static boolean isCompatible(String name, TransportVersion version) { - return get(name).isCompatible(version); - } - - private final String name; - private final List versions; - - private TransportVersionSet(String name, List versions) { - this.name = name; - this.versions = versions; - } - - public String name() { - return name; - } - - public TransportVersion local() { - return versions.get(0); - } - - public TransportVersion oldest() { - return versions.get(versions.size() - 1); - } - - public boolean isCompatible(TransportVersion version) { - boolean compatible = version.onOrAfter(local()); - for (int v = 1; v < versions.size(); ++v) { - compatible |= version.isPatchFrom(versions.get(v)); - } - return compatible; - } - - public boolean isNotCompatible(TransportVersion version) { - boolean compatible = version.before(local()); - for (int v = 1; v < versions.size(); ++v) { - compatible &= version.isPatchFrom(versions.get(v)) == false; - } - return compatible; - } - - @Override - public String toString() { - return "TransportVersionSet{" + "name='" + name + '\'' + ", versions=" + versions + '}'; - } - }*/ - - private static final List ALL_VERSIONS; private static final Map ALL_VERSIONS_BY_ID; private static final Map ALL_VERSIONS_BY_NAME; @@ -348,55 +288,84 @@ public String toString() { private static final TransportVersion CURRENT; static { + // collect all the transport versions from server and es modules/plugins (defined in server) + List allVersions = new ArrayList<>(TransportVersions.DEFINED_VERSIONS); + Map allVersionsByName = loadTransportVersionsByName(); + addTransportVersions(allVersionsByName.values(), allVersions).sort(TransportVersion::compareTo); + + // set version lookup by release before adding serverless versions + VERSION_LOOKUP_BY_RELEASE = ReleaseVersions.generateVersionsLookup( + TransportVersions.class, + allVersions.get(allVersions.size() - 1).id() + ); + + // collect all the transport versions from serverless Collection extendedVersions = ExtensionLoader.loadSingleton(ServiceLoader.load(VersionExtension.class)) .map(VersionExtension::getTransportVersions) .orElse(Collections.emptyList()); - - if (extendedVersions.isEmpty()) { - ALL_VERSIONS = TransportVersions.DEFINED_VERSIONS; - } else { - ALL_VERSIONS = Stream.concat(TransportVersions.DEFINED_VERSIONS.stream(), extendedVersions.stream()).sorted().toList(); + addTransportVersions(extendedVersions, allVersions).sort(TransportVersion::compareTo); + for (TransportVersion version : extendedVersions) { + if (version.name() != null) { + allVersionsByName.put(version.name(), version); + } } + // set the lookup values + ALL_VERSIONS = Collections.unmodifiableList(allVersions); ALL_VERSIONS_BY_ID = ALL_VERSIONS.stream().collect(Collectors.toUnmodifiableMap(TransportVersion::id, Function.identity())); - + ALL_VERSIONS_BY_NAME = Collections.unmodifiableMap(allVersionsByName); CURRENT = ALL_VERSIONS.getLast(); - ReleaseVersions.generateVersionsLookup(TransportVersions.class, LATEST_DEFINED.id()); } - private static Map loadTransportVersions() { + private static Map loadTransportVersionsByName() { Map transportVersions = new HashMap<>(); - String latestLocation = "transport/" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; + String latestLocation = "/transport/latest" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; int latestId; - try (InputStream inputStream = TransportVersionSet.class.getResourceAsStream(latestLocation)) { - TransportVersionSet latest = fromXContent(inputStream, Integer.MAX_VALUE); - // TODO: validation of latest tranport version set - latestId = latest.versions.get(0).id(); + try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { + TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); + if (latest == null) { + throw new IllegalStateException( + "invalid latest transport version for release version [" + Version.CURRENT.major + "." + Version.CURRENT.minor + "]" + ); + } + latestId = latest.id(); } catch (IOException ioe) { throw new UncheckedIOException("latest transport version file not found at [" + latestLocation + "]", ioe); } - String manifestLocation = "META-INF/transport-versions-files-manifest.txt"; - List versionNames; - try (InputStream transportVersionManifest = TransportVersionSet.class.getClassLoader().getResourceAsStream(manifestLocation)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionManifest, StandardCharsets.UTF_8)); - versionNames = reader.lines().filter(line -> line.isBlank() == false).toList(); + String manifestLocation = "/transport/generated/generated-transport-versions-files-manifest.txt"; + List versionFileNames; + try (InputStream transportVersionsManifest = TransportVersion.class.getClassLoader().getResourceAsStream(manifestLocation)) { + BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionsManifest, StandardCharsets.UTF_8)); + versionFileNames = reader.lines().filter(line -> line.isBlank() == false).toList(); } catch (IOException ioe) { - throw new UncheckedIOException("transport version metadata manifest file not found at [" + manifestLocation + "]", ioe); + throw new UncheckedIOException("transport version manifest file not found at [" + manifestLocation + "]", ioe); } - for (String name : versionNames) { - String versionLocation = "transport/" + name; - try (InputStream inputStream = TransportVersionSet.class.getResourceAsStream(versionLocation)) { - TransportVersionSet transportVersionSet = TransportVersionSet.fromXContent(inputStream, latestId); - transportVersionSets.put(transportVersionSet.name, transportVersionSet); + for (String name : versionFileNames) { + String versionLocation = "/transport/generated/" + name; + try (InputStream inputStream = TransportVersion.class.getResourceAsStream(versionLocation)) { + TransportVersion transportVersion = TransportVersion.fromXContent(inputStream, latestId); + transportVersions.put(transportVersion.name(), transportVersion); } catch (IOException ioe) { throw new UncheckedIOException("transport version set file not found at [ " + versionLocation + "]", ioe); } } - return Collections.unmodifiableMap(transportVersionSets); + return transportVersions; + } + + private static List addTransportVersions(Collection addFrom, List addTo) { + for (TransportVersion transportVersion : addFrom) { + addTo.add(transportVersion); + TransportVersion patchVersion = transportVersion.patchVersion(); + while (patchVersion != null) { + addTo.add(patchVersion); + patchVersion = patchVersion.patchVersion(); + } + } + return addTo; } } } diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index ab60480d62488..a0c4113334df9 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -340,7 +340,6 @@ static TransportVersion def(int id) { public static final TransportVersion LOOKUP_JOIN_CCS = def(9_120_0_00); public static final TransportVersion NODE_USAGE_STATS_FOR_THREAD_POOLS_IN_CLUSTER_INFO = def(9_121_0_00); public static final TransportVersion ESQL_CATEGORIZE_OPTIONS = def(9_122_0_00); - public static final TransportVersion ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED = def(9_123_0_00); /* * STOP! READ THIS FIRST! No, really, diff --git a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt new file mode 100644 index 0000000000000..5ba89d4d84ef4 --- /dev/null +++ b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt @@ -0,0 +1 @@ +ml-inference-azure-ai-studio-rerank-added.json diff --git a/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json b/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json new file mode 100644 index 0000000000000..4ece851ca3127 --- /dev/null +++ b/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json @@ -0,0 +1,6 @@ +{ + "name": "ml-inference-azure-ai-studio-rerank-added", + "ids": [ + 9123000 + ] +} diff --git a/server/src/main/resources/transport/latest/9.2-LATEST.json b/server/src/main/resources/transport/latest/9.2-LATEST.json new file mode 100644 index 0000000000000..4ece851ca3127 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.2-LATEST.json @@ -0,0 +1,6 @@ +{ + "name": "ml-inference-azure-ai-studio-rerank-added", + "ids": [ + 9123000 + ] +} diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java index e302ab4d3606d..8d5916181d2b4 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.inference.services.azureaistudio.rerank; import org.elasticsearch.TransportVersion; -import org.elasticsearch.TransportVersions; import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -80,7 +79,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED; + return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank"); } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java index 1faeee4a10f16..6232fbf5d2a16 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.inference.services.azureaistudio.rerank; import org.elasticsearch.TransportVersion; -import org.elasticsearch.TransportVersions; import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -94,7 +93,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED; + return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank"); } @Override From dc9cfe946814565e0bed5cdd0d42170efd1b2018 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 17 Jul 2025 16:47:24 -0700 Subject: [PATCH 04/25] fix bugs --- .../main/java/org/elasticsearch/TransportVersion.java | 10 ++++++---- .../elasticsearch/common/io/stream/StreamInput.java | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index b7d7f59ec9093..6baaa3949ba39 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -310,7 +310,7 @@ private static class VersionsHolder { } } - // set the lookup values + // set the transport version lookups ALL_VERSIONS = Collections.unmodifiableList(allVersions); ALL_VERSIONS_BY_ID = ALL_VERSIONS.stream().collect(Collectors.toUnmodifiableMap(TransportVersion::id, Function.identity())); ALL_VERSIONS_BY_NAME = Collections.unmodifiableMap(allVersionsByName); @@ -320,7 +320,7 @@ private static class VersionsHolder { private static Map loadTransportVersionsByName() { Map transportVersions = new HashMap<>(); - String latestLocation = "/transport/latest" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; + String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; int latestId; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); @@ -336,7 +336,7 @@ private static Map loadTransportVersionsByName() { String manifestLocation = "/transport/generated/generated-transport-versions-files-manifest.txt"; List versionFileNames; - try (InputStream transportVersionsManifest = TransportVersion.class.getClassLoader().getResourceAsStream(manifestLocation)) { + try (InputStream transportVersionsManifest = TransportVersion.class.getResourceAsStream(manifestLocation)) { BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionsManifest, StandardCharsets.UTF_8)); versionFileNames = reader.lines().filter(line -> line.isBlank() == false).toList(); } catch (IOException ioe) { @@ -347,7 +347,9 @@ private static Map loadTransportVersionsByName() { String versionLocation = "/transport/generated/" + name; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(versionLocation)) { TransportVersion transportVersion = TransportVersion.fromXContent(inputStream, latestId); - transportVersions.put(transportVersion.name(), transportVersion); + if (transportVersion != null) { + transportVersions.put(transportVersion.name(), transportVersion); + } } catch (IOException ioe) { throw new UncheckedIOException("transport version set file not found at [ " + versionLocation + "]", ioe); } diff --git a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java index 3e3ab92f5d72f..32cabfd19550c 100644 --- a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java +++ b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java @@ -76,12 +76,15 @@ */ public abstract class StreamInput extends InputStream { - private TransportVersion version = TransportVersion.current(); + private TransportVersion version; /** * The transport version the data is serialized as. */ public TransportVersion getTransportVersion() { + if (version == null) { + version = TransportVersion.current(); + } return this.version; } From b772a3a0b862d9850d9db3414a01622598d1cc48 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 10:40:05 -0700 Subject: [PATCH 05/25] update name --- .../org/elasticsearch/TransportVersion.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 6baaa3949ba39..fd163e7bed7c5 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -73,7 +73,7 @@ public class TransportVersion implements VersionId { private final String name; private final int id; - private final TransportVersion patchVersion; + private final TransportVersion nextPatchVersion; public TransportVersion(int id) { this(null, id, null); @@ -82,7 +82,7 @@ public TransportVersion(int id) { public TransportVersion(String name, int id, TransportVersion patchVersion) { this.name = name; this.id = id; - this.patchVersion = patchVersion; + this.nextPatchVersion = patchVersion; } public String name() { @@ -93,8 +93,8 @@ public int id() { return id; } - public TransportVersion patchVersion() { - return patchVersion; + public TransportVersion nextPatchVersion() { + return nextPatchVersion; } private static final ParseField NAME = new ParseField("name"); @@ -256,12 +256,12 @@ public boolean supports(TransportVersion version) { if (onOrAfter(version)) { return true; } - TransportVersion patchVersion = this.patchVersion; + TransportVersion patchVersion = this.nextPatchVersion; while (patchVersion != null) { if (isPatchFrom(version)) { return true; } - patchVersion = patchVersion.patchVersion; + patchVersion = patchVersion.nextPatchVersion; } return false; } @@ -276,7 +276,7 @@ public String toReleaseVersion() { @Override public String toString() { - return "TransportVersion{" + "name='" + name + '\'' + ", id=" + id + ", patchVersion=" + patchVersion + '}'; + return "TransportVersion{" + "name='" + name + '\'' + ", id=" + id + ", patchVersion=" + nextPatchVersion + '}'; } private static class VersionsHolder { @@ -361,10 +361,10 @@ private static Map loadTransportVersionsByName() { private static List addTransportVersions(Collection addFrom, List addTo) { for (TransportVersion transportVersion : addFrom) { addTo.add(transportVersion); - TransportVersion patchVersion = transportVersion.patchVersion(); + TransportVersion patchVersion = transportVersion.nextPatchVersion(); while (patchVersion != null) { addTo.add(patchVersion); - patchVersion = patchVersion.patchVersion(); + patchVersion = patchVersion.nextPatchVersion(); } } return addTo; From 8aa55cac013c1e4fe5e38d0f617f1efae5ad5109 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 12:50:58 -0700 Subject: [PATCH 06/25] fix equals/hashcode/toString --- .../org/elasticsearch/TransportVersion.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index fd163e7bed7c5..2ac41fc04e465 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.ServiceLoader; import java.util.function.Function; import java.util.function.IntFunction; @@ -256,12 +257,12 @@ public boolean supports(TransportVersion version) { if (onOrAfter(version)) { return true; } - TransportVersion patchVersion = this.nextPatchVersion; - while (patchVersion != null) { + TransportVersion nextPatchVersion = version.nextPatchVersion; + while (nextPatchVersion != null) { if (isPatchFrom(version)) { return true; } - patchVersion = patchVersion.nextPatchVersion; + nextPatchVersion = nextPatchVersion.nextPatchVersion; } return false; } @@ -274,9 +275,21 @@ public String toReleaseVersion() { return VersionsHolder.VERSION_LOOKUP_BY_RELEASE.apply(id); } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + TransportVersion that = (TransportVersion) o; + return id == that.id; + } + + @Override + public int hashCode() { + return id; + } + @Override public String toString() { - return "TransportVersion{" + "name='" + name + '\'' + ", id=" + id + ", patchVersion=" + nextPatchVersion + '}'; + return "" + id; } private static class VersionsHolder { From f13e72345052841989ace60e941b7a986c082b51 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 13:08:29 -0700 Subject: [PATCH 07/25] spotless --- server/src/main/java/org/elasticsearch/TransportVersion.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 2ac41fc04e465..67d769a190e8b 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -32,7 +32,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.ServiceLoader; import java.util.function.Function; import java.util.function.IntFunction; From be9d70bdabe4bc3ed60e3d61696439c709e7567c Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 13:26:21 -0700 Subject: [PATCH 08/25] migrate version with multiple patches --- .../java/org/elasticsearch/TransportVersions.java | 3 --- .../generated/esql-split-on-big-values.json | 8 ++++++++ .../org/elasticsearch/TransportVersionTests.java | 8 ++++++++ .../read/ValuesSourceReaderOperatorStatus.java | 14 +++----------- 4 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 server/src/main/resources/transport/generated/esql-split-on-big-values.json diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 9a1ebb3cdd4be..cc3df5b28e11b 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -209,7 +209,6 @@ static TransportVersion def(int id) { public static final TransportVersion ML_INFERENCE_COHERE_API_VERSION_8_19 = def(8_841_0_60); public static final TransportVersion ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19 = def(8_841_0_61); public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN_8_19 = def(8_841_0_62); - public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_8_19 = def(8_841_0_63); public static final TransportVersion ESQL_FIXED_INDEX_LIKE_8_19 = def(8_841_0_64); public static final TransportVersion V_9_0_0 = def(9_000_0_09); public static final TransportVersion INITIAL_ELASTICSEARCH_9_0_1 = def(9_000_0_10); @@ -327,14 +326,12 @@ static TransportVersion def(int id) { public static final TransportVersion ML_INFERENCE_COHERE_API_VERSION = def(9_110_0_00); public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN = def(9_111_0_00); public static final TransportVersion MAPPINGS_IN_DATA_STREAMS = def(9_112_0_00); - public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_9_1 = def(9_112_0_01); public static final TransportVersion ESQL_FIXED_INDEX_LIKE_9_1 = def(9_112_0_02); public static final TransportVersion ESQL_SAMPLE_OPERATOR_STATUS_9_1 = def(9_112_0_03); // Below is the first version in 9.2 and NOT in 9.1. public static final TransportVersion PROJECT_STATE_REGISTRY_RECORDS_DELETIONS = def(9_113_0_00); public static final TransportVersion ESQL_SERIALIZE_TIMESERIES_FIELD_TYPE = def(9_114_0_00); public static final TransportVersion ML_INFERENCE_IBM_WATSONX_COMPLETION_ADDED = def(9_115_0_00); - public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES = def(9_116_0_00); public static final TransportVersion ESQL_LOCAL_RELATION_WITH_NEW_BLOCKS = def(9_117_0_00); public static final TransportVersion ML_INFERENCE_CUSTOM_SERVICE_EMBEDDING_TYPE = def(9_118_0_00); public static final TransportVersion ESQL_FIXED_INDEX_LIKE = def(9_119_0_00); diff --git a/server/src/main/resources/transport/generated/esql-split-on-big-values.json b/server/src/main/resources/transport/generated/esql-split-on-big-values.json new file mode 100644 index 0000000000000..c0b4a1d735305 --- /dev/null +++ b/server/src/main/resources/transport/generated/esql-split-on-big-values.json @@ -0,0 +1,8 @@ +{ + "name": "esql-split-on-big-values", + "ids": [ + 9116000, + 9112001, + 8841063 + ] +} diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 4e100e3067444..386186abe6d1a 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -220,4 +220,12 @@ public void testDuplicateConstants() { previous = next; } } + + public void testNamedVersions() { + assertEquals( + new TransportVersion("ml-inference-azure-ai-studio-rerank-added", 9123000, null), + TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added") + ); + assertEquals(new TransportVersion("esql-topn-timings", 9128000, null), TransportVersion.fromName("esql-topn-timings")); + } } diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java index 4a8fcda81f82a..c7fa22c590e0c 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java @@ -23,9 +23,6 @@ import static org.elasticsearch.TransportVersions.ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED; import static org.elasticsearch.TransportVersions.ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19; -import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES; -import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES_8_19; -import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES_9_1; public class ValuesSourceReaderOperatorStatus extends AbstractPageMappingToIteratorOperator.Status { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( @@ -33,6 +30,7 @@ public class ValuesSourceReaderOperatorStatus extends AbstractPageMappingToItera "values_source_reader", ValuesSourceReaderOperatorStatus::readFrom ); + public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES = TransportVersion.fromName("esql-split-on-big-values"); private final Map readersBuilt; private final long valuesLoaded; @@ -57,7 +55,7 @@ static ValuesSourceReaderOperatorStatus readFrom(StreamInput in) throws IOExcept int pagesEmitted; long rowsReceived; long rowsEmitted; - if (supportsSplitOnBigValues(in.getTransportVersion())) { + if (in.getTransportVersion().supports(ESQL_SPLIT_ON_BIG_VALUES)) { AbstractPageMappingToIteratorOperator.Status status = new AbstractPageMappingToIteratorOperator.Status(in); processNanos = status.processNanos(); pagesReceived = status.pagesReceived(); @@ -87,7 +85,7 @@ static ValuesSourceReaderOperatorStatus readFrom(StreamInput in) throws IOExcept @Override public void writeTo(StreamOutput out) throws IOException { - if (supportsSplitOnBigValues(out.getTransportVersion())) { + if (out.getTransportVersion().supports(ESQL_SPLIT_ON_BIG_VALUES)) { super.writeTo(out); } else { /* @@ -102,12 +100,6 @@ public void writeTo(StreamOutput out) throws IOException { } } - private static boolean supportsSplitOnBigValues(TransportVersion version) { - return version.onOrAfter(ESQL_SPLIT_ON_BIG_VALUES) - || version.isPatchFrom(ESQL_SPLIT_ON_BIG_VALUES_9_1) - || version.isPatchFrom(ESQL_SPLIT_ON_BIG_VALUES_8_19); - } - private static boolean supportsValuesLoaded(TransportVersion version) { return version.onOrAfter(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED) || version.isPatchFrom(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19); From 01511ff49d29ab3f9850dcc462854d804677dc3b Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 13:39:06 -0700 Subject: [PATCH 09/25] spotless --- .../generated-transport-versions-files-manifest.txt | 1 + .../org/elasticsearch/TransportVersionTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt index c47dab75d9115..5fe7459a6c8eb 100644 --- a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt +++ b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt @@ -1,2 +1,3 @@ +esql-split-on-big-values.json ml-inference-azure-ai-studio-rerank-added.json esql-topn-timings.json diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 386186abe6d1a..6dbb6109b7837 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -222,6 +222,18 @@ public void testDuplicateConstants() { } public void testNamedVersions() { + assertEquals( + new TransportVersion("esql-split-on-big-values", 9116000, null), + TransportVersion.fromName("esql-split-on-big-values") + ); + assertEquals( + new TransportVersion("esql-split-on-big-values", 9112001, null), + TransportVersion.fromName("esql-split-on-big-values").nextPatchVersion() + ); + assertEquals( + new TransportVersion("esql-split-on-big-values", 8841063, null), + TransportVersion.fromName("esql-split-on-big-values").nextPatchVersion().nextPatchVersion() + ); assertEquals( new TransportVersion("ml-inference-azure-ai-studio-rerank-added", 9123000, null), TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added") From cba38b1d8bdc91f540a7eac17eb99ef36619c5f8 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 21 Jul 2025 14:53:57 -0700 Subject: [PATCH 10/25] fix names --- .../rerank/AzureAiStudioRerankServiceSettings.java | 2 +- .../azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java index 8d5916181d2b4..62290ec5f179b 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java @@ -79,7 +79,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank"); + return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java index 6232fbf5d2a16..e363d0ebdf82f 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java @@ -93,7 +93,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank"); + return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); } @Override From b02cb1a1823d375ac75102d88fc855da839c4e2d Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 22 Jul 2025 08:09:15 -0700 Subject: [PATCH 11/25] name fixes --- .../src/main/java/org/elasticsearch/TransportVersion.java | 2 +- .../main/java/org/elasticsearch/TransportVersions.java | 3 ++- .../generated-transport-versions-files-manifest.txt | 2 -- .../compute/operator/topn/TopNOperatorStatus.java | 8 +++++--- .../rerank/AzureAiStudioRerankServiceSettings.java | 3 ++- .../rerank/AzureAiStudioRerankTaskSettings.java | 3 ++- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 67d769a190e8b..1f07bdf7d513d 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -258,7 +258,7 @@ public boolean supports(TransportVersion version) { } TransportVersion nextPatchVersion = version.nextPatchVersion; while (nextPatchVersion != null) { - if (isPatchFrom(version)) { + if (isPatchFrom(nextPatchVersion)) { return true; } nextPatchVersion = nextPatchVersion.nextPatchVersion; diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index cc3df5b28e11b..506b84db16762 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -338,11 +338,12 @@ static TransportVersion def(int id) { public static final TransportVersion LOOKUP_JOIN_CCS = def(9_120_0_00); public static final TransportVersion NODE_USAGE_STATS_FOR_THREAD_POOLS_IN_CLUSTER_INFO = def(9_121_0_00); public static final TransportVersion ESQL_CATEGORIZE_OPTIONS = def(9_122_0_00); + public static final TransportVersion ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED = def(9_123_0_00); public static final TransportVersion PROJECT_STATE_REGISTRY_ENTRY = def(9_124_0_00); public static final TransportVersion ML_INFERENCE_LLAMA_ADDED = def(9_125_0_00); public static final TransportVersion SHARD_WRITE_LOAD_IN_CLUSTER_INFO = def(9_126_0_00); public static final TransportVersion ESQL_SAMPLE_OPERATOR_STATUS = def(9_127_0_00); - + public static final TransportVersion ESQL_TOPN_TIMINGS = def(9_128_0_00); /* * STOP! READ THIS FIRST! No, really, * ____ _____ ___ ____ _ ____ _____ _ ____ _____ _ _ ___ ____ _____ ___ ____ ____ _____ _ diff --git a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt index 5fe7459a6c8eb..370fc7fba4cc0 100644 --- a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt +++ b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt @@ -1,3 +1 @@ esql-split-on-big-values.json -ml-inference-azure-ai-studio-rerank-added.json -esql-topn-timings.json diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java index 915a936818986..df935bd71c933 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java @@ -20,13 +20,15 @@ import java.io.IOException; import java.util.Objects; +import static org.elasticsearch.TransportVersions.ESQL_TOPN_TIMINGS; + public class TopNOperatorStatus implements Operator.Status { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Operator.Status.class, "topn", TopNOperatorStatus::new ); - public static final TransportVersion ESQL_TOPN_TIMINGS = TransportVersion.fromName("esql-topn-timings"); + //public static final TransportVersion ESQL_TOPN_TIMINGS = TransportVersion.fromName("esql-topn-timings"); private final long receiveNanos; private final long emitNanos; private final int occupiedRows; @@ -57,7 +59,7 @@ public TopNOperatorStatus( } TopNOperatorStatus(StreamInput in) throws IOException { - if (in.getTransportVersion().supports(ESQL_TOPN_TIMINGS)) { + if (in.getTransportVersion().onOrAfter(ESQL_TOPN_TIMINGS)) { this.receiveNanos = in.readVLong(); this.emitNanos = in.readVLong(); } else { @@ -82,7 +84,7 @@ public TopNOperatorStatus( @Override public void writeTo(StreamOutput out) throws IOException { - if (out.getTransportVersion().supports(ESQL_TOPN_TIMINGS)) { + if (out.getTransportVersion().onOrAfter(ESQL_TOPN_TIMINGS)) { out.writeVLong(receiveNanos); out.writeVLong(emitNanos); } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java index 62290ec5f179b..52546519513ef 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.inference.services.azureaistudio.rerank; import org.elasticsearch.TransportVersion; +import org.elasticsearch.TransportVersions; import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -79,7 +80,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); + return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED;//TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java index e363d0ebdf82f..86eae397bcfd6 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.inference.services.azureaistudio.rerank; import org.elasticsearch.TransportVersion; +import org.elasticsearch.TransportVersions; import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -93,7 +94,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); + return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED;//TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); } @Override From c56ec3af3e19e906996dbef02e424600bb046a8f Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 22 Jul 2025 12:10:40 -0700 Subject: [PATCH 12/25] move examples to tests --- .../org/elasticsearch/TransportVersion.java | 94 +++++++++---------- .../org/elasticsearch/TransportVersions.java | 4 + .../generated/esql-split-on-big-values.json | 8 -- .../generated/esql-topn-timings.json | 6 -- ...ated-transport-versions-files-manifest.txt | 1 - ...nference-azure-ai-studio-rerank-added.json | 6 -- .../transport/latest/9.2-LATEST.json | 6 -- .../elasticsearch/TransportVersionTests.java | 34 ++----- ...tant-transport-versions-files-manifest.txt | 5 + .../resources/transport/constant/test-0.json | 5 + .../resources/transport/constant/test-1.json | 5 + .../resources/transport/constant/test-2.json | 5 + .../resources/transport/constant/test-3.json | 5 + .../resources/transport/constant/test-4.json | 5 + .../ValuesSourceReaderOperatorStatus.java | 14 ++- .../operator/topn/TopNOperatorStatus.java | 7 +- .../AzureAiStudioRerankServiceSettings.java | 2 +- .../AzureAiStudioRerankTaskSettings.java | 2 +- 18 files changed, 99 insertions(+), 115 deletions(-) delete mode 100644 server/src/main/resources/transport/generated/esql-split-on-big-values.json delete mode 100644 server/src/main/resources/transport/generated/esql-topn-timings.json delete mode 100644 server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt delete mode 100644 server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json delete mode 100644 server/src/main/resources/transport/latest/9.2-LATEST.json create mode 100644 server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt create mode 100644 server/src/test/resources/transport/constant/test-0.json create mode 100644 server/src/test/resources/transport/constant/test-1.json create mode 100644 server/src/test/resources/transport/constant/test-2.json create mode 100644 server/src/test/resources/transport/constant/test-3.json create mode 100644 server/src/test/resources/transport/constant/test-4.json diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 1f07bdf7d513d..d20e23bc9e2c6 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -69,33 +69,7 @@ * different version value. If you need to know whether the cluster as a whole speaks a new enough {@link TransportVersion} to understand a * newly-added feature, use {@link org.elasticsearch.cluster.ClusterState#getMinTransportVersion}. */ -public class TransportVersion implements VersionId { - - private final String name; - private final int id; - private final TransportVersion nextPatchVersion; - - public TransportVersion(int id) { - this(null, id, null); - } - - public TransportVersion(String name, int id, TransportVersion patchVersion) { - this.name = name; - this.id = id; - this.nextPatchVersion = patchVersion; - } - - public String name() { - return name; - } - - public int id() { - return id; - } - - public TransportVersion nextPatchVersion() { - return nextPatchVersion; - } +public record TransportVersion(String name, int id, TransportVersion nextPatchVersion) implements VersionId { private static final ParseField NAME = new ParseField("name"); private static final ParseField IDS = new ParseField("ids"); @@ -288,7 +262,7 @@ public int hashCode() { @Override public String toString() { - return "" + id; + return Integer.toString(id); } private static class VersionsHolder { @@ -332,38 +306,56 @@ private static class VersionsHolder { private static Map loadTransportVersionsByName() { Map transportVersions = new HashMap<>(); - String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + "-LATEST.json"; - int latestId; + String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".json"; + int latestId = -1; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { - TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); - if (latest == null) { - throw new IllegalStateException( - "invalid latest transport version for release version [" + Version.CURRENT.major + "." + Version.CURRENT.minor + "]" - ); + // this check is required until bootstrapping for the new transport versions format is completed; + // when load is false, we will only use the transport versions in the legacy format; + // load becomes false if we don't find the latest or manifest files required for the new format + if (inputStream != null) { + TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); + if (latest == null) { + throw new IllegalStateException( + "invalid latest transport version for release version [" + + Version.CURRENT.major + + "." + + Version.CURRENT.minor + + "]" + ); + } + latestId = latest.id(); } - latestId = latest.id(); } catch (IOException ioe) { throw new UncheckedIOException("latest transport version file not found at [" + latestLocation + "]", ioe); } - String manifestLocation = "/transport/generated/generated-transport-versions-files-manifest.txt"; - List versionFileNames; - try (InputStream transportVersionsManifest = TransportVersion.class.getResourceAsStream(manifestLocation)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionsManifest, StandardCharsets.UTF_8)); - versionFileNames = reader.lines().filter(line -> line.isBlank() == false).toList(); - } catch (IOException ioe) { - throw new UncheckedIOException("transport version manifest file not found at [" + manifestLocation + "]", ioe); + String manifestLocation = "/transport/constant/constant-transport-versions-files-manifest.txt"; + List versionFileNames = null; + if (latestId > -1) { + try (InputStream inputStream = TransportVersion.class.getResourceAsStream(manifestLocation)) { + if (inputStream == null) { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + versionFileNames = reader.lines().filter(line -> line.isBlank() == false).toList(); + } + } catch (IOException ioe) { + throw new UncheckedIOException("transport version manifest file not found at [" + manifestLocation + "]", ioe); + } } - for (String name : versionFileNames) { - String versionLocation = "/transport/generated/" + name; - try (InputStream inputStream = TransportVersion.class.getResourceAsStream(versionLocation)) { - TransportVersion transportVersion = TransportVersion.fromXContent(inputStream, latestId); - if (transportVersion != null) { - transportVersions.put(transportVersion.name(), transportVersion); + if (versionFileNames != null) { + for (String name : versionFileNames) { + String versionLocation = "/transport/constant/" + name; + try (InputStream inputStream = TransportVersion.class.getResourceAsStream(versionLocation)) { + if (inputStream == null) { + throw new IllegalStateException("transport version file not found at [" + versionLocation + "]"); + } + TransportVersion transportVersion = TransportVersion.fromXContent(inputStream, latestId); + if (transportVersion != null) { + transportVersions.put(transportVersion.name(), transportVersion); + } + } catch (IOException ioe) { + throw new UncheckedIOException("transport version file not found at [ " + versionLocation + "]", ioe); } - } catch (IOException ioe) { - throw new UncheckedIOException("transport version set file not found at [ " + versionLocation + "]", ioe); } } diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 506b84db16762..34c461d0b6535 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -209,6 +209,7 @@ static TransportVersion def(int id) { public static final TransportVersion ML_INFERENCE_COHERE_API_VERSION_8_19 = def(8_841_0_60); public static final TransportVersion ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19 = def(8_841_0_61); public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN_8_19 = def(8_841_0_62); + public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_8_19 = def(8_841_0_63); public static final TransportVersion ESQL_FIXED_INDEX_LIKE_8_19 = def(8_841_0_64); public static final TransportVersion V_9_0_0 = def(9_000_0_09); public static final TransportVersion INITIAL_ELASTICSEARCH_9_0_1 = def(9_000_0_10); @@ -326,12 +327,14 @@ static TransportVersion def(int id) { public static final TransportVersion ML_INFERENCE_COHERE_API_VERSION = def(9_110_0_00); public static final TransportVersion ESQL_PROFILE_INCLUDE_PLAN = def(9_111_0_00); public static final TransportVersion MAPPINGS_IN_DATA_STREAMS = def(9_112_0_00); + public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES_9_1 = def(9_112_0_01); public static final TransportVersion ESQL_FIXED_INDEX_LIKE_9_1 = def(9_112_0_02); public static final TransportVersion ESQL_SAMPLE_OPERATOR_STATUS_9_1 = def(9_112_0_03); // Below is the first version in 9.2 and NOT in 9.1. public static final TransportVersion PROJECT_STATE_REGISTRY_RECORDS_DELETIONS = def(9_113_0_00); public static final TransportVersion ESQL_SERIALIZE_TIMESERIES_FIELD_TYPE = def(9_114_0_00); public static final TransportVersion ML_INFERENCE_IBM_WATSONX_COMPLETION_ADDED = def(9_115_0_00); + public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES = def(9_116_0_00); public static final TransportVersion ESQL_LOCAL_RELATION_WITH_NEW_BLOCKS = def(9_117_0_00); public static final TransportVersion ML_INFERENCE_CUSTOM_SERVICE_EMBEDDING_TYPE = def(9_118_0_00); public static final TransportVersion ESQL_FIXED_INDEX_LIKE = def(9_119_0_00); @@ -344,6 +347,7 @@ static TransportVersion def(int id) { public static final TransportVersion SHARD_WRITE_LOAD_IN_CLUSTER_INFO = def(9_126_0_00); public static final TransportVersion ESQL_SAMPLE_OPERATOR_STATUS = def(9_127_0_00); public static final TransportVersion ESQL_TOPN_TIMINGS = def(9_128_0_00); + /* * STOP! READ THIS FIRST! No, really, * ____ _____ ___ ____ _ ____ _____ _ ____ _____ _ _ ___ ____ _____ ___ ____ ____ _____ _ diff --git a/server/src/main/resources/transport/generated/esql-split-on-big-values.json b/server/src/main/resources/transport/generated/esql-split-on-big-values.json deleted file mode 100644 index c0b4a1d735305..0000000000000 --- a/server/src/main/resources/transport/generated/esql-split-on-big-values.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "esql-split-on-big-values", - "ids": [ - 9116000, - 9112001, - 8841063 - ] -} diff --git a/server/src/main/resources/transport/generated/esql-topn-timings.json b/server/src/main/resources/transport/generated/esql-topn-timings.json deleted file mode 100644 index 944dfc500fe53..0000000000000 --- a/server/src/main/resources/transport/generated/esql-topn-timings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "esql-topn-timings", - "ids": [ - 9128000 - ] -} diff --git a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt b/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt deleted file mode 100644 index 370fc7fba4cc0..0000000000000 --- a/server/src/main/resources/transport/generated/generated-transport-versions-files-manifest.txt +++ /dev/null @@ -1 +0,0 @@ -esql-split-on-big-values.json diff --git a/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json b/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json deleted file mode 100644 index 4ece851ca3127..0000000000000 --- a/server/src/main/resources/transport/generated/ml-inference-azure-ai-studio-rerank-added.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ml-inference-azure-ai-studio-rerank-added", - "ids": [ - 9123000 - ] -} diff --git a/server/src/main/resources/transport/latest/9.2-LATEST.json b/server/src/main/resources/transport/latest/9.2-LATEST.json deleted file mode 100644 index 944dfc500fe53..0000000000000 --- a/server/src/main/resources/transport/latest/9.2-LATEST.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "esql-topn-timings", - "ids": [ - 9128000 - ] -} diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 6dbb6109b7837..0be0388ed044f 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -53,16 +53,16 @@ public void testVersionComparison() { } public static class CorrectFakeVersion { - public static final TransportVersion V_0_00_01 = new TransportVersion(199); - public static final TransportVersion V_0_000_002 = new TransportVersion(2); - public static final TransportVersion V_0_000_003 = new TransportVersion(3); - public static final TransportVersion V_0_000_004 = new TransportVersion(4); + public static final TransportVersion V_0_00_01 = new TransportVersion(null, 199, null); + public static final TransportVersion V_0_000_002 = new TransportVersion(null, 2, null); + public static final TransportVersion V_0_000_003 = new TransportVersion(null, 3, null); + public static final TransportVersion V_0_000_004 = new TransportVersion(null, 4, null); } public static class DuplicatedIdFakeVersion { - public static final TransportVersion V_0_000_001 = new TransportVersion(1); - public static final TransportVersion V_0_000_002 = new TransportVersion(2); - public static final TransportVersion V_0_000_003 = new TransportVersion(2); + public static final TransportVersion V_0_000_001 = new TransportVersion(null, 1, null); + public static final TransportVersion V_0_000_002 = new TransportVersion(null, 2, null); + public static final TransportVersion V_0_000_003 = new TransportVersion(null, 2, null); } public void testStaticTransportVersionChecks() { @@ -220,24 +220,4 @@ public void testDuplicateConstants() { previous = next; } } - - public void testNamedVersions() { - assertEquals( - new TransportVersion("esql-split-on-big-values", 9116000, null), - TransportVersion.fromName("esql-split-on-big-values") - ); - assertEquals( - new TransportVersion("esql-split-on-big-values", 9112001, null), - TransportVersion.fromName("esql-split-on-big-values").nextPatchVersion() - ); - assertEquals( - new TransportVersion("esql-split-on-big-values", 8841063, null), - TransportVersion.fromName("esql-split-on-big-values").nextPatchVersion().nextPatchVersion() - ); - assertEquals( - new TransportVersion("ml-inference-azure-ai-studio-rerank-added", 9123000, null), - TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added") - ); - assertEquals(new TransportVersion("esql-topn-timings", 9128000, null), TransportVersion.fromName("esql-topn-timings")); - } } diff --git a/server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt b/server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt new file mode 100644 index 0000000000000..de534728ea566 --- /dev/null +++ b/server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt @@ -0,0 +1,5 @@ +test-0.json +test-1.json +test-2.json +test-3.json +test-4.json diff --git a/server/src/test/resources/transport/constant/test-0.json b/server/src/test/resources/transport/constant/test-0.json new file mode 100644 index 0000000000000..29d4935b8ceb0 --- /dev/null +++ b/server/src/test/resources/transport/constant/test-0.json @@ -0,0 +1,5 @@ +{ + "name": "test-0", + "ids": [ + ] +} diff --git a/server/src/test/resources/transport/constant/test-1.json b/server/src/test/resources/transport/constant/test-1.json new file mode 100644 index 0000000000000..e687c9d9038e0 --- /dev/null +++ b/server/src/test/resources/transport/constant/test-1.json @@ -0,0 +1,5 @@ +{ + "name": "test-1", + "ids": [ + ] +} diff --git a/server/src/test/resources/transport/constant/test-2.json b/server/src/test/resources/transport/constant/test-2.json new file mode 100644 index 0000000000000..73f920b5036e5 --- /dev/null +++ b/server/src/test/resources/transport/constant/test-2.json @@ -0,0 +1,5 @@ +{ + "name": "test-2", + "ids": [ + ] +} diff --git a/server/src/test/resources/transport/constant/test-3.json b/server/src/test/resources/transport/constant/test-3.json new file mode 100644 index 0000000000000..5cce8110e2de1 --- /dev/null +++ b/server/src/test/resources/transport/constant/test-3.json @@ -0,0 +1,5 @@ +{ + "name": "test-3", + "ids": [ + ] +} diff --git a/server/src/test/resources/transport/constant/test-4.json b/server/src/test/resources/transport/constant/test-4.json new file mode 100644 index 0000000000000..109c94f953832 --- /dev/null +++ b/server/src/test/resources/transport/constant/test-4.json @@ -0,0 +1,5 @@ +{ + "name": "test-4", + "ids": [ + ] +} diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java index c7fa22c590e0c..4a8fcda81f82a 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/ValuesSourceReaderOperatorStatus.java @@ -23,6 +23,9 @@ import static org.elasticsearch.TransportVersions.ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED; import static org.elasticsearch.TransportVersions.ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19; +import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES; +import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES_8_19; +import static org.elasticsearch.TransportVersions.ESQL_SPLIT_ON_BIG_VALUES_9_1; public class ValuesSourceReaderOperatorStatus extends AbstractPageMappingToIteratorOperator.Status { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( @@ -30,7 +33,6 @@ public class ValuesSourceReaderOperatorStatus extends AbstractPageMappingToItera "values_source_reader", ValuesSourceReaderOperatorStatus::readFrom ); - public static final TransportVersion ESQL_SPLIT_ON_BIG_VALUES = TransportVersion.fromName("esql-split-on-big-values"); private final Map readersBuilt; private final long valuesLoaded; @@ -55,7 +57,7 @@ static ValuesSourceReaderOperatorStatus readFrom(StreamInput in) throws IOExcept int pagesEmitted; long rowsReceived; long rowsEmitted; - if (in.getTransportVersion().supports(ESQL_SPLIT_ON_BIG_VALUES)) { + if (supportsSplitOnBigValues(in.getTransportVersion())) { AbstractPageMappingToIteratorOperator.Status status = new AbstractPageMappingToIteratorOperator.Status(in); processNanos = status.processNanos(); pagesReceived = status.pagesReceived(); @@ -85,7 +87,7 @@ static ValuesSourceReaderOperatorStatus readFrom(StreamInput in) throws IOExcept @Override public void writeTo(StreamOutput out) throws IOException { - if (out.getTransportVersion().supports(ESQL_SPLIT_ON_BIG_VALUES)) { + if (supportsSplitOnBigValues(out.getTransportVersion())) { super.writeTo(out); } else { /* @@ -100,6 +102,12 @@ public void writeTo(StreamOutput out) throws IOException { } } + private static boolean supportsSplitOnBigValues(TransportVersion version) { + return version.onOrAfter(ESQL_SPLIT_ON_BIG_VALUES) + || version.isPatchFrom(ESQL_SPLIT_ON_BIG_VALUES_9_1) + || version.isPatchFrom(ESQL_SPLIT_ON_BIG_VALUES_8_19); + } + private static boolean supportsValuesLoaded(TransportVersion version) { return version.onOrAfter(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED) || version.isPatchFrom(ESQL_DOCUMENTS_FOUND_AND_VALUES_LOADED_8_19); diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java index df935bd71c933..95a839671a70c 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/topn/TopNOperatorStatus.java @@ -20,15 +20,12 @@ import java.io.IOException; import java.util.Objects; -import static org.elasticsearch.TransportVersions.ESQL_TOPN_TIMINGS; - public class TopNOperatorStatus implements Operator.Status { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Operator.Status.class, "topn", TopNOperatorStatus::new ); - //public static final TransportVersion ESQL_TOPN_TIMINGS = TransportVersion.fromName("esql-topn-timings"); private final long receiveNanos; private final long emitNanos; private final int occupiedRows; @@ -59,7 +56,7 @@ public TopNOperatorStatus( } TopNOperatorStatus(StreamInput in) throws IOException { - if (in.getTransportVersion().onOrAfter(ESQL_TOPN_TIMINGS)) { + if (in.getTransportVersion().onOrAfter(TransportVersions.ESQL_TOPN_TIMINGS)) { this.receiveNanos = in.readVLong(); this.emitNanos = in.readVLong(); } else { @@ -84,7 +81,7 @@ public TopNOperatorStatus( @Override public void writeTo(StreamOutput out) throws IOException { - if (out.getTransportVersion().onOrAfter(ESQL_TOPN_TIMINGS)) { + if (out.getTransportVersion().onOrAfter(TransportVersions.ESQL_TOPN_TIMINGS)) { out.writeVLong(receiveNanos); out.writeVLong(emitNanos); } diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java index 52546519513ef..e302ab4d3606d 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankServiceSettings.java @@ -80,7 +80,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED;//TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); + return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED; } @Override diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java index 86eae397bcfd6..1faeee4a10f16 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/azureaistudio/rerank/AzureAiStudioRerankTaskSettings.java @@ -94,7 +94,7 @@ public String getWriteableName() { @Override public TransportVersion getMinimalSupportedVersion() { - return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED;//TransportVersion.fromName("ml-inference-azure-ai-studio-rerank-added"); + return TransportVersions.ML_INFERENCE_AZURE_AI_STUDIO_RERANK_ADDED; } @Override From 75fbbe432dd0e86944914720a06aeeda4c263de4 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 22 Jul 2025 12:36:09 -0700 Subject: [PATCH 13/25] fix new instances --- .../main/java/org/elasticsearch/TransportVersions.java | 2 +- .../transport/TransportHandshakerTests.java | 4 ++-- .../org/elasticsearch/test/TransportVersionUtils.java | 2 +- .../cohere/embeddings/CohereEmbeddingTypeTests.java | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index 34c461d0b6535..61591ea2a1acd 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -44,7 +44,7 @@ static TransportVersion def(int id) { if (id < IDS.last()) { throw new IllegalArgumentException("Version id " + id + " is not defined in the right location. Keep constants sorted"); } - return new TransportVersion(id); + return new TransportVersion(null, id, null); } // TODO: ES-10337 we can remove all transport versions earlier than 8.18 diff --git a/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java b/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java index fbbf2e92c89cd..bfb99a03abddd 100644 --- a/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java +++ b/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java @@ -258,11 +258,11 @@ public void testHandshakeResponseFromOlderNodeWithPatchedProtocol() throws Excep private static TransportVersion getRandomIncompatibleTransportVersion() { return randomBoolean() // either older than MINIMUM_COMPATIBLE - ? new TransportVersion(between(1, TransportVersions.MINIMUM_COMPATIBLE.id() - 1)) + ? new TransportVersion(null, between(1, TransportVersions.MINIMUM_COMPATIBLE.id() - 1), null) // or between MINIMUM_COMPATIBLE and current but not known : randomValueOtherThanMany( TransportVersion::isKnown, - () -> new TransportVersion(between(TransportVersions.MINIMUM_COMPATIBLE.id(), TransportVersion.current().id())) + () -> new TransportVersion(null, between(TransportVersions.MINIMUM_COMPATIBLE.id(), TransportVersion.current().id()), null) ); } diff --git a/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java b/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java index 9c7114425b8db..e96c3dd5d9a45 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java +++ b/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java @@ -103,7 +103,7 @@ public static TransportVersion getNextVersion(TransportVersion version, boolean if (higher == null) { if (createIfNecessary) { // create a new transport version one greater than specified - return new TransportVersion(version.id() + 1); + return new TransportVersion(null, version.id() + 1, null); } else { throw new IllegalArgumentException("couldn't find any released versions after [" + version + "]"); } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java index 13e6cbdefe62a..183a5bae721bd 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java @@ -17,21 +17,21 @@ public class CohereEmbeddingTypeTests extends ESTestCase { public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingByte() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BYTE, new TransportVersion(8_613_00_0)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BYTE, new TransportVersion(null, 8_613_00_0, null)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingInt8() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.INT8, new TransportVersion(8_613_00_0)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.INT8, new TransportVersion(null, 8_613_00_0, null)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsFloat_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingFloat() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.FLOAT, new TransportVersion(8_613_00_0)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.FLOAT, new TransportVersion(null, 8_613_00_0, null)), is(CohereEmbeddingType.FLOAT) ); } @@ -52,14 +52,14 @@ public void testTranslateToVersion_ReturnsFloat_WhenVersionOnByteEnumAddition_Wh public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeBitEnumAdditionPatch_WhenSpecifyingBit() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(8_840_0_00)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(null, 8_840_0_00, null)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeBitEnumAddition_WhenSpecifyingBit() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(9_000_0_00)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(null, 9_000_0_00, null)), is(CohereEmbeddingType.INT8) ); } From c42bfc23165762725dd256bd5a026eb87cabf90f Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 22 Jul 2025 12:52:12 -0700 Subject: [PATCH 14/25] add versions to test files --- server/src/test/resources/transport/constant/test-0.json | 1 + server/src/test/resources/transport/constant/test-1.json | 1 + server/src/test/resources/transport/constant/test-2.json | 3 +++ server/src/test/resources/transport/constant/test-3.json | 3 +++ server/src/test/resources/transport/constant/test-4.json | 4 ++++ server/src/test/resources/transport/latest/9.2.json | 6 ++++++ 6 files changed, 18 insertions(+) create mode 100644 server/src/test/resources/transport/latest/9.2.json diff --git a/server/src/test/resources/transport/constant/test-0.json b/server/src/test/resources/transport/constant/test-0.json index 29d4935b8ceb0..1ad0c957a5555 100644 --- a/server/src/test/resources/transport/constant/test-0.json +++ b/server/src/test/resources/transport/constant/test-0.json @@ -1,5 +1,6 @@ { "name": "test-0", "ids": [ + 3001000 ] } diff --git a/server/src/test/resources/transport/constant/test-1.json b/server/src/test/resources/transport/constant/test-1.json index e687c9d9038e0..98313ed7b0d3c 100644 --- a/server/src/test/resources/transport/constant/test-1.json +++ b/server/src/test/resources/transport/constant/test-1.json @@ -1,5 +1,6 @@ { "name": "test-1", "ids": [ + 3002000 ] } diff --git a/server/src/test/resources/transport/constant/test-2.json b/server/src/test/resources/transport/constant/test-2.json index 73f920b5036e5..f443582e8fb2f 100644 --- a/server/src/test/resources/transport/constant/test-2.json +++ b/server/src/test/resources/transport/constant/test-2.json @@ -1,5 +1,8 @@ { "name": "test-2", "ids": [ + 3003000, + 2001001, + 1001001 ] } diff --git a/server/src/test/resources/transport/constant/test-3.json b/server/src/test/resources/transport/constant/test-3.json index 5cce8110e2de1..68e7c5d9c9635 100644 --- a/server/src/test/resources/transport/constant/test-3.json +++ b/server/src/test/resources/transport/constant/test-3.json @@ -1,5 +1,8 @@ { "name": "test-3", "ids": [ + 4001000, + 3003001, + 2001002 ] } diff --git a/server/src/test/resources/transport/constant/test-4.json b/server/src/test/resources/transport/constant/test-4.json index 109c94f953832..ffd4f7c43fe42 100644 --- a/server/src/test/resources/transport/constant/test-4.json +++ b/server/src/test/resources/transport/constant/test-4.json @@ -1,5 +1,9 @@ { "name": "test-4", "ids": [ + 4002000, + 3003001, + 2001003, + 1001002 ] } diff --git a/server/src/test/resources/transport/latest/9.2.json b/server/src/test/resources/transport/latest/9.2.json new file mode 100644 index 0000000000000..6eedd65bd9d7a --- /dev/null +++ b/server/src/test/resources/transport/latest/9.2.json @@ -0,0 +1,6 @@ +{ + "name": "test-4", + "ids": [ + 3003001 + ] +} From da5491cde6610650a177a87f348f1487314cb781 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 22 Jul 2025 14:58:15 -0700 Subject: [PATCH 15/25] update tests --- .../org/elasticsearch/TransportVersion.java | 16 +-- .../elasticsearch/TransportVersionTests.java | 108 ++++++++++++++++++ ...rsions-files-manifest.txt => manifest.txt} | 0 .../resources/transport/constant/test-0.json | 1 + .../resources/transport/constant/test-3.json | 2 +- .../resources/transport/constant/test-4.json | 2 +- .../test/resources/transport/latest/9.2.json | 2 +- 7 files changed, 114 insertions(+), 17 deletions(-) rename server/src/test/resources/transport/constant/{constant-transport-versions-files-manifest.txt => manifest.txt} (100%) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index d20e23bc9e2c6..f3cbdcbfba9ae 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -248,18 +248,6 @@ public String toReleaseVersion() { return VersionsHolder.VERSION_LOOKUP_BY_RELEASE.apply(id); } - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - TransportVersion that = (TransportVersion) o; - return id == that.id; - } - - @Override - public int hashCode() { - return id; - } - @Override public String toString() { return Integer.toString(id); @@ -329,11 +317,11 @@ private static Map loadTransportVersionsByName() { throw new UncheckedIOException("latest transport version file not found at [" + latestLocation + "]", ioe); } - String manifestLocation = "/transport/constant/constant-transport-versions-files-manifest.txt"; + String manifestLocation = "/transport/constant/manifest.txt"; List versionFileNames = null; if (latestId > -1) { try (InputStream inputStream = TransportVersion.class.getResourceAsStream(manifestLocation)) { - if (inputStream == null) { + if (inputStream != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); versionFileNames = reader.lines().filter(line -> line.isBlank() == false).toList(); } diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 0be0388ed044f..65588827835df 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -220,4 +220,112 @@ public void testDuplicateConstants() { previous = next; } } + + public void testFromName() { + assertThat(TransportVersion.fromName("test-0"), is(new TransportVersion("test-0", 3001000, null))); + assertThat(TransportVersion.fromName("test-1"), is(new TransportVersion("test-1", 3002000, null))); + assertThat( + TransportVersion.fromName("test-2"), + is( + new TransportVersion( + "test-2", + 3003000, + new TransportVersion("test-2", 2001001, new TransportVersion("test-2", 1001001, null)) + ) + ) + ); + assertThat( + TransportVersion.fromName("test-3"), + is(new TransportVersion("test-3", 3003001, new TransportVersion("test-3", 2001002, null))) + ); + assertThat( + TransportVersion.fromName("test-4"), + is( + new TransportVersion( + "test-4", + 3003002, + new TransportVersion("test-4", 2001003, new TransportVersion("test-4", 1001002, null)) + ) + ) + ); + } + + public void testSupports() { + TransportVersion test0 = TransportVersion.fromName("test-0"); + assertThat(new TransportVersion(null, 2003000, null).supports(test0), is(false)); + assertThat(new TransportVersion(null, 3001000, null).supports(test0), is(true)); + assertThat(new TransportVersion(null, 4001001, null).supports(test0), is(true)); + + TransportVersion test1 = TransportVersion.fromName("test-1"); + assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false)); + assertThat(new TransportVersion(null, 3001000, null).supports(test1), is(false)); + assertThat(new TransportVersion(null, 3001001, null).supports(test1), is(false)); + assertThat(new TransportVersion(null, 3002000, null).supports(test1), is(true)); + assertThat(new TransportVersion(null, 4001000, null).supports(test1), is(true)); + assertThat(new TransportVersion(null, 4001001, null).supports(test1), is(true)); + + TransportVersion test2 = TransportVersion.fromName("test-2"); + assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 1001001, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 1001002, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 1002000, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 1002001, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 2001000, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 2001001, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 2001002, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 2003000, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 2003001, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 3001000, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 3001001, null).supports(test2), is(false)); + assertThat(new TransportVersion(null, 3003000, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 3003001, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 3003002, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 3003003, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 4001000, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 4001001, null).supports(test2), is(true)); + + TransportVersion test3 = TransportVersion.fromName("test-3"); + assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 1001002, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 1001003, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 1002001, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 1002002, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 2001001, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 2001002, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 2001003, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 2003000, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 2003001, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 3001000, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 3001001, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 3003000, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 3003001, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 3003002, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 3003003, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 3004000, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 4001000, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 4001001, null).supports(test3), is(true)); + + TransportVersion test4 = TransportVersion.fromName("test-4"); + assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 1001002, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 1001003, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 1002001, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 1002002, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 1002003, null).supports(test3), is(false)); + assertThat(new TransportVersion(null, 2001002, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 2001003, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 2001004, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 2003000, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 2003001, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 3001000, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 3001001, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 3003000, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 3003001, null).supports(test4), is(false)); + assertThat(new TransportVersion(null, 3003002, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 3003003, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 3003004, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 3004000, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 4001000, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 4001001, null).supports(test4), is(true)); + } } diff --git a/server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt b/server/src/test/resources/transport/constant/manifest.txt similarity index 100% rename from server/src/test/resources/transport/constant/constant-transport-versions-files-manifest.txt rename to server/src/test/resources/transport/constant/manifest.txt diff --git a/server/src/test/resources/transport/constant/test-0.json b/server/src/test/resources/transport/constant/test-0.json index 1ad0c957a5555..e3b422bccb98f 100644 --- a/server/src/test/resources/transport/constant/test-0.json +++ b/server/src/test/resources/transport/constant/test-0.json @@ -1,6 +1,7 @@ { "name": "test-0", "ids": [ + 4001000, 3001000 ] } diff --git a/server/src/test/resources/transport/constant/test-3.json b/server/src/test/resources/transport/constant/test-3.json index 68e7c5d9c9635..799a66b5821f3 100644 --- a/server/src/test/resources/transport/constant/test-3.json +++ b/server/src/test/resources/transport/constant/test-3.json @@ -1,7 +1,7 @@ { "name": "test-3", "ids": [ - 4001000, + 4002000, 3003001, 2001002 ] diff --git a/server/src/test/resources/transport/constant/test-4.json b/server/src/test/resources/transport/constant/test-4.json index ffd4f7c43fe42..660c3e6e17b6b 100644 --- a/server/src/test/resources/transport/constant/test-4.json +++ b/server/src/test/resources/transport/constant/test-4.json @@ -2,7 +2,7 @@ "name": "test-4", "ids": [ 4002000, - 3003001, + 3003002, 2001003, 1001002 ] diff --git a/server/src/test/resources/transport/latest/9.2.json b/server/src/test/resources/transport/latest/9.2.json index 6eedd65bd9d7a..201a51cafc214 100644 --- a/server/src/test/resources/transport/latest/9.2.json +++ b/server/src/test/resources/transport/latest/9.2.json @@ -1,6 +1,6 @@ { "name": "test-4", "ids": [ - 3003001 + 3003002 ] } From 19b1923717e4ea08f5c45e4ae20c16ae6002930d Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 09:16:09 -0700 Subject: [PATCH 16/25] add java docs --- .../org/elasticsearch/TransportVersion.java | 74 ++++++++++++++++++- .../elasticsearch/TransportVersionTests.java | 14 ++-- .../transport/TransportHandshakerTests.java | 4 +- .../test/TransportVersionUtils.java | 2 +- .../embeddings/CohereEmbeddingTypeTests.java | 10 +-- 5 files changed, 88 insertions(+), 16 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index f3cbdcbfba9ae..b52875da0429c 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -40,6 +40,14 @@ /** * Represents the version of the wire protocol used to communicate between a pair of ES nodes. *

+ * Note: We are currently transitioning to a file-based system to load and maintain transport versions. These file-based transport + * versions are named and are referred to as named transport versions. Named transport versions also maintain a linked list of their + * own patch versions to simplify transport version compatibility checks. Transport versions that continue to be loaded through + * {@link TransportVersions} are referred to as unnamed transport versions. Unnamed transport versions will continue being used + * over the wire as we only need the id for compatibility checks even against named transport versions. There are changes + * throughout {@link TransportVersion} that are for this transition. For now, continue to use the existing system of adding unnamed + * transport versions to {@link TransportVersions}. + *

* Prior to 8.8.0, the release {@link Version} was used everywhere. This class separates the wire protocol version from the release version. *

* Each transport version constant has an id number, which for versions prior to 8.9.0 is the same as the release version for backwards @@ -71,6 +79,13 @@ */ public record TransportVersion(String name, int id, TransportVersion nextPatchVersion) implements VersionId { + /** + * Constructs an unnamed transport version. + */ + public TransportVersion(int id) { + this(null, id, null); + } + private static final ParseField NAME = new ParseField("name"); private static final ParseField IDS = new ParseField("ids"); @@ -98,6 +113,11 @@ public record TransportVersion(String name, int id, TransportVersion nextPatchVe PARSER.declareIntArray(ConstructingObjectParser.constructorArg(), IDS); } + /** + * Constructs a named transport version along with its set of compatible patch versions from x-content. + * This method takes in the parameter {@code latest} which is the highest valid transport version id + * supported by this node. Versions newer than the current transport version id for this node are discarded. + */ public static TransportVersion fromXContent(InputStream inputStream, Integer latest) { try (XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream)) { return PARSER.apply(parser, latest); @@ -122,9 +142,18 @@ public static TransportVersion fromId(int id) { return known; } // this is a version we don't otherwise know about - just create a placeholder - return new TransportVersion(null, id, null); + return new TransportVersion(id); } + /** + * Finds a {@link TransportVersion} by its name. The parameter {@code name} must be a {@link String} + * direct value or validation checks will fail. {@code TransportVersion.fromName("direct_value")}. + *

+ * This will only return the latest known named transport version for a given name and not its + * patch versions. Patch versions are constructed as a linked list internally and may be found by + * cycling through them in a loop using {@link TransportVersion#nextPatchVersion()}. + * + */ public static TransportVersion fromName(String name) { TransportVersion known = VersionsHolder.ALL_VERSIONS_BY_NAME.get(name); if (known == null) { @@ -226,6 +255,43 @@ public boolean isPatchFrom(TransportVersion version) { return onOrAfter(version) && id < version.id + 100 - (version.id % 100); } + /** + * Supports is used to determine if a named transport version is supported + * by a caller transport version. This will check both the latest id + * and all of its patch ids for compatibility. This replaces the pattern + * of {@code wireTV.onOrAfter(TV_FEATURE) || wireTV.isPatchFrom(TV_FEATURE_BACKPORT) || ...} + * for unnamed transport versions with {@code wireTV.supports(TV_FEATURE)} for named + * transport versions (since named versions know about their own patch versions). + *

+ * The recommended use of this method is to declare a static final {@link TransportVersion} + * as part of the file that it's used in. This constant is then used in conjunction with + * this method to check transport version compatability. + *

+ * An example: + * {@code + * public class ExampleClass { + * ... + * TransportVersion TV_FEATURE = TransportVersion.fromName("tv_feature"); + * ... + * public static ExampleClass readFrom(InputStream in) { + * ... + * if (in.getTransportVersion().supports(TV_FEATURE) { + * // read newer values + * } + * ... + * } + * ... + * public void writeTo(OutputStream out) { + * ... + * if (out.getTransportVersion().supports(TV_FEATURE) { + * // write newer values + * } + * ... + * } + * ... + * } + * } + */ public boolean supports(TransportVersion version) { if (onOrAfter(version)) { return true; @@ -253,6 +319,12 @@ public String toString() { return Integer.toString(id); } + /** + * This class holds various data structures for looking up known transport versions both + * named and unnamed. While we transition to named transport versions, this class will + * load and merge unnamed transport versions from {@link TransportVersions} along with + * named transport versions specified in a manifest file in resources. + */ private static class VersionsHolder { private static final List ALL_VERSIONS; diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 65588827835df..e4ecf248c9993 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -53,16 +53,16 @@ public void testVersionComparison() { } public static class CorrectFakeVersion { - public static final TransportVersion V_0_00_01 = new TransportVersion(null, 199, null); - public static final TransportVersion V_0_000_002 = new TransportVersion(null, 2, null); - public static final TransportVersion V_0_000_003 = new TransportVersion(null, 3, null); - public static final TransportVersion V_0_000_004 = new TransportVersion(null, 4, null); + public static final TransportVersion V_0_00_01 = new TransportVersion(199); + public static final TransportVersion V_0_000_002 = new TransportVersion(2); + public static final TransportVersion V_0_000_003 = new TransportVersion(3); + public static final TransportVersion V_0_000_004 = new TransportVersion(4); } public static class DuplicatedIdFakeVersion { - public static final TransportVersion V_0_000_001 = new TransportVersion(null, 1, null); - public static final TransportVersion V_0_000_002 = new TransportVersion(null, 2, null); - public static final TransportVersion V_0_000_003 = new TransportVersion(null, 2, null); + public static final TransportVersion V_0_000_001 = new TransportVersion(1); + public static final TransportVersion V_0_000_002 = new TransportVersion(2); + public static final TransportVersion V_0_000_003 = new TransportVersion(2); } public void testStaticTransportVersionChecks() { diff --git a/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java b/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java index bfb99a03abddd..fbbf2e92c89cd 100644 --- a/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java +++ b/server/src/test/java/org/elasticsearch/transport/TransportHandshakerTests.java @@ -258,11 +258,11 @@ public void testHandshakeResponseFromOlderNodeWithPatchedProtocol() throws Excep private static TransportVersion getRandomIncompatibleTransportVersion() { return randomBoolean() // either older than MINIMUM_COMPATIBLE - ? new TransportVersion(null, between(1, TransportVersions.MINIMUM_COMPATIBLE.id() - 1), null) + ? new TransportVersion(between(1, TransportVersions.MINIMUM_COMPATIBLE.id() - 1)) // or between MINIMUM_COMPATIBLE and current but not known : randomValueOtherThanMany( TransportVersion::isKnown, - () -> new TransportVersion(null, between(TransportVersions.MINIMUM_COMPATIBLE.id(), TransportVersion.current().id()), null) + () -> new TransportVersion(between(TransportVersions.MINIMUM_COMPATIBLE.id(), TransportVersion.current().id())) ); } diff --git a/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java b/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java index e96c3dd5d9a45..9c7114425b8db 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java +++ b/test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java @@ -103,7 +103,7 @@ public static TransportVersion getNextVersion(TransportVersion version, boolean if (higher == null) { if (createIfNecessary) { // create a new transport version one greater than specified - return new TransportVersion(null, version.id() + 1, null); + return new TransportVersion(version.id() + 1); } else { throw new IllegalArgumentException("couldn't find any released versions after [" + version + "]"); } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java index 183a5bae721bd..13e6cbdefe62a 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/cohere/embeddings/CohereEmbeddingTypeTests.java @@ -17,21 +17,21 @@ public class CohereEmbeddingTypeTests extends ESTestCase { public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingByte() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BYTE, new TransportVersion(null, 8_613_00_0, null)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BYTE, new TransportVersion(8_613_00_0)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingInt8() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.INT8, new TransportVersion(null, 8_613_00_0, null)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.INT8, new TransportVersion(8_613_00_0)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsFloat_WhenVersionIsBeforeByteEnumAddition_WhenSpecifyingFloat() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.FLOAT, new TransportVersion(null, 8_613_00_0, null)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.FLOAT, new TransportVersion(8_613_00_0)), is(CohereEmbeddingType.FLOAT) ); } @@ -52,14 +52,14 @@ public void testTranslateToVersion_ReturnsFloat_WhenVersionOnByteEnumAddition_Wh public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeBitEnumAdditionPatch_WhenSpecifyingBit() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(null, 8_840_0_00, null)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(8_840_0_00)), is(CohereEmbeddingType.INT8) ); } public void testTranslateToVersion_ReturnsInt8_WhenVersionIsBeforeBitEnumAddition_WhenSpecifyingBit() { assertThat( - CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(null, 9_000_0_00, null)), + CohereEmbeddingType.translateToVersion(CohereEmbeddingType.BIT, new TransportVersion(9_000_0_00)), is(CohereEmbeddingType.INT8) ); } From ac02157f7f5c9c045661bbffef77da0fd7255f70 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 10:19:48 -0700 Subject: [PATCH 17/25] move latest --- .../ec2/DiscoveryEc2RegularNetworkAddressesIT.java | 2 +- .../discovery/ec2/Ec2DiscoveryPlugin.java | 2 +- .../elasticsearch/discovery/ec2/Ec2NameResolver.java | 2 +- .../main/java/org/elasticsearch/TransportVersion.java | 2 ++ .../cluster/metadata/DesiredNodesMetadata.java | 2 +- server/src/main/resources/transport/latest/9.2.json | 6 ++++++ .../src/test/resources/transport/constant/test-4.json | 2 +- server/src/test/resources/transport/latest/9.2.json | 6 ------ .../main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java | 8 ++++---- .../java/fixture/aws/imds/Ec2ImdsServiceBuilder.java | 2 +- .../java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java | 10 +++++----- .../core/textstructure/structurefinder/FieldStats.java | 2 +- 12 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 server/src/main/resources/transport/latest/9.2.json delete mode 100644 server/src/test/resources/transport/latest/9.2.json diff --git a/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java b/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java index 491fa37a4c87d..757df298bf048 100644 --- a/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java +++ b/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java @@ -44,7 +44,7 @@ public void testImdsNotAvailable() throws IOException { final var bindTransportException = asInstanceOf(BindTransportException.class, executionException.getCause()); assertEquals("Failed to resolve publish address", bindTransportException.getMessage()); final var ioException = asInstanceOf(IOException.class, bindTransportException.getCause()); - assertThat(ioException.getMessage(), containsString("/latest/meta-data/local-ipv4")); + assertThat(ioException.getMessage(), containsString("/transport/latest/meta-data/local-ipv4")); } } } diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java index 5923ebbd83321..8c89b78bc2c46 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java @@ -95,7 +95,7 @@ public Settings additionalSettings() { return getAvailabilityZoneNodeAttributes(settings); } - private static final String IMDS_AVAILABILITY_ZONE_PATH = "/latest/meta-data/placement/availability-zone"; + private static final String IMDS_AVAILABILITY_ZONE_PATH = "/transport/latest/meta-data/placement/availability-zone"; // pkg private for testing static Settings getAvailabilityZoneNodeAttributes(Settings settings) { diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java index b7deda32a9fc2..c767ddcf4d83d 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java @@ -57,7 +57,7 @@ public InetAddress[] resolveDefault() { return null; // using this, one has to explicitly specify _ec2_ in network setting } - private static final String IMDS_ADDRESS_PATH_PREFIX = "/latest/meta-data/"; + private static final String IMDS_ADDRESS_PATH_PREFIX = "/transport/latest/meta-data/"; @Override public InetAddress[] resolveIfPossible(String value) throws IOException { diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index b52875da0429c..8062ca3a09168 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -314,6 +314,8 @@ public String toReleaseVersion() { return VersionsHolder.VERSION_LOOKUP_BY_RELEASE.apply(id); } + + @Override public String toString() { return Integer.toString(id); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java index 03f8d5869e2cb..f8d7da55a3b45 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java @@ -34,7 +34,7 @@ public class DesiredNodesMetadata extends AbstractNamedDiffable PARSER = new ConstructingObjectParser<>( diff --git a/server/src/main/resources/transport/latest/9.2.json b/server/src/main/resources/transport/latest/9.2.json new file mode 100644 index 0000000000000..7edafc23f118d --- /dev/null +++ b/server/src/main/resources/transport/latest/9.2.json @@ -0,0 +1,6 @@ +{ + "name": "placeholder", + "ids": [ + + ] +} diff --git a/server/src/test/resources/transport/constant/test-4.json b/server/src/test/resources/transport/constant/test-4.json index 660c3e6e17b6b..570f63e879f6f 100644 --- a/server/src/test/resources/transport/constant/test-4.json +++ b/server/src/test/resources/transport/constant/test-4.json @@ -1,7 +1,7 @@ { "name": "test-4", "ids": [ - 4002000, + 100002000, 3003002, 2001003, 1001002 diff --git a/server/src/test/resources/transport/latest/9.2.json b/server/src/test/resources/transport/latest/9.2.json deleted file mode 100644 index 201a51cafc214..0000000000000 --- a/server/src/test/resources/transport/latest/9.2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "test-4", - "ids": [ - 3003002 - ] -} diff --git a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java index 826f98bead497..4724bc208a0d4 100644 --- a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java +++ b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java @@ -41,7 +41,7 @@ @SuppressForbidden(reason = "this test uses a HttpServer to emulate the EC2 IMDS endpoint") public class Ec2ImdsHttpHandler implements HttpHandler { - private static final String IMDS_SECURITY_CREDENTIALS_PATH = "/latest/meta-data/iam/security-credentials/"; + private static final String IMDS_SECURITY_CREDENTIALS_PATH = "/transport/latest/meta-data/iam/security-credentials/"; private final Ec2ImdsVersion ec2ImdsVersion; private final Set validImdsTokens = ConcurrentCollections.newConcurrentSet(); @@ -90,7 +90,7 @@ public void handle(final HttpExchange exchange) throws IOException { final var path = exchange.getRequestURI().getPath(); final var requestMethod = exchange.getRequestMethod(); - if ("PUT".equals(requestMethod) && "/latest/api/token".equals(path)) { + if ("PUT".equals(requestMethod) && "/transport/latest/api/token".equals(path)) { switch (ec2ImdsVersion) { case V1 -> exchange.sendResponseHeaders(RestStatus.METHOD_NOT_ALLOWED.getStatus(), -1); case V2 -> { @@ -125,11 +125,11 @@ public void handle(final HttpExchange exchange) throws IOException { validCredentialsEndpoints.add(IMDS_SECURITY_CREDENTIALS_PATH + profileName); sendStringResponse(exchange, profileName); return; - } else if (path.equals("/latest/meta-data/placement/availability-zone")) { + } else if (path.equals("/transport/latest/meta-data/placement/availability-zone")) { final var availabilityZone = availabilityZoneSupplier.get(); sendStringResponse(exchange, availabilityZone); return; - } else if (instanceIdentityDocument != null && path.equals("/latest/dynamic/instance-identity/document")) { + } else if (instanceIdentityDocument != null && path.equals("/transport/latest/dynamic/instance-identity/document")) { sendStringResponse(exchange, Strings.toString(instanceIdentityDocument)); return; } else if (validCredentialsEndpoints.contains(path)) { diff --git a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java index d70ee723942ec..06378c2702491 100644 --- a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java +++ b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java @@ -56,7 +56,7 @@ public Ec2ImdsServiceBuilder availabilityZoneSupplier(Supplier availabil } public Ec2ImdsServiceBuilder addInstanceAddress(String addressType, String addressValue) { - instanceAddresses.put("/latest/meta-data/" + addressType, addressValue); + instanceAddresses.put("/transport/latest/meta-data/" + addressType, addressValue); return this; } diff --git a/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java b/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java index 0c0d02b32d4a5..33306b15fe13f 100644 --- a/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java +++ b/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java @@ -39,7 +39,7 @@ public class Ec2ImdsHttpHandlerTests extends ESTestCase { - private static final String SECURITY_CREDENTIALS_URI = "/latest/meta-data/iam/security-credentials/"; + private static final String SECURITY_CREDENTIALS_URI = "/transport/latest/meta-data/iam/security-credentials/"; public void testImdsV1() throws IOException { final Map generatedCredentials = new HashMap<>(); @@ -64,7 +64,7 @@ public void testImdsV1() throws IOException { public void testImdsV2Disabled() { assertEquals( RestStatus.METHOD_NOT_ALLOWED, - handleRequest(new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V1).buildHandler(), "PUT", "/latest/api/token").status() + handleRequest(new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V1).buildHandler(), "PUT", "/transport/latest/api/token").status() ); } @@ -73,7 +73,7 @@ public void testImdsV2() throws IOException { final var handler = new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V2).newCredentialsConsumer(generatedCredentials::put).buildHandler(); - final var tokenResponse = handleRequest(handler, "PUT", "/latest/api/token"); + final var tokenResponse = handleRequest(handler, "PUT", "/transport/latest/api/token"); assertEquals(RestStatus.OK, tokenResponse.status()); assertEquals(List.of("86400" /* seconds in a day */), tokenResponse.responseHeaders().get("x-aws-ec2-metadata-token-ttl-seconds")); final var token = tokenResponse.body().utf8ToString(); @@ -101,7 +101,7 @@ public void testAvailabilityZone() { return newAvailabilityZone; }).buildHandler(); - final var availabilityZoneResponse = handleRequest(handler, "GET", "/latest/meta-data/placement/availability-zone"); + final var availabilityZoneResponse = handleRequest(handler, "GET", "/transport/latest/meta-data/placement/availability-zone"); assertEquals(RestStatus.OK, availabilityZoneResponse.status()); final var availabilityZone = availabilityZoneResponse.body().utf8ToString(); @@ -148,7 +148,7 @@ public void testInstanceIdentityDocument() { return builder.field("region", newRegion); }).buildHandler(); - final var instanceIdentityResponse = handleRequest(handler, "GET", "/latest/dynamic/instance-identity/document"); + final var instanceIdentityResponse = handleRequest(handler, "GET", "/transport/latest/dynamic/instance-identity/document"); assertEquals(RestStatus.OK, instanceIdentityResponse.status()); final var instanceIdentityString = instanceIdentityResponse.body().utf8ToString(); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java index 90e59b525e423..cbc348d2a361d 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java @@ -30,7 +30,7 @@ public class FieldStats implements ToXContentObject, Writeable { static final ParseField MEAN_VALUE = new ParseField("mean_value"); static final ParseField MEDIAN_VALUE = new ParseField("median_value"); static final ParseField EARLIEST = new ParseField("earliest"); - static final ParseField LATEST = new ParseField("latest"); + static final ParseField LATEST = new ParseField("transport/latest"); static final ParseField TOP_HITS = new ParseField("top_hits"); @SuppressWarnings("unchecked") From 6f4dd0d42ec27a277c96d55a71a0aaa66a0c5f47 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 10:24:25 -0700 Subject: [PATCH 18/25] move latest --- .../main/resources/transport/latest/9.2.json | 2 +- .../elasticsearch/TransportVersionTests.java | 18 +++++++++--------- .../resources/transport/constant/test-0.json | 2 +- .../resources/transport/constant/test-3.json | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/server/src/main/resources/transport/latest/9.2.json b/server/src/main/resources/transport/latest/9.2.json index 7edafc23f118d..294316e134e40 100644 --- a/server/src/main/resources/transport/latest/9.2.json +++ b/server/src/main/resources/transport/latest/9.2.json @@ -1,6 +1,6 @@ { "name": "placeholder", "ids": [ - + 9130000 ] } diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index e4ecf248c9993..37bdfe9b27b63 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -254,15 +254,15 @@ public void testSupports() { TransportVersion test0 = TransportVersion.fromName("test-0"); assertThat(new TransportVersion(null, 2003000, null).supports(test0), is(false)); assertThat(new TransportVersion(null, 3001000, null).supports(test0), is(true)); - assertThat(new TransportVersion(null, 4001001, null).supports(test0), is(true)); + assertThat(new TransportVersion(null, 100001001, null).supports(test0), is(true)); TransportVersion test1 = TransportVersion.fromName("test-1"); assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3001000, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3001001, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3002000, null).supports(test1), is(true)); - assertThat(new TransportVersion(null, 4001000, null).supports(test1), is(true)); - assertThat(new TransportVersion(null, 4001001, null).supports(test1), is(true)); + assertThat(new TransportVersion(null, 100001000, null).supports(test1), is(true)); + assertThat(new TransportVersion(null, 100001001, null).supports(test1), is(true)); TransportVersion test2 = TransportVersion.fromName("test-2"); assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false)); @@ -281,8 +281,8 @@ public void testSupports() { assertThat(new TransportVersion(null, 3003001, null).supports(test2), is(true)); assertThat(new TransportVersion(null, 3003002, null).supports(test2), is(true)); assertThat(new TransportVersion(null, 3003003, null).supports(test2), is(true)); - assertThat(new TransportVersion(null, 4001000, null).supports(test2), is(true)); - assertThat(new TransportVersion(null, 4001001, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 100001000, null).supports(test2), is(true)); + assertThat(new TransportVersion(null, 100001001, null).supports(test2), is(true)); TransportVersion test3 = TransportVersion.fromName("test-3"); assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false)); @@ -302,8 +302,8 @@ public void testSupports() { assertThat(new TransportVersion(null, 3003002, null).supports(test3), is(true)); assertThat(new TransportVersion(null, 3003003, null).supports(test3), is(true)); assertThat(new TransportVersion(null, 3004000, null).supports(test3), is(true)); - assertThat(new TransportVersion(null, 4001000, null).supports(test3), is(true)); - assertThat(new TransportVersion(null, 4001001, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 100001000, null).supports(test3), is(true)); + assertThat(new TransportVersion(null, 100001001, null).supports(test3), is(true)); TransportVersion test4 = TransportVersion.fromName("test-4"); assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false)); @@ -325,7 +325,7 @@ public void testSupports() { assertThat(new TransportVersion(null, 3003003, null).supports(test4), is(true)); assertThat(new TransportVersion(null, 3003004, null).supports(test4), is(true)); assertThat(new TransportVersion(null, 3004000, null).supports(test4), is(true)); - assertThat(new TransportVersion(null, 4001000, null).supports(test4), is(true)); - assertThat(new TransportVersion(null, 4001001, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 100001000, null).supports(test4), is(true)); + assertThat(new TransportVersion(null, 100001001, null).supports(test4), is(true)); } } diff --git a/server/src/test/resources/transport/constant/test-0.json b/server/src/test/resources/transport/constant/test-0.json index e3b422bccb98f..a85f62b22a404 100644 --- a/server/src/test/resources/transport/constant/test-0.json +++ b/server/src/test/resources/transport/constant/test-0.json @@ -1,7 +1,7 @@ { "name": "test-0", "ids": [ - 4001000, + 100001000, 3001000 ] } diff --git a/server/src/test/resources/transport/constant/test-3.json b/server/src/test/resources/transport/constant/test-3.json index 799a66b5821f3..b2e24c7b69266 100644 --- a/server/src/test/resources/transport/constant/test-3.json +++ b/server/src/test/resources/transport/constant/test-3.json @@ -1,7 +1,7 @@ { "name": "test-3", "ids": [ - 4002000, + 100002000, 3003001, 2001002 ] From 38d57108fb4e77132511df9f7b67df5faf451254 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 10:31:54 -0700 Subject: [PATCH 19/25] more pr responses --- .../java/org/elasticsearch/TransportVersion.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 8062ca3a09168..02b47f63f729d 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.ServiceLoader; import java.util.function.Function; import java.util.function.IntFunction; @@ -314,7 +315,17 @@ public String toReleaseVersion() { return VersionsHolder.VERSION_LOOKUP_BY_RELEASE.apply(id); } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + TransportVersion that = (TransportVersion) o; + return id == that.id; + } + @Override + public int hashCode() { + return Objects.hashCode(id); + } @Override public String toString() { @@ -342,6 +353,7 @@ private static class VersionsHolder { addTransportVersions(allVersionsByName.values(), allVersions).sort(TransportVersion::compareTo); // set version lookup by release before adding serverless versions + // serverless versions should not affect release version VERSION_LOOKUP_BY_RELEASE = ReleaseVersions.generateVersionsLookup( TransportVersions.class, allVersions.get(allVersions.size() - 1).id() @@ -378,7 +390,7 @@ private static Map loadTransportVersionsByName() { TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); if (latest == null) { throw new IllegalStateException( - "invalid latest transport version for release version [" + "invalid latest transport version for minor version [" + Version.CURRENT.major + "." + Version.CURRENT.minor From eb0a94fd16f2d86b1975f9a66b950ecc6dd2b2f3 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 11:25:51 -0700 Subject: [PATCH 20/25] fix ij refactoring --- .../ec2/DiscoveryEc2RegularNetworkAddressesIT.java | 2 +- .../discovery/ec2/Ec2DiscoveryPlugin.java | 2 +- .../elasticsearch/discovery/ec2/Ec2NameResolver.java | 2 +- .../main/java/org/elasticsearch/TransportVersions.java | 2 +- .../main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java | 8 ++++---- .../java/fixture/aws/imds/Ec2ImdsServiceBuilder.java | 2 +- .../java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java | 10 +++++----- .../core/textstructure/structurefinder/FieldStats.java | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java b/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java index 757df298bf048..491fa37a4c87d 100644 --- a/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java +++ b/plugins/discovery-ec2/src/internalClusterTest/java/org/elasticsearch/discovery/ec2/DiscoveryEc2RegularNetworkAddressesIT.java @@ -44,7 +44,7 @@ public void testImdsNotAvailable() throws IOException { final var bindTransportException = asInstanceOf(BindTransportException.class, executionException.getCause()); assertEquals("Failed to resolve publish address", bindTransportException.getMessage()); final var ioException = asInstanceOf(IOException.class, bindTransportException.getCause()); - assertThat(ioException.getMessage(), containsString("/transport/latest/meta-data/local-ipv4")); + assertThat(ioException.getMessage(), containsString("/latest/meta-data/local-ipv4")); } } } diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java index 8c89b78bc2c46..5923ebbd83321 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2DiscoveryPlugin.java @@ -95,7 +95,7 @@ public Settings additionalSettings() { return getAvailabilityZoneNodeAttributes(settings); } - private static final String IMDS_AVAILABILITY_ZONE_PATH = "/transport/latest/meta-data/placement/availability-zone"; + private static final String IMDS_AVAILABILITY_ZONE_PATH = "/latest/meta-data/placement/availability-zone"; // pkg private for testing static Settings getAvailabilityZoneNodeAttributes(Settings settings) { diff --git a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java index c767ddcf4d83d..b7deda32a9fc2 100644 --- a/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java +++ b/plugins/discovery-ec2/src/main/java/org/elasticsearch/discovery/ec2/Ec2NameResolver.java @@ -57,7 +57,7 @@ public InetAddress[] resolveDefault() { return null; // using this, one has to explicitly specify _ec2_ in network setting } - private static final String IMDS_ADDRESS_PATH_PREFIX = "/transport/latest/meta-data/"; + private static final String IMDS_ADDRESS_PATH_PREFIX = "/latest/meta-data/"; @Override public InetAddress[] resolveIfPossible(String value) throws IOException { diff --git a/server/src/main/java/org/elasticsearch/TransportVersions.java b/server/src/main/java/org/elasticsearch/TransportVersions.java index c1dbf5cb04bc2..dad300ae72744 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersions.java +++ b/server/src/main/java/org/elasticsearch/TransportVersions.java @@ -44,7 +44,7 @@ static TransportVersion def(int id) { if (id < IDS.last()) { throw new IllegalArgumentException("Version id " + id + " is not defined in the right location. Keep constants sorted"); } - return new TransportVersion(null, id, null); + return new TransportVersion(id); } // TODO: ES-10337 we can remove all transport versions earlier than 8.18 diff --git a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java index 4724bc208a0d4..826f98bead497 100644 --- a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java +++ b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsHttpHandler.java @@ -41,7 +41,7 @@ @SuppressForbidden(reason = "this test uses a HttpServer to emulate the EC2 IMDS endpoint") public class Ec2ImdsHttpHandler implements HttpHandler { - private static final String IMDS_SECURITY_CREDENTIALS_PATH = "/transport/latest/meta-data/iam/security-credentials/"; + private static final String IMDS_SECURITY_CREDENTIALS_PATH = "/latest/meta-data/iam/security-credentials/"; private final Ec2ImdsVersion ec2ImdsVersion; private final Set validImdsTokens = ConcurrentCollections.newConcurrentSet(); @@ -90,7 +90,7 @@ public void handle(final HttpExchange exchange) throws IOException { final var path = exchange.getRequestURI().getPath(); final var requestMethod = exchange.getRequestMethod(); - if ("PUT".equals(requestMethod) && "/transport/latest/api/token".equals(path)) { + if ("PUT".equals(requestMethod) && "/latest/api/token".equals(path)) { switch (ec2ImdsVersion) { case V1 -> exchange.sendResponseHeaders(RestStatus.METHOD_NOT_ALLOWED.getStatus(), -1); case V2 -> { @@ -125,11 +125,11 @@ public void handle(final HttpExchange exchange) throws IOException { validCredentialsEndpoints.add(IMDS_SECURITY_CREDENTIALS_PATH + profileName); sendStringResponse(exchange, profileName); return; - } else if (path.equals("/transport/latest/meta-data/placement/availability-zone")) { + } else if (path.equals("/latest/meta-data/placement/availability-zone")) { final var availabilityZone = availabilityZoneSupplier.get(); sendStringResponse(exchange, availabilityZone); return; - } else if (instanceIdentityDocument != null && path.equals("/transport/latest/dynamic/instance-identity/document")) { + } else if (instanceIdentityDocument != null && path.equals("/latest/dynamic/instance-identity/document")) { sendStringResponse(exchange, Strings.toString(instanceIdentityDocument)); return; } else if (validCredentialsEndpoints.contains(path)) { diff --git a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java index 06378c2702491..d70ee723942ec 100644 --- a/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java +++ b/test/fixtures/ec2-imds-fixture/src/main/java/fixture/aws/imds/Ec2ImdsServiceBuilder.java @@ -56,7 +56,7 @@ public Ec2ImdsServiceBuilder availabilityZoneSupplier(Supplier availabil } public Ec2ImdsServiceBuilder addInstanceAddress(String addressType, String addressValue) { - instanceAddresses.put("/transport/latest/meta-data/" + addressType, addressValue); + instanceAddresses.put("/latest/meta-data/" + addressType, addressValue); return this; } diff --git a/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java b/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java index 33306b15fe13f..0c0d02b32d4a5 100644 --- a/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java +++ b/test/fixtures/ec2-imds-fixture/src/test/java/fixture/aws/imds/Ec2ImdsHttpHandlerTests.java @@ -39,7 +39,7 @@ public class Ec2ImdsHttpHandlerTests extends ESTestCase { - private static final String SECURITY_CREDENTIALS_URI = "/transport/latest/meta-data/iam/security-credentials/"; + private static final String SECURITY_CREDENTIALS_URI = "/latest/meta-data/iam/security-credentials/"; public void testImdsV1() throws IOException { final Map generatedCredentials = new HashMap<>(); @@ -64,7 +64,7 @@ public void testImdsV1() throws IOException { public void testImdsV2Disabled() { assertEquals( RestStatus.METHOD_NOT_ALLOWED, - handleRequest(new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V1).buildHandler(), "PUT", "/transport/latest/api/token").status() + handleRequest(new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V1).buildHandler(), "PUT", "/latest/api/token").status() ); } @@ -73,7 +73,7 @@ public void testImdsV2() throws IOException { final var handler = new Ec2ImdsServiceBuilder(Ec2ImdsVersion.V2).newCredentialsConsumer(generatedCredentials::put).buildHandler(); - final var tokenResponse = handleRequest(handler, "PUT", "/transport/latest/api/token"); + final var tokenResponse = handleRequest(handler, "PUT", "/latest/api/token"); assertEquals(RestStatus.OK, tokenResponse.status()); assertEquals(List.of("86400" /* seconds in a day */), tokenResponse.responseHeaders().get("x-aws-ec2-metadata-token-ttl-seconds")); final var token = tokenResponse.body().utf8ToString(); @@ -101,7 +101,7 @@ public void testAvailabilityZone() { return newAvailabilityZone; }).buildHandler(); - final var availabilityZoneResponse = handleRequest(handler, "GET", "/transport/latest/meta-data/placement/availability-zone"); + final var availabilityZoneResponse = handleRequest(handler, "GET", "/latest/meta-data/placement/availability-zone"); assertEquals(RestStatus.OK, availabilityZoneResponse.status()); final var availabilityZone = availabilityZoneResponse.body().utf8ToString(); @@ -148,7 +148,7 @@ public void testInstanceIdentityDocument() { return builder.field("region", newRegion); }).buildHandler(); - final var instanceIdentityResponse = handleRequest(handler, "GET", "/transport/latest/dynamic/instance-identity/document"); + final var instanceIdentityResponse = handleRequest(handler, "GET", "/latest/dynamic/instance-identity/document"); assertEquals(RestStatus.OK, instanceIdentityResponse.status()); final var instanceIdentityString = instanceIdentityResponse.body().utf8ToString(); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java index cbc348d2a361d..90e59b525e423 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/textstructure/structurefinder/FieldStats.java @@ -30,7 +30,7 @@ public class FieldStats implements ToXContentObject, Writeable { static final ParseField MEAN_VALUE = new ParseField("mean_value"); static final ParseField MEDIAN_VALUE = new ParseField("median_value"); static final ParseField EARLIEST = new ParseField("earliest"); - static final ParseField LATEST = new ParseField("transport/latest"); + static final ParseField LATEST = new ParseField("latest"); static final ParseField TOP_HITS = new ParseField("top_hits"); @SuppressWarnings("unchecked") From 518ed4be42fef4fc1736b88ab0b5c122d272a208 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 11:26:35 -0700 Subject: [PATCH 21/25] more fixed files --- .../elasticsearch/cluster/metadata/DesiredNodesMetadata.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java index f8d7da55a3b45..03f8d5869e2cb 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java @@ -34,7 +34,7 @@ public class DesiredNodesMetadata extends AbstractNamedDiffable PARSER = new ConstructingObjectParser<>( From 14e25392af57a1344b18f6caa1acacc5585f9100 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 11:41:11 -0700 Subject: [PATCH 22/25] add latest placeholder files for backport versions --- server/src/main/resources/transport/latest/8.18.json | 6 ++++++ server/src/main/resources/transport/latest/8.19.json | 6 ++++++ server/src/main/resources/transport/latest/9.0.json | 6 ++++++ server/src/main/resources/transport/latest/9.1.json | 6 ++++++ 4 files changed, 24 insertions(+) create mode 100644 server/src/main/resources/transport/latest/8.18.json create mode 100644 server/src/main/resources/transport/latest/8.19.json create mode 100644 server/src/main/resources/transport/latest/9.0.json create mode 100644 server/src/main/resources/transport/latest/9.1.json diff --git a/server/src/main/resources/transport/latest/8.18.json b/server/src/main/resources/transport/latest/8.18.json new file mode 100644 index 0000000000000..3b4dc9532c0da --- /dev/null +++ b/server/src/main/resources/transport/latest/8.18.json @@ -0,0 +1,6 @@ +{ + "name": "placeholder", + "ids": [ + 8840007 + ] +} diff --git a/server/src/main/resources/transport/latest/8.19.json b/server/src/main/resources/transport/latest/8.19.json new file mode 100644 index 0000000000000..3d662bdd294e9 --- /dev/null +++ b/server/src/main/resources/transport/latest/8.19.json @@ -0,0 +1,6 @@ +{ + "name": "placeholder", + "ids": [ + 8841064 + ] +} diff --git a/server/src/main/resources/transport/latest/9.0.json b/server/src/main/resources/transport/latest/9.0.json new file mode 100644 index 0000000000000..08951c2bf3af1 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.0.json @@ -0,0 +1,6 @@ +{ + "name": "placeholder", + "ids": [ + 9000014 + ] +} diff --git a/server/src/main/resources/transport/latest/9.1.json b/server/src/main/resources/transport/latest/9.1.json new file mode 100644 index 0000000000000..01de94884b6f3 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.1.json @@ -0,0 +1,6 @@ +{ + "name": "placeholder", + "ids": [ + 9112003 + ] +} From 18d2206144234509a41a7cfd57c4923aa806c5aa Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 15:13:12 -0700 Subject: [PATCH 23/25] switch to loading versions with txt files instead of json --- .../org/elasticsearch/TransportVersion.java | 68 +++++++++---------- .../main/resources/transport/latest/8.18.json | 6 -- .../main/resources/transport/latest/8.18.txt | 1 + .../main/resources/transport/latest/8.19.json | 6 -- .../main/resources/transport/latest/8.19.txt | 1 + .../main/resources/transport/latest/9.0.json | 6 -- .../main/resources/transport/latest/9.0.txt | 1 + .../main/resources/transport/latest/9.1.json | 6 -- .../main/resources/transport/latest/9.1.txt | 1 + .../main/resources/transport/latest/9.2.json | 6 -- .../main/resources/transport/latest/9.2.txt | 1 + .../elasticsearch/TransportVersionTests.java | 30 ++++---- .../resources/transport/constant/manifest.txt | 10 +-- .../resources/transport/constant/test-0.json | 7 -- .../resources/transport/constant/test-1.json | 6 -- .../resources/transport/constant/test-2.json | 8 --- .../resources/transport/constant/test-3.json | 8 --- .../resources/transport/constant/test-4.json | 9 --- .../resources/transport/constant/test_0.txt | 1 + .../resources/transport/constant/test_1.txt | 2 + .../resources/transport/constant/test_2.txt | 1 + .../resources/transport/constant/test_3.txt | 1 + .../resources/transport/constant/test_4.txt | 1 + 23 files changed, 63 insertions(+), 124 deletions(-) delete mode 100644 server/src/main/resources/transport/latest/8.18.json create mode 100644 server/src/main/resources/transport/latest/8.18.txt delete mode 100644 server/src/main/resources/transport/latest/8.19.json create mode 100644 server/src/main/resources/transport/latest/8.19.txt delete mode 100644 server/src/main/resources/transport/latest/9.0.json create mode 100644 server/src/main/resources/transport/latest/9.0.txt delete mode 100644 server/src/main/resources/transport/latest/9.1.json create mode 100644 server/src/main/resources/transport/latest/9.1.txt delete mode 100644 server/src/main/resources/transport/latest/9.2.json create mode 100644 server/src/main/resources/transport/latest/9.2.txt delete mode 100644 server/src/test/resources/transport/constant/test-0.json delete mode 100644 server/src/test/resources/transport/constant/test-1.json delete mode 100644 server/src/test/resources/transport/constant/test-2.json delete mode 100644 server/src/test/resources/transport/constant/test-3.json delete mode 100644 server/src/test/resources/transport/constant/test-4.json create mode 100644 server/src/test/resources/transport/constant/test_0.txt create mode 100644 server/src/test/resources/transport/constant/test_1.txt create mode 100644 server/src/test/resources/transport/constant/test_2.txt create mode 100644 server/src/test/resources/transport/constant/test_3.txt create mode 100644 server/src/test/resources/transport/constant/test_4.txt diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 02b47f63f729d..0e73a3a1f061d 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -14,11 +14,6 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.internal.VersionExtension; import org.elasticsearch.plugins.ExtensionLoader; -import org.elasticsearch.xcontent.ConstructingObjectParser; -import org.elasticsearch.xcontent.ParseField; -import org.elasticsearch.xcontent.XContentParser; -import org.elasticsearch.xcontent.XContentParserConfiguration; -import org.elasticsearch.xcontent.json.JsonXContent; import java.io.BufferedReader; import java.io.IOException; @@ -87,43 +82,44 @@ public TransportVersion(int id) { this(null, id, null); } - private static final ParseField NAME = new ParseField("name"); - private static final ParseField IDS = new ParseField("ids"); - - private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>( - TransportVersion.class.getCanonicalName(), - false, - (args, latestTransportId) -> { - String name = (String) args[0]; - @SuppressWarnings("unchecked") - List ids = (List) args[1]; + /** + * Constructs a named transport version along with its set of compatible patch versions from x-content. + * This method takes in the parameter {@code latest} which is the highest valid transport version id + * supported by this node. Versions newer than the current transport version id for this node are discarded. + */ + public static TransportVersion fromInputStream(String path, InputStream stream, Integer latest) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { + String line = reader.readLine(); + String[] parts = line.replaceAll("\\s+","").split("\\|"); + String check; + while ((check = reader.readLine()) != null) { + if (check.replaceAll("\\s+","").isEmpty() == false) { + throw new IllegalArgumentException("invalid transport version file format [" + path + "]"); + } + } + if (parts.length < 2) { + throw new IllegalStateException("invalid transport version file format [" + path + "]"); + } + String name = parts[0]; + List ids = new ArrayList<>(); + for (int i = 1; i < parts.length; ++i) { + try { + ids.add(Integer.parseInt(parts[i])); + } catch (NumberFormatException nfe) { + throw new IllegalStateException("invalid transport version file format [" + path + "]", nfe); + } + } ids.sort(Integer::compareTo); TransportVersion transportVersion = null; for (int idIndex = 0; idIndex < ids.size(); ++idIndex) { - if (ids.get(idIndex) > latestTransportId) { + if (ids.get(idIndex) > latest) { break; } transportVersion = new TransportVersion(name, ids.get(idIndex), transportVersion); } return transportVersion; - } - ); - - static { - PARSER.declareString(ConstructingObjectParser.constructorArg(), NAME); - PARSER.declareIntArray(ConstructingObjectParser.constructorArg(), IDS); - } - - /** - * Constructs a named transport version along with its set of compatible patch versions from x-content. - * This method takes in the parameter {@code latest} which is the highest valid transport version id - * supported by this node. Versions newer than the current transport version id for this node are discarded. - */ - public static TransportVersion fromXContent(InputStream inputStream, Integer latest) { - try (XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream)) { - return PARSER.apply(parser, latest); } catch (IOException ioe) { - throw new UncheckedIOException(ioe); + throw new UncheckedIOException("cannot parse transport version [" + path + "]", ioe); } } @@ -380,14 +376,14 @@ private static class VersionsHolder { private static Map loadTransportVersionsByName() { Map transportVersions = new HashMap<>(); - String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".json"; + String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".txt"; int latestId = -1; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { // this check is required until bootstrapping for the new transport versions format is completed; // when load is false, we will only use the transport versions in the legacy format; // load becomes false if we don't find the latest or manifest files required for the new format if (inputStream != null) { - TransportVersion latest = fromXContent(inputStream, Integer.MAX_VALUE); + TransportVersion latest = fromInputStream(latestLocation, inputStream, Integer.MAX_VALUE); if (latest == null) { throw new IllegalStateException( "invalid latest transport version for minor version [" @@ -423,7 +419,7 @@ private static Map loadTransportVersionsByName() { if (inputStream == null) { throw new IllegalStateException("transport version file not found at [" + versionLocation + "]"); } - TransportVersion transportVersion = TransportVersion.fromXContent(inputStream, latestId); + TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, inputStream, latestId); if (transportVersion != null) { transportVersions.put(transportVersion.name(), transportVersion); } diff --git a/server/src/main/resources/transport/latest/8.18.json b/server/src/main/resources/transport/latest/8.18.json deleted file mode 100644 index 3b4dc9532c0da..0000000000000 --- a/server/src/main/resources/transport/latest/8.18.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "placeholder", - "ids": [ - 8840007 - ] -} diff --git a/server/src/main/resources/transport/latest/8.18.txt b/server/src/main/resources/transport/latest/8.18.txt new file mode 100644 index 0000000000000..14de3d57f1599 --- /dev/null +++ b/server/src/main/resources/transport/latest/8.18.txt @@ -0,0 +1 @@ +placeholder|8840007 diff --git a/server/src/main/resources/transport/latest/8.19.json b/server/src/main/resources/transport/latest/8.19.json deleted file mode 100644 index 3d662bdd294e9..0000000000000 --- a/server/src/main/resources/transport/latest/8.19.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "placeholder", - "ids": [ - 8841064 - ] -} diff --git a/server/src/main/resources/transport/latest/8.19.txt b/server/src/main/resources/transport/latest/8.19.txt new file mode 100644 index 0000000000000..399f403320a54 --- /dev/null +++ b/server/src/main/resources/transport/latest/8.19.txt @@ -0,0 +1 @@ +placeholder|8841064 diff --git a/server/src/main/resources/transport/latest/9.0.json b/server/src/main/resources/transport/latest/9.0.json deleted file mode 100644 index 08951c2bf3af1..0000000000000 --- a/server/src/main/resources/transport/latest/9.0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "placeholder", - "ids": [ - 9000014 - ] -} diff --git a/server/src/main/resources/transport/latest/9.0.txt b/server/src/main/resources/transport/latest/9.0.txt new file mode 100644 index 0000000000000..8f93c3951e984 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.0.txt @@ -0,0 +1 @@ +placeholder|9000014 diff --git a/server/src/main/resources/transport/latest/9.1.json b/server/src/main/resources/transport/latest/9.1.json deleted file mode 100644 index 01de94884b6f3..0000000000000 --- a/server/src/main/resources/transport/latest/9.1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "placeholder", - "ids": [ - 9112003 - ] -} diff --git a/server/src/main/resources/transport/latest/9.1.txt b/server/src/main/resources/transport/latest/9.1.txt new file mode 100644 index 0000000000000..770b840c3d7a9 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.1.txt @@ -0,0 +1 @@ +placeholder|9112003 diff --git a/server/src/main/resources/transport/latest/9.2.json b/server/src/main/resources/transport/latest/9.2.json deleted file mode 100644 index 294316e134e40..0000000000000 --- a/server/src/main/resources/transport/latest/9.2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "placeholder", - "ids": [ - 9130000 - ] -} diff --git a/server/src/main/resources/transport/latest/9.2.txt b/server/src/main/resources/transport/latest/9.2.txt new file mode 100644 index 0000000000000..221e93b5065f4 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.2.txt @@ -0,0 +1 @@ +placeholder|9130000 diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 37bdfe9b27b63..39b4fed0b24df 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -222,41 +222,41 @@ public void testDuplicateConstants() { } public void testFromName() { - assertThat(TransportVersion.fromName("test-0"), is(new TransportVersion("test-0", 3001000, null))); - assertThat(TransportVersion.fromName("test-1"), is(new TransportVersion("test-1", 3002000, null))); + assertThat(TransportVersion.fromName("test_0"), is(new TransportVersion("test_0", 3001000, null))); + assertThat(TransportVersion.fromName("test_1"), is(new TransportVersion("test_1", 3002000, null))); assertThat( - TransportVersion.fromName("test-2"), + TransportVersion.fromName("test_2"), is( new TransportVersion( - "test-2", + "test_2", 3003000, - new TransportVersion("test-2", 2001001, new TransportVersion("test-2", 1001001, null)) + new TransportVersion("test_2", 2001001, new TransportVersion("test_2", 1001001, null)) ) ) ); assertThat( - TransportVersion.fromName("test-3"), - is(new TransportVersion("test-3", 3003001, new TransportVersion("test-3", 2001002, null))) + TransportVersion.fromName("test_3"), + is(new TransportVersion("test_3", 3003001, new TransportVersion("test_3", 2001002, null))) ); assertThat( - TransportVersion.fromName("test-4"), + TransportVersion.fromName("test_4"), is( new TransportVersion( - "test-4", + "test_4", 3003002, - new TransportVersion("test-4", 2001003, new TransportVersion("test-4", 1001002, null)) + new TransportVersion("test_4", 2001003, new TransportVersion("test_4", 1001002, null)) ) ) ); } public void testSupports() { - TransportVersion test0 = TransportVersion.fromName("test-0"); + TransportVersion test0 = TransportVersion.fromName("test_0"); assertThat(new TransportVersion(null, 2003000, null).supports(test0), is(false)); assertThat(new TransportVersion(null, 3001000, null).supports(test0), is(true)); assertThat(new TransportVersion(null, 100001001, null).supports(test0), is(true)); - TransportVersion test1 = TransportVersion.fromName("test-1"); + TransportVersion test1 = TransportVersion.fromName("test_1"); assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3001000, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3001001, null).supports(test1), is(false)); @@ -264,7 +264,7 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001000, null).supports(test1), is(true)); assertThat(new TransportVersion(null, 100001001, null).supports(test1), is(true)); - TransportVersion test2 = TransportVersion.fromName("test-2"); + TransportVersion test2 = TransportVersion.fromName("test_2"); assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false)); assertThat(new TransportVersion(null, 1001001, null).supports(test2), is(true)); assertThat(new TransportVersion(null, 1001002, null).supports(test2), is(true)); @@ -284,7 +284,7 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001000, null).supports(test2), is(true)); assertThat(new TransportVersion(null, 100001001, null).supports(test2), is(true)); - TransportVersion test3 = TransportVersion.fromName("test-3"); + TransportVersion test3 = TransportVersion.fromName("test_3"); assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false)); assertThat(new TransportVersion(null, 1001002, null).supports(test3), is(false)); assertThat(new TransportVersion(null, 1001003, null).supports(test3), is(false)); @@ -305,7 +305,7 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001000, null).supports(test3), is(true)); assertThat(new TransportVersion(null, 100001001, null).supports(test3), is(true)); - TransportVersion test4 = TransportVersion.fromName("test-4"); + TransportVersion test4 = TransportVersion.fromName("test_4"); assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false)); assertThat(new TransportVersion(null, 1001002, null).supports(test4), is(true)); assertThat(new TransportVersion(null, 1001003, null).supports(test4), is(true)); diff --git a/server/src/test/resources/transport/constant/manifest.txt b/server/src/test/resources/transport/constant/manifest.txt index de534728ea566..cd631a1bb3176 100644 --- a/server/src/test/resources/transport/constant/manifest.txt +++ b/server/src/test/resources/transport/constant/manifest.txt @@ -1,5 +1,5 @@ -test-0.json -test-1.json -test-2.json -test-3.json -test-4.json +test_0.txt +test_1.txt +test_2.txt +test_3.txt +test_4.txt diff --git a/server/src/test/resources/transport/constant/test-0.json b/server/src/test/resources/transport/constant/test-0.json deleted file mode 100644 index a85f62b22a404..0000000000000 --- a/server/src/test/resources/transport/constant/test-0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "test-0", - "ids": [ - 100001000, - 3001000 - ] -} diff --git a/server/src/test/resources/transport/constant/test-1.json b/server/src/test/resources/transport/constant/test-1.json deleted file mode 100644 index 98313ed7b0d3c..0000000000000 --- a/server/src/test/resources/transport/constant/test-1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "test-1", - "ids": [ - 3002000 - ] -} diff --git a/server/src/test/resources/transport/constant/test-2.json b/server/src/test/resources/transport/constant/test-2.json deleted file mode 100644 index f443582e8fb2f..0000000000000 --- a/server/src/test/resources/transport/constant/test-2.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "test-2", - "ids": [ - 3003000, - 2001001, - 1001001 - ] -} diff --git a/server/src/test/resources/transport/constant/test-3.json b/server/src/test/resources/transport/constant/test-3.json deleted file mode 100644 index b2e24c7b69266..0000000000000 --- a/server/src/test/resources/transport/constant/test-3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "test-3", - "ids": [ - 100002000, - 3003001, - 2001002 - ] -} diff --git a/server/src/test/resources/transport/constant/test-4.json b/server/src/test/resources/transport/constant/test-4.json deleted file mode 100644 index 570f63e879f6f..0000000000000 --- a/server/src/test/resources/transport/constant/test-4.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "test-4", - "ids": [ - 100002000, - 3003002, - 2001003, - 1001002 - ] -} diff --git a/server/src/test/resources/transport/constant/test_0.txt b/server/src/test/resources/transport/constant/test_0.txt new file mode 100644 index 0000000000000..1bd837270b721 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_0.txt @@ -0,0 +1 @@ +test_0|100001000|3001000 diff --git a/server/src/test/resources/transport/constant/test_1.txt b/server/src/test/resources/transport/constant/test_1.txt new file mode 100644 index 0000000000000..a22002e5e102e --- /dev/null +++ b/server/src/test/resources/transport/constant/test_1.txt @@ -0,0 +1,2 @@ +test_1|3002000 + diff --git a/server/src/test/resources/transport/constant/test_2.txt b/server/src/test/resources/transport/constant/test_2.txt new file mode 100644 index 0000000000000..9b49120ba42f0 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_2.txt @@ -0,0 +1 @@ +test_2|3003000|2001001|1001001 diff --git a/server/src/test/resources/transport/constant/test_3.txt b/server/src/test/resources/transport/constant/test_3.txt new file mode 100644 index 0000000000000..c6ee474bb1ed0 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_3.txt @@ -0,0 +1 @@ +test_3|100002000|3003001|2001002 diff --git a/server/src/test/resources/transport/constant/test_4.txt b/server/src/test/resources/transport/constant/test_4.txt new file mode 100644 index 0000000000000..5bbe2e5769a61 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_4.txt @@ -0,0 +1 @@ +test_4|100002000|3003002|2001003|1001002 From aa7a4bcba303608a1553e8004b58103add799d9e Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Wed, 23 Jul 2025 15:19:03 -0700 Subject: [PATCH 24/25] revert lazy change --- server/src/main/java/org/elasticsearch/TransportVersion.java | 4 ++-- .../java/org/elasticsearch/common/io/stream/StreamInput.java | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 0e73a3a1f061d..76fce20d865d6 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -90,10 +90,10 @@ public TransportVersion(int id) { public static TransportVersion fromInputStream(String path, InputStream stream, Integer latest) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { String line = reader.readLine(); - String[] parts = line.replaceAll("\\s+","").split("\\|"); + String[] parts = line.replaceAll("\\s+", "").split("\\|"); String check; while ((check = reader.readLine()) != null) { - if (check.replaceAll("\\s+","").isEmpty() == false) { + if (check.replaceAll("\\s+", "").isEmpty() == false) { throw new IllegalArgumentException("invalid transport version file format [" + path + "]"); } } diff --git a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java index 32cabfd19550c..3e3ab92f5d72f 100644 --- a/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java +++ b/server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java @@ -76,15 +76,12 @@ */ public abstract class StreamInput extends InputStream { - private TransportVersion version; + private TransportVersion version = TransportVersion.current(); /** * The transport version the data is serialized as. */ public TransportVersion getTransportVersion() { - if (version == null) { - version = TransportVersion.current(); - } return this.version; } From 8c8ecfc2142347c8d92d5038fa8a81124d3462c0 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 24 Jul 2025 12:56:53 -0700 Subject: [PATCH 25/25] update to use csv files and remove names from files when possible --- .../java/org/elasticsearch/TransportVersion.java | 16 ++++++++-------- .../src/main/resources/transport/latest/8.18.csv | 1 + .../src/main/resources/transport/latest/8.18.txt | 1 - .../src/main/resources/transport/latest/8.19.csv | 1 + .../src/main/resources/transport/latest/8.19.txt | 1 - .../src/main/resources/transport/latest/9.0.csv | 1 + .../src/main/resources/transport/latest/9.0.txt | 1 - .../src/main/resources/transport/latest/9.1.csv | 1 + .../src/main/resources/transport/latest/9.1.txt | 1 - .../src/main/resources/transport/latest/9.2.csv | 1 + .../src/main/resources/transport/latest/9.2.txt | 1 - .../resources/transport/constant/manifest.txt | 10 +++++----- .../test/resources/transport/constant/test_0.csv | 1 + .../test/resources/transport/constant/test_0.txt | 1 - .../test/resources/transport/constant/test_1.csv | 2 ++ .../test/resources/transport/constant/test_1.txt | 2 -- .../test/resources/transport/constant/test_2.csv | 1 + .../test/resources/transport/constant/test_2.txt | 1 - .../test/resources/transport/constant/test_3.csv | 1 + .../test/resources/transport/constant/test_3.txt | 1 - .../test/resources/transport/constant/test_4.csv | 1 + .../test/resources/transport/constant/test_4.txt | 1 - 22 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 server/src/main/resources/transport/latest/8.18.csv delete mode 100644 server/src/main/resources/transport/latest/8.18.txt create mode 100644 server/src/main/resources/transport/latest/8.19.csv delete mode 100644 server/src/main/resources/transport/latest/8.19.txt create mode 100644 server/src/main/resources/transport/latest/9.0.csv delete mode 100644 server/src/main/resources/transport/latest/9.0.txt create mode 100644 server/src/main/resources/transport/latest/9.1.csv delete mode 100644 server/src/main/resources/transport/latest/9.1.txt create mode 100644 server/src/main/resources/transport/latest/9.2.csv delete mode 100644 server/src/main/resources/transport/latest/9.2.txt create mode 100644 server/src/test/resources/transport/constant/test_0.csv delete mode 100644 server/src/test/resources/transport/constant/test_0.txt create mode 100644 server/src/test/resources/transport/constant/test_1.csv delete mode 100644 server/src/test/resources/transport/constant/test_1.txt create mode 100644 server/src/test/resources/transport/constant/test_2.csv delete mode 100644 server/src/test/resources/transport/constant/test_2.txt create mode 100644 server/src/test/resources/transport/constant/test_3.csv delete mode 100644 server/src/test/resources/transport/constant/test_3.txt create mode 100644 server/src/test/resources/transport/constant/test_4.csv delete mode 100644 server/src/test/resources/transport/constant/test_4.txt diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 76fce20d865d6..2ac4c1bf72ab6 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -87,22 +87,22 @@ public TransportVersion(int id) { * This method takes in the parameter {@code latest} which is the highest valid transport version id * supported by this node. Versions newer than the current transport version id for this node are discarded. */ - public static TransportVersion fromInputStream(String path, InputStream stream, Integer latest) { + public static TransportVersion fromInputStream(String path, boolean nameInFile, InputStream stream, Integer latest) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { String line = reader.readLine(); - String[] parts = line.replaceAll("\\s+", "").split("\\|"); + String[] parts = line.replaceAll("\\s+", "").split(","); String check; while ((check = reader.readLine()) != null) { if (check.replaceAll("\\s+", "").isEmpty() == false) { throw new IllegalArgumentException("invalid transport version file format [" + path + "]"); } } - if (parts.length < 2) { + if (parts.length < (nameInFile ? 2 : 1)) { throw new IllegalStateException("invalid transport version file format [" + path + "]"); } - String name = parts[0]; + String name = nameInFile ? parts[0] : path.substring(path.lastIndexOf('/') + 1, path.length() - 4); List ids = new ArrayList<>(); - for (int i = 1; i < parts.length; ++i) { + for (int i = nameInFile ? 1 : 0; i < parts.length; ++i) { try { ids.add(Integer.parseInt(parts[i])); } catch (NumberFormatException nfe) { @@ -376,14 +376,14 @@ private static class VersionsHolder { private static Map loadTransportVersionsByName() { Map transportVersions = new HashMap<>(); - String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".txt"; + String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".csv"; int latestId = -1; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { // this check is required until bootstrapping for the new transport versions format is completed; // when load is false, we will only use the transport versions in the legacy format; // load becomes false if we don't find the latest or manifest files required for the new format if (inputStream != null) { - TransportVersion latest = fromInputStream(latestLocation, inputStream, Integer.MAX_VALUE); + TransportVersion latest = fromInputStream(latestLocation, true, inputStream, Integer.MAX_VALUE); if (latest == null) { throw new IllegalStateException( "invalid latest transport version for minor version [" @@ -419,7 +419,7 @@ private static Map loadTransportVersionsByName() { if (inputStream == null) { throw new IllegalStateException("transport version file not found at [" + versionLocation + "]"); } - TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, inputStream, latestId); + TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, false, inputStream, latestId); if (transportVersion != null) { transportVersions.put(transportVersion.name(), transportVersion); } diff --git a/server/src/main/resources/transport/latest/8.18.csv b/server/src/main/resources/transport/latest/8.18.csv new file mode 100644 index 0000000000000..987d72e2aaeae --- /dev/null +++ b/server/src/main/resources/transport/latest/8.18.csv @@ -0,0 +1 @@ +placeholder,8840007 diff --git a/server/src/main/resources/transport/latest/8.18.txt b/server/src/main/resources/transport/latest/8.18.txt deleted file mode 100644 index 14de3d57f1599..0000000000000 --- a/server/src/main/resources/transport/latest/8.18.txt +++ /dev/null @@ -1 +0,0 @@ -placeholder|8840007 diff --git a/server/src/main/resources/transport/latest/8.19.csv b/server/src/main/resources/transport/latest/8.19.csv new file mode 100644 index 0000000000000..2480f207cc6e4 --- /dev/null +++ b/server/src/main/resources/transport/latest/8.19.csv @@ -0,0 +1 @@ +placeholder,8841064 diff --git a/server/src/main/resources/transport/latest/8.19.txt b/server/src/main/resources/transport/latest/8.19.txt deleted file mode 100644 index 399f403320a54..0000000000000 --- a/server/src/main/resources/transport/latest/8.19.txt +++ /dev/null @@ -1 +0,0 @@ -placeholder|8841064 diff --git a/server/src/main/resources/transport/latest/9.0.csv b/server/src/main/resources/transport/latest/9.0.csv new file mode 100644 index 0000000000000..478f07788af87 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.0.csv @@ -0,0 +1 @@ +placeholder,9000014 diff --git a/server/src/main/resources/transport/latest/9.0.txt b/server/src/main/resources/transport/latest/9.0.txt deleted file mode 100644 index 8f93c3951e984..0000000000000 --- a/server/src/main/resources/transport/latest/9.0.txt +++ /dev/null @@ -1 +0,0 @@ -placeholder|9000014 diff --git a/server/src/main/resources/transport/latest/9.1.csv b/server/src/main/resources/transport/latest/9.1.csv new file mode 100644 index 0000000000000..21304ce07f713 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.1.csv @@ -0,0 +1 @@ +placeholder,9112003 diff --git a/server/src/main/resources/transport/latest/9.1.txt b/server/src/main/resources/transport/latest/9.1.txt deleted file mode 100644 index 770b840c3d7a9..0000000000000 --- a/server/src/main/resources/transport/latest/9.1.txt +++ /dev/null @@ -1 +0,0 @@ -placeholder|9112003 diff --git a/server/src/main/resources/transport/latest/9.2.csv b/server/src/main/resources/transport/latest/9.2.csv new file mode 100644 index 0000000000000..5db8e8fb48f39 --- /dev/null +++ b/server/src/main/resources/transport/latest/9.2.csv @@ -0,0 +1 @@ +placeholder,9130000 diff --git a/server/src/main/resources/transport/latest/9.2.txt b/server/src/main/resources/transport/latest/9.2.txt deleted file mode 100644 index 221e93b5065f4..0000000000000 --- a/server/src/main/resources/transport/latest/9.2.txt +++ /dev/null @@ -1 +0,0 @@ -placeholder|9130000 diff --git a/server/src/test/resources/transport/constant/manifest.txt b/server/src/test/resources/transport/constant/manifest.txt index cd631a1bb3176..b158f9910edf4 100644 --- a/server/src/test/resources/transport/constant/manifest.txt +++ b/server/src/test/resources/transport/constant/manifest.txt @@ -1,5 +1,5 @@ -test_0.txt -test_1.txt -test_2.txt -test_3.txt -test_4.txt +test_0.csv +test_1.csv +test_2.csv +test_3.csv +test_4.csv diff --git a/server/src/test/resources/transport/constant/test_0.csv b/server/src/test/resources/transport/constant/test_0.csv new file mode 100644 index 0000000000000..46b80e0a7f735 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_0.csv @@ -0,0 +1 @@ +100001000,3001000 diff --git a/server/src/test/resources/transport/constant/test_0.txt b/server/src/test/resources/transport/constant/test_0.txt deleted file mode 100644 index 1bd837270b721..0000000000000 --- a/server/src/test/resources/transport/constant/test_0.txt +++ /dev/null @@ -1 +0,0 @@ -test_0|100001000|3001000 diff --git a/server/src/test/resources/transport/constant/test_1.csv b/server/src/test/resources/transport/constant/test_1.csv new file mode 100644 index 0000000000000..68f67c2ab7884 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_1.csv @@ -0,0 +1,2 @@ +3002000 + diff --git a/server/src/test/resources/transport/constant/test_1.txt b/server/src/test/resources/transport/constant/test_1.txt deleted file mode 100644 index a22002e5e102e..0000000000000 --- a/server/src/test/resources/transport/constant/test_1.txt +++ /dev/null @@ -1,2 +0,0 @@ -test_1|3002000 - diff --git a/server/src/test/resources/transport/constant/test_2.csv b/server/src/test/resources/transport/constant/test_2.csv new file mode 100644 index 0000000000000..5db5b13038410 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_2.csv @@ -0,0 +1 @@ +3003000,2001001,1001001 diff --git a/server/src/test/resources/transport/constant/test_2.txt b/server/src/test/resources/transport/constant/test_2.txt deleted file mode 100644 index 9b49120ba42f0..0000000000000 --- a/server/src/test/resources/transport/constant/test_2.txt +++ /dev/null @@ -1 +0,0 @@ -test_2|3003000|2001001|1001001 diff --git a/server/src/test/resources/transport/constant/test_3.csv b/server/src/test/resources/transport/constant/test_3.csv new file mode 100644 index 0000000000000..b9dd0509e1364 --- /dev/null +++ b/server/src/test/resources/transport/constant/test_3.csv @@ -0,0 +1 @@ +100002000,3003001,2001002 diff --git a/server/src/test/resources/transport/constant/test_3.txt b/server/src/test/resources/transport/constant/test_3.txt deleted file mode 100644 index c6ee474bb1ed0..0000000000000 --- a/server/src/test/resources/transport/constant/test_3.txt +++ /dev/null @@ -1 +0,0 @@ -test_3|100002000|3003001|2001002 diff --git a/server/src/test/resources/transport/constant/test_4.csv b/server/src/test/resources/transport/constant/test_4.csv new file mode 100644 index 0000000000000..55c482a68ee7f --- /dev/null +++ b/server/src/test/resources/transport/constant/test_4.csv @@ -0,0 +1 @@ +100002000,3003002,2001003,1001002 diff --git a/server/src/test/resources/transport/constant/test_4.txt b/server/src/test/resources/transport/constant/test_4.txt deleted file mode 100644 index 5bbe2e5769a61..0000000000000 --- a/server/src/test/resources/transport/constant/test_4.txt +++ /dev/null @@ -1 +0,0 @@ -test_4|100002000|3003002|2001003|1001002