From 8aa5166c9601fdd6c8a6d46db071f1615f5ed532 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 11 Sep 2025 07:28:12 -0700 Subject: [PATCH 1/2] Improve missing tranport version error message (#134506) This updates the error message to use a "more like this" algorithm to suggest transport versions that may exist but are misspelled. --- .../org/elasticsearch/TransportVersion.java | 23 +++++++++++++++++-- .../elasticsearch/TransportVersionTests.java | 21 +++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index 75c163ca072eb..4ac63997b56b8 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -9,9 +9,11 @@ package org.elasticsearch; +import org.apache.lucene.search.spell.LevenshteinDistance; import org.elasticsearch.common.VersionId; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.core.Tuple; import java.io.BufferedReader; import java.io.IOException; @@ -225,12 +227,29 @@ public static TransportVersion fromId(int id) { * This will only return the latest known referable 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) { - throw new IllegalStateException("unknown transport version [" + name + "]"); + LevenshteinDistance ld = new LevenshteinDistance(); + List> scoredNames = new ArrayList<>(); + for (String key : VersionsHolder.ALL_VERSIONS_BY_NAME.keySet()) { + float distance = ld.getDistance(name, key); + if (distance > 0.7f) { + scoredNames.add(new Tuple<>(distance, key)); + } + } + StringBuilder message = new StringBuilder("Unknown transport version ["); + message.append(name); + message.append("]."); + if (scoredNames.isEmpty() == false) { + List names = scoredNames.stream().map(Tuple::v2).toList(); + message.append(" Did you mean "); + message.append(names); + message.append("?"); + } + message.append(" If this is a new transport version, run './gradle generateTransportVersion'."); + throw new IllegalStateException(message.toString()); } return known; } diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index e7bb098ef5ae6..92a3a86f4a844 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -438,4 +438,25 @@ public void testComment() { ); assertThat(new TransportVersion(null, 1000000, null).supports(test3), is(true)); } + + public void testMoreLikeThis() { + IllegalStateException ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("to_child_lock_join_query")); + assertThat( + ise.getMessage(), + is( + "Unknown transport version [to_child_lock_join_query]. " + + "Did you mean [to_child_block_join_query]? " + + "If this is a new transport version, run './gradle generateTransportVersion'." + ) + ); + + ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("brand_new_version_unrelated_to_others")); + assertThat( + ise.getMessage(), + is( + "Unknown transport version [brand_new_version_unrelated_to_others]. " + + "If this is a new transport version, run './gradle generateTransportVersion'." + ) + ); + } } From b6985744feee5be5cf788aad6f24f5bc11564654 Mon Sep 17 00:00:00 2001 From: Jack Conradson Date: Thu, 11 Sep 2025 08:54:29 -0700 Subject: [PATCH 2/2] fix test --- .../test/java/org/elasticsearch/TransportVersionTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/TransportVersionTests.java b/server/src/test/java/org/elasticsearch/TransportVersionTests.java index 92a3a86f4a844..be889131ae3e3 100644 --- a/server/src/test/java/org/elasticsearch/TransportVersionTests.java +++ b/server/src/test/java/org/elasticsearch/TransportVersionTests.java @@ -440,12 +440,12 @@ public void testComment() { } public void testMoreLikeThis() { - IllegalStateException ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("to_child_lock_join_query")); + IllegalStateException ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("esql_ixed_index_like")); assertThat( ise.getMessage(), is( - "Unknown transport version [to_child_lock_join_query]. " - + "Did you mean [to_child_block_join_query]? " + "Unknown transport version [esql_ixed_index_like]. " + + "Did you mean [esql_fixed_index_like]? " + "If this is a new transport version, run './gradle generateTransportVersion'." ) );