Skip to content

Commit 48b60ce

Browse files
authored
Update TransportVersion to support a new model (#131488) (#131889) (#132047)
This change updates `TransportVersion` to support our new model while still allowing the old model to work as well giving us time to migrate.
1 parent a8114cc commit 48b60ce

File tree

15 files changed

+414
-62
lines changed

15 files changed

+414
-62
lines changed

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

Lines changed: 263 additions & 18 deletions
Large diffs are not rendered by default.

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

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,13 @@
1313
import org.elasticsearch.core.UpdateForV9;
1414

1515
import java.lang.reflect.Field;
16-
import java.util.Collection;
16+
import java.util.ArrayList;
1717
import java.util.Collections;
1818
import java.util.HashMap;
19+
import java.util.List;
1920
import java.util.Map;
20-
import java.util.NavigableMap;
2121
import java.util.Set;
22-
import java.util.TreeMap;
2322
import java.util.TreeSet;
24-
import java.util.function.IntFunction;
2523

2624
/**
2725
* <p>Transport version is used to coordinate compatible wire protocol communication between nodes, at a fine-grained level. This replaces
@@ -262,21 +260,14 @@ static TransportVersion def(int id) {
262260
*/
263261
public static final TransportVersion MINIMUM_CCS_VERSION = QUERY_RULES_LIST_INCLUDES_TYPES_BACKPORT_8_16;
264262

265-
static final NavigableMap<Integer, TransportVersion> VERSION_IDS = getAllVersionIds(TransportVersions.class);
266-
267-
// the highest transport version constant defined in this file, used as a fallback for TransportVersion.current()
268-
static final TransportVersion LATEST_DEFINED;
269-
static {
270-
LATEST_DEFINED = VERSION_IDS.lastEntry().getValue();
271-
272-
// see comment on IDS field
273-
// now we're registered all the transport versions, we can clear the map
274-
IDS = null;
275-
}
263+
/**
264+
* Sorted list of all versions defined in this class
265+
*/
266+
static final List<TransportVersion> DEFINED_VERSIONS = collectAllVersionIdsDefinedInClass(TransportVersions.class);
276267

277-
public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?> cls) {
268+
public static List<TransportVersion> collectAllVersionIdsDefinedInClass(Class<?> cls) {
278269
Map<Integer, String> versionIdFields = new HashMap<>();
279-
NavigableMap<Integer, TransportVersion> builder = new TreeMap<>();
270+
List<TransportVersion> definedTransportVersions = new ArrayList<>();
280271

281272
Set<String> ignore = Set.of("ZERO", "CURRENT", "MINIMUM_COMPATIBLE", "MINIMUM_CCS_VERSION");
282273

@@ -293,7 +284,7 @@ public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?>
293284
} catch (IllegalAccessException e) {
294285
throw new AssertionError(e);
295286
}
296-
builder.put(version.id(), version);
287+
definedTransportVersions.add(version);
297288

298289
if (Assertions.ENABLED) {
299290
// check the version number is unique
@@ -310,15 +301,11 @@ public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?>
310301
}
311302
}
312303

313-
return Collections.unmodifiableNavigableMap(builder);
314-
}
304+
Collections.sort(definedTransportVersions);
315305

316-
static Collection<TransportVersion> getAllVersions() {
317-
return VERSION_IDS.values();
306+
return List.copyOf(definedTransportVersions);
318307
}
319308

320-
static final IntFunction<String> VERSION_LOOKUP = ReleaseVersions.generateVersionsLookup(TransportVersions.class, LATEST_DEFINED.id());
321-
322309
// no instance
323310
private TransportVersions() {}
324311
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder,8840007
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder,8841064
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder,9000014
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder,9112003
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder,9130000

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

Lines changed: 123 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
import java.lang.reflect.Modifier;
1616
import java.util.Collections;
1717
import java.util.List;
18-
import java.util.Map;
1918
import java.util.Set;
2019
import java.util.TreeSet;
2120
import java.util.regex.Matcher;
2221
import java.util.regex.Pattern;
2322

23+
import static org.hamcrest.Matchers.contains;
2424
import static org.hamcrest.Matchers.containsString;
2525
import static org.hamcrest.Matchers.endsWith;
26-
import static org.hamcrest.Matchers.equalTo;
2726
import static org.hamcrest.Matchers.greaterThan;
2827
import static org.hamcrest.Matchers.is;
2928
import static org.hamcrest.Matchers.lessThan;
@@ -35,7 +34,7 @@ public class TransportVersionTests extends ESTestCase {
3534
* This test is specific for 8.18, to ensure that transport versions are backported correctly. Do not forward or backport it.
3635
*/
3736
public void testMaximumAllowedTransportVersion() {
38-
assertThat(TransportVersions.LATEST_DEFINED.isPatchFrom(TransportVersions.ML_INFERENCE_IBM_WATSONX_RERANK_ADDED), is(true));
37+
assertThat(TransportVersion.current().isPatchFrom(TransportVersions.ML_INFERENCE_IBM_WATSONX_RERANK_ADDED), is(true));
3938
}
4039

4140
public void testVersionComparison() {
@@ -77,21 +76,18 @@ public static class DuplicatedIdFakeVersion {
7776

7877
public void testStaticTransportVersionChecks() {
7978
assertThat(
80-
TransportVersions.getAllVersionIds(CorrectFakeVersion.class),
81-
equalTo(
82-
Map.of(
83-
199,
84-
CorrectFakeVersion.V_0_00_01,
85-
2,
86-
CorrectFakeVersion.V_0_000_002,
87-
3,
88-
CorrectFakeVersion.V_0_000_003,
89-
4,
90-
CorrectFakeVersion.V_0_000_004
91-
)
79+
TransportVersions.collectAllVersionIdsDefinedInClass(CorrectFakeVersion.class),
80+
contains(
81+
CorrectFakeVersion.V_0_000_002,
82+
CorrectFakeVersion.V_0_000_003,
83+
CorrectFakeVersion.V_0_000_004,
84+
CorrectFakeVersion.V_0_00_01
9285
)
9386
);
94-
AssertionError e = expectThrows(AssertionError.class, () -> TransportVersions.getAllVersionIds(DuplicatedIdFakeVersion.class));
87+
AssertionError e = expectThrows(
88+
AssertionError.class,
89+
() -> TransportVersions.collectAllVersionIdsDefinedInClass(DuplicatedIdFakeVersion.class)
90+
);
9591
assertThat(e.getMessage(), containsString("have the same version number"));
9692
}
9793

@@ -194,7 +190,7 @@ public void testVersionConstantPresent() {
194190
}
195191

196192
public void testCURRENTIsLatest() {
197-
assertThat(Collections.max(TransportVersions.getAllVersions()), is(TransportVersion.current()));
193+
assertThat(Collections.max(TransportVersion.getAllVersions()), is(TransportVersion.current()));
198194
}
199195

200196
public void testPatchVersionsStillAvailable() {
@@ -231,7 +227,7 @@ public void testToString() {
231227
public void testDenseTransportVersions() {
232228
Set<Integer> missingVersions = new TreeSet<>();
233229
TransportVersion previous = null;
234-
for (var tv : TransportVersions.getAllVersions()) {
230+
for (var tv : TransportVersion.getAllVersions()) {
235231
if (tv.before(TransportVersions.V_8_16_0)) {
236232
continue;
237233
}
@@ -259,7 +255,7 @@ public void testDenseTransportVersions() {
259255
}
260256

261257
public void testDuplicateConstants() {
262-
List<TransportVersion> tvs = TransportVersions.getAllVersions().stream().sorted().toList();
258+
List<TransportVersion> tvs = TransportVersion.getAllVersions().stream().sorted().toList();
263259
TransportVersion previous = tvs.get(0);
264260
for (int i = 1; i < tvs.size(); i++) {
265261
TransportVersion next = tvs.get(i);
@@ -269,4 +265,112 @@ public void testDuplicateConstants() {
269265
previous = next;
270266
}
271267
}
268+
269+
public void testFromName() {
270+
assertThat(TransportVersion.fromName("test_0"), is(new TransportVersion("test_0", 3001000, null)));
271+
assertThat(TransportVersion.fromName("test_1"), is(new TransportVersion("test_1", 3002000, null)));
272+
assertThat(
273+
TransportVersion.fromName("test_2"),
274+
is(
275+
new TransportVersion(
276+
"test_2",
277+
3003000,
278+
new TransportVersion("test_2", 2001001, new TransportVersion("test_2", 1001001, null))
279+
)
280+
)
281+
);
282+
assertThat(
283+
TransportVersion.fromName("test_3"),
284+
is(new TransportVersion("test_3", 3003001, new TransportVersion("test_3", 2001002, null)))
285+
);
286+
assertThat(
287+
TransportVersion.fromName("test_4"),
288+
is(
289+
new TransportVersion(
290+
"test_4",
291+
3003002,
292+
new TransportVersion("test_4", 2001003, new TransportVersion("test_4", 1001002, null))
293+
)
294+
)
295+
);
296+
}
297+
298+
public void testSupports() {
299+
TransportVersion test0 = TransportVersion.fromName("test_0");
300+
assertThat(new TransportVersion(null, 2003000, null).supports(test0), is(false));
301+
assertThat(new TransportVersion(null, 3001000, null).supports(test0), is(true));
302+
assertThat(new TransportVersion(null, 100001001, null).supports(test0), is(true));
303+
304+
TransportVersion test1 = TransportVersion.fromName("test_1");
305+
assertThat(new TransportVersion(null, 2003000, null).supports(test1), is(false));
306+
assertThat(new TransportVersion(null, 3001000, null).supports(test1), is(false));
307+
assertThat(new TransportVersion(null, 3001001, null).supports(test1), is(false));
308+
assertThat(new TransportVersion(null, 3002000, null).supports(test1), is(true));
309+
assertThat(new TransportVersion(null, 100001000, null).supports(test1), is(true));
310+
assertThat(new TransportVersion(null, 100001001, null).supports(test1), is(true));
311+
312+
TransportVersion test2 = TransportVersion.fromName("test_2");
313+
assertThat(new TransportVersion(null, 1001000, null).supports(test2), is(false));
314+
assertThat(new TransportVersion(null, 1001001, null).supports(test2), is(true));
315+
assertThat(new TransportVersion(null, 1001002, null).supports(test2), is(true));
316+
assertThat(new TransportVersion(null, 1002000, null).supports(test2), is(false));
317+
assertThat(new TransportVersion(null, 1002001, null).supports(test2), is(false));
318+
assertThat(new TransportVersion(null, 2001000, null).supports(test2), is(false));
319+
assertThat(new TransportVersion(null, 2001001, null).supports(test2), is(true));
320+
assertThat(new TransportVersion(null, 2001002, null).supports(test2), is(true));
321+
assertThat(new TransportVersion(null, 2003000, null).supports(test2), is(false));
322+
assertThat(new TransportVersion(null, 2003001, null).supports(test2), is(false));
323+
assertThat(new TransportVersion(null, 3001000, null).supports(test2), is(false));
324+
assertThat(new TransportVersion(null, 3001001, null).supports(test2), is(false));
325+
assertThat(new TransportVersion(null, 3003000, null).supports(test2), is(true));
326+
assertThat(new TransportVersion(null, 3003001, null).supports(test2), is(true));
327+
assertThat(new TransportVersion(null, 3003002, null).supports(test2), is(true));
328+
assertThat(new TransportVersion(null, 3003003, null).supports(test2), is(true));
329+
assertThat(new TransportVersion(null, 100001000, null).supports(test2), is(true));
330+
assertThat(new TransportVersion(null, 100001001, null).supports(test2), is(true));
331+
332+
TransportVersion test3 = TransportVersion.fromName("test_3");
333+
assertThat(new TransportVersion(null, 1001001, null).supports(test3), is(false));
334+
assertThat(new TransportVersion(null, 1001002, null).supports(test3), is(false));
335+
assertThat(new TransportVersion(null, 1001003, null).supports(test3), is(false));
336+
assertThat(new TransportVersion(null, 1002001, null).supports(test3), is(false));
337+
assertThat(new TransportVersion(null, 1002002, null).supports(test3), is(false));
338+
assertThat(new TransportVersion(null, 2001001, null).supports(test3), is(false));
339+
assertThat(new TransportVersion(null, 2001002, null).supports(test3), is(true));
340+
assertThat(new TransportVersion(null, 2001003, null).supports(test3), is(true));
341+
assertThat(new TransportVersion(null, 2003000, null).supports(test3), is(false));
342+
assertThat(new TransportVersion(null, 2003001, null).supports(test3), is(false));
343+
assertThat(new TransportVersion(null, 3001000, null).supports(test3), is(false));
344+
assertThat(new TransportVersion(null, 3001001, null).supports(test3), is(false));
345+
assertThat(new TransportVersion(null, 3003000, null).supports(test3), is(false));
346+
assertThat(new TransportVersion(null, 3003001, null).supports(test3), is(true));
347+
assertThat(new TransportVersion(null, 3003002, null).supports(test3), is(true));
348+
assertThat(new TransportVersion(null, 3003003, null).supports(test3), is(true));
349+
assertThat(new TransportVersion(null, 3004000, null).supports(test3), is(true));
350+
assertThat(new TransportVersion(null, 100001000, null).supports(test3), is(true));
351+
assertThat(new TransportVersion(null, 100001001, null).supports(test3), is(true));
352+
353+
TransportVersion test4 = TransportVersion.fromName("test_4");
354+
assertThat(new TransportVersion(null, 1001001, null).supports(test4), is(false));
355+
assertThat(new TransportVersion(null, 1001002, null).supports(test4), is(true));
356+
assertThat(new TransportVersion(null, 1001003, null).supports(test4), is(true));
357+
assertThat(new TransportVersion(null, 1002001, null).supports(test4), is(false));
358+
assertThat(new TransportVersion(null, 1002002, null).supports(test4), is(false));
359+
assertThat(new TransportVersion(null, 1002003, null).supports(test3), is(false));
360+
assertThat(new TransportVersion(null, 2001002, null).supports(test4), is(false));
361+
assertThat(new TransportVersion(null, 2001003, null).supports(test4), is(true));
362+
assertThat(new TransportVersion(null, 2001004, null).supports(test4), is(true));
363+
assertThat(new TransportVersion(null, 2003000, null).supports(test4), is(false));
364+
assertThat(new TransportVersion(null, 2003001, null).supports(test4), is(false));
365+
assertThat(new TransportVersion(null, 3001000, null).supports(test4), is(false));
366+
assertThat(new TransportVersion(null, 3001001, null).supports(test4), is(false));
367+
assertThat(new TransportVersion(null, 3003000, null).supports(test4), is(false));
368+
assertThat(new TransportVersion(null, 3003001, null).supports(test4), is(false));
369+
assertThat(new TransportVersion(null, 3003002, null).supports(test4), is(true));
370+
assertThat(new TransportVersion(null, 3003003, null).supports(test4), is(true));
371+
assertThat(new TransportVersion(null, 3003004, null).supports(test4), is(true));
372+
assertThat(new TransportVersion(null, 3004000, null).supports(test4), is(true));
373+
assertThat(new TransportVersion(null, 100001000, null).supports(test4), is(true));
374+
assertThat(new TransportVersion(null, 100001001, null).supports(test4), is(true));
375+
}
272376
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
test_0.csv
2+
test_1.csv
3+
test_2.csv
4+
test_3.csv
5+
test_4.csv
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
100001000,3001000

0 commit comments

Comments
 (0)