Skip to content

Commit 74a9d26

Browse files
authored
[9.0] Improve missing tranport version error message (#134506) (#134556)
* 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. * fix tests
1 parent 55c0a28 commit 74a9d26

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
package org.elasticsearch;
1111

12+
import org.apache.lucene.search.spell.LevenshteinDistance;
1213
import org.elasticsearch.common.VersionId;
1314
import org.elasticsearch.common.io.stream.StreamInput;
1415
import org.elasticsearch.common.io.stream.StreamOutput;
16+
import org.elasticsearch.core.Tuple;
1517
import org.elasticsearch.internal.VersionExtension;
1618
import org.elasticsearch.plugins.ExtensionLoader;
1719

@@ -234,12 +236,29 @@ public static TransportVersion fromId(int id) {
234236
* This will only return the latest known referable transport version for a given name and not its
235237
* patch versions. Patch versions are constructed as a linked list internally and may be found by
236238
* cycling through them in a loop using {@link TransportVersion#nextPatchVersion()}.
237-
*
238239
*/
239240
public static TransportVersion fromName(String name) {
240241
TransportVersion known = VersionsHolder.ALL_VERSIONS_BY_NAME.get(name);
241242
if (known == null) {
242-
throw new IllegalStateException("unknown transport version [" + name + "]");
243+
LevenshteinDistance ld = new LevenshteinDistance();
244+
List<Tuple<Float, String>> scoredNames = new ArrayList<>();
245+
for (String key : VersionsHolder.ALL_VERSIONS_BY_NAME.keySet()) {
246+
float distance = ld.getDistance(name, key);
247+
if (distance > 0.7f) {
248+
scoredNames.add(new Tuple<>(distance, key));
249+
}
250+
}
251+
StringBuilder message = new StringBuilder("Unknown transport version [");
252+
message.append(name);
253+
message.append("].");
254+
if (scoredNames.isEmpty() == false) {
255+
List<String> names = scoredNames.stream().map(Tuple::v2).toList();
256+
message.append(" Did you mean ");
257+
message.append(names);
258+
message.append("?");
259+
}
260+
message.append(" If this is a new transport version, run './gradle generateTransportVersion'.");
261+
throw new IllegalStateException(message.toString());
243262
}
244263
return known;
245264
}

server/src/test/java/org/elasticsearch/TransportVersionTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,18 @@ public void testComment() {
400400
);
401401
assertThat(new TransportVersion(null, 1000000, null).supports(test3), is(true));
402402
}
403+
404+
public void testMoreLikeThis() {
405+
IllegalStateException ise = expectThrows(
406+
IllegalStateException.class,
407+
() -> TransportVersion.fromName("brand_new_version_unrelated_to_others")
408+
);
409+
assertThat(
410+
ise.getMessage(),
411+
is(
412+
"Unknown transport version [brand_new_version_unrelated_to_others]. "
413+
+ "If this is a new transport version, run './gradle generateTransportVersion'."
414+
)
415+
);
416+
}
403417
}

0 commit comments

Comments
 (0)