Skip to content

Commit 922d9fd

Browse files
authored
Improve missing tranport version error message (#134506) (#134565)
This updates the error message to use a "more like this" algorithm to suggest transport versions that may exist but are misspelled.
1 parent 8f75162 commit 922d9fd

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

1618
import java.io.BufferedReader;
1719
import java.io.IOException;
@@ -225,12 +227,29 @@ public static TransportVersion fromId(int id) {
225227
* This will only return the latest known referable transport version for a given name and not its
226228
* patch versions. Patch versions are constructed as a linked list internally and may be found by
227229
* cycling through them in a loop using {@link TransportVersion#nextPatchVersion()}.
228-
*
229230
*/
230231
public static TransportVersion fromName(String name) {
231232
TransportVersion known = VersionsHolder.ALL_VERSIONS_BY_NAME.get(name);
232233
if (known == null) {
233-
throw new IllegalStateException("unknown transport version [" + name + "]");
234+
LevenshteinDistance ld = new LevenshteinDistance();
235+
List<Tuple<Float, String>> scoredNames = new ArrayList<>();
236+
for (String key : VersionsHolder.ALL_VERSIONS_BY_NAME.keySet()) {
237+
float distance = ld.getDistance(name, key);
238+
if (distance > 0.7f) {
239+
scoredNames.add(new Tuple<>(distance, key));
240+
}
241+
}
242+
StringBuilder message = new StringBuilder("Unknown transport version [");
243+
message.append(name);
244+
message.append("].");
245+
if (scoredNames.isEmpty() == false) {
246+
List<String> names = scoredNames.stream().map(Tuple::v2).toList();
247+
message.append(" Did you mean ");
248+
message.append(names);
249+
message.append("?");
250+
}
251+
message.append(" If this is a new transport version, run './gradle generateTransportVersion'.");
252+
throw new IllegalStateException(message.toString());
234253
}
235254
return known;
236255
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,4 +436,18 @@ public void testComment() {
436436
);
437437
assertThat(new TransportVersion(null, 1000000, null).supports(test3), is(true));
438438
}
439+
440+
public void testMoreLikeThis() {
441+
IllegalStateException ise = expectThrows(
442+
IllegalStateException.class,
443+
() -> TransportVersion.fromName("brand_new_version_unrelated_to_others")
444+
);
445+
assertThat(
446+
ise.getMessage(),
447+
is(
448+
"Unknown transport version [brand_new_version_unrelated_to_others]. "
449+
+ "If this is a new transport version, run './gradle generateTransportVersion'."
450+
)
451+
);
452+
}
439453
}

0 commit comments

Comments
 (0)