From 616d568fe2439695aef3adca1b34e12396c0630f Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 11 Aug 2025 13:07:34 -0700 Subject: [PATCH 1/6] move tv loading to support external consumers --- .../org/elasticsearch/TransportVersion.java | 83 +++++++++++-------- .../resources/transport/defined/manifest.txt | 5 -- 2 files changed, 49 insertions(+), 39 deletions(-) delete mode 100644 server/src/test/resources/transport/defined/manifest.txt diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index d31bb2a5e5495..47bb459cc8d7e 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -123,6 +123,53 @@ public static TransportVersion fromInputStream(String path, boolean nameInFile, } } + public static Map fromInputStreams( + String component, + Function nameToStream, + int latestId + ) { + String[] baseLocations = new String[] { "/transport/generated/", "/transport/defined/" }; + Map transportVersions = new HashMap<>(); + + for (String baseLocation : baseLocations) { + String manifestLocation = baseLocation + "manifest.txt"; + List versionFileNames = null; + try (InputStream inputStream = nameToStream.apply(baseLocation)) { + 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 [" + component + ":" + manifestLocation + "]", + ioe + ); + } + + if (versionFileNames != null) { + for (String versionFileName : versionFileNames) { + String versionLocation = baseLocation + versionFileName; + try (InputStream inputStream = nameToStream.apply(versionLocation)) { + if (inputStream == null) { + throw new IllegalStateException("transport version file not found [" + component + ":" + versionLocation + "]"); + } + TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, false, inputStream, latestId); + if (transportVersion != null) { + transportVersions.put(transportVersion.name(), transportVersion); + } + } catch (IOException ioe) { + throw new UncheckedIOException( + "transport version file not found at [" + component + ":" + versionLocation + "]", + ioe + ); + } + } + } + } + + return transportVersions; + } + public static TransportVersion readVersion(StreamInput in) throws IOException { return fromId(in.readVInt()); } @@ -374,8 +421,6 @@ private static class VersionsHolder { } private static Map loadTransportVersionsByName() { - Map transportVersions = new HashMap<>(); - String latestLocation = "/transport/latest/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".csv"; int latestId = -1; try (InputStream inputStream = TransportVersion.class.getResourceAsStream(latestLocation)) { @@ -396,40 +441,10 @@ private static Map loadTransportVersionsByName() { latestId = latest.id(); } } catch (IOException ioe) { - throw new UncheckedIOException("latest transport version file not found at [" + latestLocation + "]", ioe); - } - - String manifestLocation = "/transport/defined/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); - } - } - - if (versionFileNames != null) { - for (String name : versionFileNames) { - String versionLocation = "/transport/defined/" + name; - try (InputStream inputStream = TransportVersion.class.getResourceAsStream(versionLocation)) { - if (inputStream == null) { - throw new IllegalStateException("transport version file not found at [" + versionLocation + "]"); - } - TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, false, inputStream, latestId); - if (transportVersion != null) { - transportVersions.put(transportVersion.name(), transportVersion); - } - } catch (IOException ioe) { - throw new UncheckedIOException("transport version file not found at [ " + versionLocation + "]", ioe); - } - } + throw new UncheckedIOException("latest transport version file not found at [/" + latestLocation + "]", ioe); } - return transportVersions; + return TransportVersion.fromInputStreams("server", TransportVersion.class::getResourceAsStream, latestId); } private static List addTransportVersions(Collection addFrom, List addTo) { diff --git a/server/src/test/resources/transport/defined/manifest.txt b/server/src/test/resources/transport/defined/manifest.txt deleted file mode 100644 index b158f9910edf4..0000000000000 --- a/server/src/test/resources/transport/defined/manifest.txt +++ /dev/null @@ -1,5 +0,0 @@ -test_0.csv -test_1.csv -test_2.csv -test_3.csv -test_4.csv From 38e220ef71cdfae97769c20e9ff57e29d43cf7a2 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Mon, 11 Aug 2025 14:50:39 -0700 Subject: [PATCH 2/6] transport version bug fix --- server/src/main/java/org/elasticsearch/TransportVersion.java | 2 +- server/src/test/resources/transport/defined/manifest.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 server/src/test/resources/transport/defined/manifest.txt diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 47bb459cc8d7e..ca9ce6446db47 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -134,7 +134,7 @@ public static Map fromInputStreams( for (String baseLocation : baseLocations) { String manifestLocation = baseLocation + "manifest.txt"; List versionFileNames = null; - try (InputStream inputStream = nameToStream.apply(baseLocation)) { + try (InputStream inputStream = nameToStream.apply(manifestLocation)) { 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/resources/transport/defined/manifest.txt b/server/src/test/resources/transport/defined/manifest.txt new file mode 100644 index 0000000000000..b158f9910edf4 --- /dev/null +++ b/server/src/test/resources/transport/defined/manifest.txt @@ -0,0 +1,5 @@ +test_0.csv +test_1.csv +test_2.csv +test_3.csv +test_4.csv From 06c763b5e509495b1c0043d9ad0784de5a3a05a5 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 12 Aug 2025 11:51:46 -0700 Subject: [PATCH 3/6] update transport version loading --- .../org/elasticsearch/TransportVersion.java | 151 +++++++++--------- .../elasticsearch/TransportVersionTests.java | 63 ++++---- .../resources/transport/defined/manifest.txt | 5 - .../resources/transport/defined/test_0.csv | 1 - .../resources/transport/defined/test_1.csv | 2 - .../resources/transport/defined/test_2.csv | 1 - .../resources/transport/defined/test_3.csv | 1 - .../resources/transport/defined/test_4.csv | 1 - 8 files changed, 107 insertions(+), 118 deletions(-) delete mode 100644 server/src/test/resources/transport/defined/manifest.txt delete mode 100644 server/src/test/resources/transport/defined/test_0.csv delete mode 100644 server/src/test/resources/transport/defined/test_1.csv delete mode 100644 server/src/test/resources/transport/defined/test_2.csv delete mode 100644 server/src/test/resources/transport/defined/test_3.csv delete mode 100644 server/src/test/resources/transport/defined/test_4.csv diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index ca9ce6446db47..2bea70db6d279 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -9,6 +9,7 @@ package org.elasticsearch; +import org.elasticsearch.common.TriFunction; import org.elasticsearch.common.VersionId; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -82,23 +83,47 @@ public TransportVersion(int id) { this(null, id, null); } + static T parseFromBufferedReader( + String component, + String path, + Function nameToStream, + TriFunction parser + ) { + try (InputStream inputStream = nameToStream.apply(path)) { + if (inputStream == null) { + return null; + } + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + return parser.apply(component, path, bufferedReader); + } + } catch (IOException ioe) { + throw new UncheckedIOException("parsing error [" + component + ":" + path + "]", ioe); + } + } + /** * 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, boolean nameInFile, InputStream stream, Integer latest) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { - String line = reader.readLine(); + public static TransportVersion fromBufferedReader( + String component, + String path, + boolean nameInFile, + BufferedReader bufferedReader, + Integer latest + ) { + try { + String line = bufferedReader.readLine(); String[] parts = line.replaceAll("\\s+", "").split(","); String check; - while ((check = reader.readLine()) != null) { + while ((check = bufferedReader.readLine()) != null) { if (check.replaceAll("\\s+", "").isEmpty() == false) { - throw new IllegalArgumentException("invalid transport version file format [" + path + "]"); + throw new IllegalArgumentException("invalid transport version file format [" + toComponentPath(component, path) + "]"); } } if (parts.length < (nameInFile ? 2 : 1)) { - throw new IllegalStateException("invalid transport version file format [" + path + "]"); + throw new IllegalStateException("invalid transport version file format [" + toComponentPath(component, path) + "]"); } String name = nameInFile ? parts[0] : path.substring(path.lastIndexOf('/') + 1, path.length() - 4); List ids = new ArrayList<>(); @@ -106,12 +131,17 @@ public static TransportVersion fromInputStream(String path, boolean nameInFile, try { ids.add(Integer.parseInt(parts[i])); } catch (NumberFormatException nfe) { - throw new IllegalStateException("invalid transport version file format [" + path + "]", nfe); + throw new IllegalStateException( + "invalid transport version file format [" + toComponentPath(component, path) + "]", + nfe + ); } } - ids.sort(Integer::compareTo); TransportVersion transportVersion = null; - for (int idIndex = 0; idIndex < ids.size(); ++idIndex) { + for (int idIndex = ids.size() - 1; idIndex >= 0; --idIndex) { + if (idIndex > 0 && ids.get(idIndex - 1) <= ids.get(idIndex)) { + throw new IllegalStateException("invalid transport version file format [" + toComponentPath(component, path) + "]"); + } if (ids.get(idIndex) > latest) { break; } @@ -119,55 +149,49 @@ public static TransportVersion fromInputStream(String path, boolean nameInFile, } return transportVersion; } catch (IOException ioe) { - throw new UncheckedIOException("cannot parse transport version [" + path + "]", ioe); + throw new UncheckedIOException("invalid transport version file format [" + toComponentPath(component, path) + "]", ioe); } } - public static Map fromInputStreams( + public static Map collectFromInputStreams( String component, Function nameToStream, - int latestId + String latestFileName ) { - String[] baseLocations = new String[] { "/transport/generated/", "/transport/defined/" }; - Map transportVersions = new HashMap<>(); - - for (String baseLocation : baseLocations) { - String manifestLocation = baseLocation + "manifest.txt"; - List versionFileNames = null; - try (InputStream inputStream = nameToStream.apply(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 [" + component + ":" + manifestLocation + "]", - ioe - ); - } - - if (versionFileNames != null) { - for (String versionFileName : versionFileNames) { - String versionLocation = baseLocation + versionFileName; - try (InputStream inputStream = nameToStream.apply(versionLocation)) { - if (inputStream == null) { - throw new IllegalStateException("transport version file not found [" + component + ":" + versionLocation + "]"); - } - TransportVersion transportVersion = TransportVersion.fromInputStream(versionLocation, false, inputStream, latestId); - if (transportVersion != null) { - transportVersions.put(transportVersion.name(), transportVersion); - } - } catch (IOException ioe) { - throw new UncheckedIOException( - "transport version file not found at [" + component + ":" + versionLocation + "]", - ioe - ); + TransportVersion latest = parseFromBufferedReader( + component, + "/transport/latest/" + latestFileName, + nameToStream, + (c, p, br) -> fromBufferedReader(c, p, true, br, Integer.MAX_VALUE) + ); + if (latest != null) { + List versionFilesNames = parseFromBufferedReader( + component, + "/transport/defined/manifest.txt", + nameToStream, + (c, p, br) -> br.lines().filter(line -> line.isBlank() == false).toList() + ); + if (versionFilesNames != null) { + Map transportVersions = new HashMap<>(); + for (String versionFileName : versionFilesNames) { + TransportVersion transportVersion = parseFromBufferedReader( + component, + "/transport/defined/" + versionFileName, + nameToStream, + (c, p, br) -> fromBufferedReader(c, p, false, br, latest.id()) + ); + if (transportVersion != null) { + transportVersions.put(versionFileName.substring(0, versionFileName.length() - 4), transportVersion); } } + return transportVersions; } } + return Map.of(); + } - return transportVersions; + private static String toComponentPath(String component, String path) { + return component + ":" + path; } public static TransportVersion readVersion(StreamInput in) throws IOException { @@ -392,7 +416,11 @@ private static class VersionsHolder { 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(); + Map allVersionsByName = collectFromInputStreams( + "", + TransportVersion.class::getResourceAsStream, + Version.CURRENT.major + "." + Version.CURRENT.minor + ".csv" + ); addTransportVersions(allVersionsByName.values(), allVersions).sort(TransportVersion::compareTo); // set version lookup by release before adding serverless versions @@ -420,33 +448,6 @@ private static class VersionsHolder { CURRENT = ALL_VERSIONS.getLast(); } - private static Map loadTransportVersionsByName() { - 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, true, inputStream, Integer.MAX_VALUE); - if (latest == null) { - throw new IllegalStateException( - "invalid latest transport version for minor 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); - } - - return TransportVersion.fromInputStreams("server", TransportVersion.class::getResourceAsStream, latestId); - } - private static List addTransportVersions(Collection addFrom, List addTo) { for (TransportVersion transportVersion : addFrom) { addTo.add(transportVersion); diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 39b4fed0b24df..fcdf09519402e 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -12,7 +12,11 @@ import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.TransportVersionUtils; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; import java.lang.reflect.Modifier; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Set; import java.util.regex.Matcher; @@ -221,42 +225,28 @@ 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_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 testLatest() { + TransportVersion latest = TransportVersion.parseFromBufferedReader("", + "/transport/defined/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".csv", + TransportVersion.class::getResourceAsStream, + (c, p, br) -> TransportVersion.fromBufferedReader(c, p, true, br, Integer.MAX_VALUE)); + // TODO: once placeholder is removed, test the latest known version can be found fromName + // assertThat(latest, is(TransportVersion.fromName(latest.name()))); } public void testSupports() { - TransportVersion test0 = TransportVersion.fromName("test_0"); + byte[] data0 = "100001000,3001000".getBytes(StandardCharsets.UTF_8); + TransportVersion test0 = TransportVersion.fromBufferedReader("", "testSupports0", false, new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(data0))), 5000000 + ); 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"); + byte[] data1 = "3002000".getBytes(StandardCharsets.UTF_8); + TransportVersion test1 = TransportVersion.fromBufferedReader("", "testSupports1", false, new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(data1))), 5000000 + ); 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 +254,10 @@ 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"); + byte[] data2 = "3003000,2001001,1001001".getBytes(StandardCharsets.UTF_8); + TransportVersion test2 = TransportVersion.fromBufferedReader("", "testSupports2", false, new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(data2))), 5000000 + ); 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 +277,10 @@ 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"); + byte[] data3 = "100002000,3003001,2001002".getBytes(StandardCharsets.UTF_8); + TransportVersion test3 = TransportVersion.fromBufferedReader("", "testSupports3", false, new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(data3))), 5000000 + ); 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 +301,10 @@ 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"); + byte[] data4 = "100002000,3003002,2001003,1001002".getBytes(StandardCharsets.UTF_8); + TransportVersion test4 = TransportVersion.fromBufferedReader("", "testSupports3", false, new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(data4))), 5000000 + ); 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/defined/manifest.txt b/server/src/test/resources/transport/defined/manifest.txt deleted file mode 100644 index b158f9910edf4..0000000000000 --- a/server/src/test/resources/transport/defined/manifest.txt +++ /dev/null @@ -1,5 +0,0 @@ -test_0.csv -test_1.csv -test_2.csv -test_3.csv -test_4.csv diff --git a/server/src/test/resources/transport/defined/test_0.csv b/server/src/test/resources/transport/defined/test_0.csv deleted file mode 100644 index 46b80e0a7f735..0000000000000 --- a/server/src/test/resources/transport/defined/test_0.csv +++ /dev/null @@ -1 +0,0 @@ -100001000,3001000 diff --git a/server/src/test/resources/transport/defined/test_1.csv b/server/src/test/resources/transport/defined/test_1.csv deleted file mode 100644 index 68f67c2ab7884..0000000000000 --- a/server/src/test/resources/transport/defined/test_1.csv +++ /dev/null @@ -1,2 +0,0 @@ -3002000 - diff --git a/server/src/test/resources/transport/defined/test_2.csv b/server/src/test/resources/transport/defined/test_2.csv deleted file mode 100644 index 5db5b13038410..0000000000000 --- a/server/src/test/resources/transport/defined/test_2.csv +++ /dev/null @@ -1 +0,0 @@ -3003000,2001001,1001001 diff --git a/server/src/test/resources/transport/defined/test_3.csv b/server/src/test/resources/transport/defined/test_3.csv deleted file mode 100644 index b9dd0509e1364..0000000000000 --- a/server/src/test/resources/transport/defined/test_3.csv +++ /dev/null @@ -1 +0,0 @@ -100002000,3003001,2001002 diff --git a/server/src/test/resources/transport/defined/test_4.csv b/server/src/test/resources/transport/defined/test_4.csv deleted file mode 100644 index 55c482a68ee7f..0000000000000 --- a/server/src/test/resources/transport/defined/test_4.csv +++ /dev/null @@ -1 +0,0 @@ -100002000,3003002,2001003,1001002 From 9f21f627a148e109dd8e6716c68ab1419f9e140e Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Tue, 12 Aug 2025 18:58:59 +0000 Subject: [PATCH 4/6] [CI] Auto commit changes from spotless --- .../elasticsearch/TransportVersionTests.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index fcdf09519402e..29cf518992aba 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -226,26 +226,36 @@ public void testDuplicateConstants() { } public void testLatest() { - TransportVersion latest = TransportVersion.parseFromBufferedReader("", + TransportVersion latest = TransportVersion.parseFromBufferedReader( + "", "/transport/defined/" + Version.CURRENT.major + "." + Version.CURRENT.minor + ".csv", TransportVersion.class::getResourceAsStream, - (c, p, br) -> TransportVersion.fromBufferedReader(c, p, true, br, Integer.MAX_VALUE)); + (c, p, br) -> TransportVersion.fromBufferedReader(c, p, true, br, Integer.MAX_VALUE) + ); // TODO: once placeholder is removed, test the latest known version can be found fromName // assertThat(latest, is(TransportVersion.fromName(latest.name()))); } public void testSupports() { byte[] data0 = "100001000,3001000".getBytes(StandardCharsets.UTF_8); - TransportVersion test0 = TransportVersion.fromBufferedReader("", "testSupports0", false, new BufferedReader( - new InputStreamReader(new ByteArrayInputStream(data0))), 5000000 + TransportVersion test0 = TransportVersion.fromBufferedReader( + "", + "testSupports0", + false, + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data0))), + 5000000 ); 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)); byte[] data1 = "3002000".getBytes(StandardCharsets.UTF_8); - TransportVersion test1 = TransportVersion.fromBufferedReader("", "testSupports1", false, new BufferedReader( - new InputStreamReader(new ByteArrayInputStream(data1))), 5000000 + TransportVersion test1 = TransportVersion.fromBufferedReader( + "", + "testSupports1", + false, + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data1))), + 5000000 ); assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false)); assertThat(new TransportVersion(null, 3001000, null).supports(test1), is(false)); @@ -255,8 +265,12 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001001, null).supports(test1), is(true)); byte[] data2 = "3003000,2001001,1001001".getBytes(StandardCharsets.UTF_8); - TransportVersion test2 = TransportVersion.fromBufferedReader("", "testSupports2", false, new BufferedReader( - new InputStreamReader(new ByteArrayInputStream(data2))), 5000000 + TransportVersion test2 = TransportVersion.fromBufferedReader( + "", + "testSupports2", + false, + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data2))), + 5000000 ); assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false)); assertThat(new TransportVersion(null, 1001001, null).supports(test2), is(true)); @@ -278,8 +292,12 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001001, null).supports(test2), is(true)); byte[] data3 = "100002000,3003001,2001002".getBytes(StandardCharsets.UTF_8); - TransportVersion test3 = TransportVersion.fromBufferedReader("", "testSupports3", false, new BufferedReader( - new InputStreamReader(new ByteArrayInputStream(data3))), 5000000 + TransportVersion test3 = TransportVersion.fromBufferedReader( + "", + "testSupports3", + false, + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data3))), + 5000000 ); assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false)); assertThat(new TransportVersion(null, 1001002, null).supports(test3), is(false)); @@ -302,8 +320,12 @@ public void testSupports() { assertThat(new TransportVersion(null, 100001001, null).supports(test3), is(true)); byte[] data4 = "100002000,3003002,2001003,1001002".getBytes(StandardCharsets.UTF_8); - TransportVersion test4 = TransportVersion.fromBufferedReader("", "testSupports3", false, new BufferedReader( - new InputStreamReader(new ByteArrayInputStream(data4))), 5000000 + TransportVersion test4 = TransportVersion.fromBufferedReader( + "", + "testSupports3", + false, + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data4))), + 5000000 ); assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false)); assertThat(new TransportVersion(null, 1001002, null).supports(test4), is(true)); From b2a0aa6c8732eec89e3bc48adf3e3c6816c53468 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 12 Aug 2025 13:35:10 -0700 Subject: [PATCH 5/6] fix forbidden --- .../java/org/elasticsearch/TransportVersionTests.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 29cf518992aba..8798b0bc89f13 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -242,7 +242,7 @@ public void testSupports() { "", "testSupports0", false, - new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data0))), + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data0), StandardCharsets.UTF_8)), 5000000 ); assertThat(new TransportVersion(null, 2003000, null).supports(test0), is(false)); @@ -254,7 +254,7 @@ public void testSupports() { "", "testSupports1", false, - new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data1))), + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data1), StandardCharsets.UTF_8)), 5000000 ); assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false)); @@ -269,7 +269,7 @@ public void testSupports() { "", "testSupports2", false, - new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data2))), + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data2), StandardCharsets.UTF_8)), 5000000 ); assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false)); @@ -296,7 +296,7 @@ public void testSupports() { "", "testSupports3", false, - new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data3))), + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data3), StandardCharsets.UTF_8)), 5000000 ); assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false)); @@ -324,7 +324,7 @@ public void testSupports() { "", "testSupports3", false, - new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data4))), + new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data4), StandardCharsets.UTF_8)), 5000000 ); assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false)); From 80b23f28a18d85e3e604615a86e11332a48882f8 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Tue, 12 Aug 2025 16:26:30 -0700 Subject: [PATCH 6/6] add bespoke interface --- .../main/java/org/elasticsearch/TransportVersion.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 2bea70db6d279..a90274496aca6 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -9,7 +9,6 @@ package org.elasticsearch; -import org.elasticsearch.common.TriFunction; import org.elasticsearch.common.VersionId; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -83,18 +82,22 @@ public TransportVersion(int id) { this(null, id, null); } + interface BufferedReaderParser { + T parse(String component, String path, BufferedReader bufferedReader); + } + static T parseFromBufferedReader( String component, String path, Function nameToStream, - TriFunction parser + BufferedReaderParser parser ) { try (InputStream inputStream = nameToStream.apply(path)) { if (inputStream == null) { return null; } try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { - return parser.apply(component, path, bufferedReader); + return parser.parse(component, path, bufferedReader); } } catch (IOException ioe) { throw new UncheckedIOException("parsing error [" + component + ":" + path + "]", ioe);