Skip to content

Commit eb6b4e8

Browse files
authored
[8.19] Improve missing tranport version error message (#134506) (#134562)
* 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 test
1 parent 2e94f7e commit eb6b4e8

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-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: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,4 +438,25 @@ public void testComment() {
438438
);
439439
assertThat(new TransportVersion(null, 1000000, null).supports(test3), is(true));
440440
}
441+
442+
public void testMoreLikeThis() {
443+
IllegalStateException ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("esql_ixed_index_like"));
444+
assertThat(
445+
ise.getMessage(),
446+
is(
447+
"Unknown transport version [esql_ixed_index_like]. "
448+
+ "Did you mean [esql_fixed_index_like]? "
449+
+ "If this is a new transport version, run './gradle generateTransportVersion'."
450+
)
451+
);
452+
453+
ise = expectThrows(IllegalStateException.class, () -> TransportVersion.fromName("brand_new_version_unrelated_to_others"));
454+
assertThat(
455+
ise.getMessage(),
456+
is(
457+
"Unknown transport version [brand_new_version_unrelated_to_others]. "
458+
+ "If this is a new transport version, run './gradle generateTransportVersion'."
459+
)
460+
);
461+
}
441462
}

0 commit comments

Comments
 (0)