Skip to content

Commit 2ad845f

Browse files
committed
Update TransportVersion to support a new model (elastic#131488)
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 de1d79b commit 2ad845f

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
@@ -12,15 +12,13 @@
1212
import org.elasticsearch.core.Assertions;
1313

1414
import java.lang.reflect.Field;
15-
import java.util.Collection;
15+
import java.util.ArrayList;
1616
import java.util.Collections;
1717
import java.util.HashMap;
18+
import java.util.List;
1819
import java.util.Map;
19-
import java.util.NavigableMap;
2020
import java.util.Set;
21-
import java.util.TreeMap;
2221
import java.util.TreeSet;
23-
import java.util.function.IntFunction;
2422

2523
/**
2624
* <p>Transport version is used to coordinate compatible wire protocol communication between nodes, at a fine-grained level. This replaces
@@ -325,21 +323,14 @@ static TransportVersion def(int id) {
325323
*/
326324
public static final TransportVersion MINIMUM_CCS_VERSION = RETRY_ILM_ASYNC_ACTION_REQUIRE_ERROR_8_18;
327325

328-
static final NavigableMap<Integer, TransportVersion> VERSION_IDS = getAllVersionIds(TransportVersions.class);
329-
330-
// the highest transport version constant defined in this file, used as a fallback for TransportVersion.current()
331-
static final TransportVersion LATEST_DEFINED;
332-
static {
333-
LATEST_DEFINED = VERSION_IDS.lastEntry().getValue();
334-
335-
// see comment on IDS field
336-
// now we're registered all the transport versions, we can clear the map
337-
IDS = null;
338-
}
326+
/**
327+
* Sorted list of all versions defined in this class
328+
*/
329+
static final List<TransportVersion> DEFINED_VERSIONS = collectAllVersionIdsDefinedInClass(TransportVersions.class);
339330

340-
public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?> cls) {
331+
public static List<TransportVersion> collectAllVersionIdsDefinedInClass(Class<?> cls) {
341332
Map<Integer, String> versionIdFields = new HashMap<>();
342-
NavigableMap<Integer, TransportVersion> builder = new TreeMap<>();
333+
List<TransportVersion> definedTransportVersions = new ArrayList<>();
343334

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

@@ -356,7 +347,7 @@ public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?>
356347
} catch (IllegalAccessException e) {
357348
throw new AssertionError(e);
358349
}
359-
builder.put(version.id(), version);
350+
definedTransportVersions.add(version);
360351

361352
if (Assertions.ENABLED) {
362353
// check the version number is unique
@@ -373,15 +364,11 @@ public static NavigableMap<Integer, TransportVersion> getAllVersionIds(Class<?>
373364
}
374365
}
375366

376-
return Collections.unmodifiableNavigableMap(builder);
377-
}
367+
Collections.sort(definedTransportVersions);
378368

379-
static Collection<TransportVersion> getAllVersions() {
380-
return VERSION_IDS.values();
369+
return List.copyOf(definedTransportVersions);
381370
}
382371

383-
static final IntFunction<String> VERSION_LOOKUP = ReleaseVersions.generateVersionsLookup(TransportVersions.class, LATEST_DEFINED.id());
384-
385372
// no instance
386373
private TransportVersions() {}
387374
}
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;
@@ -37,7 +36,7 @@ public class TransportVersionTests extends ESTestCase {
3736
* If the test fails, there is something wrong with your backport PR.
3837
*/
3938
public void testMaximumAllowedTransportVersion() {
40-
assertThat(TransportVersions.LATEST_DEFINED.isPatchFrom(TransportVersions.INITIAL_ELASTICSEARCH_8_19), is(true));
39+
assertThat(TransportVersion.current().isPatchFrom(TransportVersions.INITIAL_ELASTICSEARCH_8_19), is(true));
4140
}
4241

4342
public void testVersionComparison() {
@@ -79,21 +78,18 @@ public static class DuplicatedIdFakeVersion {
7978

8079
public void testStaticTransportVersionChecks() {
8180
assertThat(
82-
TransportVersions.getAllVersionIds(CorrectFakeVersion.class),
83-
equalTo(
84-
Map.of(
85-
199,
86-
CorrectFakeVersion.V_0_00_01,
87-
2,
88-
CorrectFakeVersion.V_0_000_002,
89-
3,
90-
CorrectFakeVersion.V_0_000_003,
91-
4,
92-
CorrectFakeVersion.V_0_000_004
93-
)
81+
TransportVersions.collectAllVersionIdsDefinedInClass(CorrectFakeVersion.class),
82+
contains(
83+
CorrectFakeVersion.V_0_000_002,
84+
CorrectFakeVersion.V_0_000_003,
85+
CorrectFakeVersion.V_0_000_004,
86+
CorrectFakeVersion.V_0_00_01
9487
)
9588
);
96-
AssertionError e = expectThrows(AssertionError.class, () -> TransportVersions.getAllVersionIds(DuplicatedIdFakeVersion.class));
89+
AssertionError e = expectThrows(
90+
AssertionError.class,
91+
() -> TransportVersions.collectAllVersionIdsDefinedInClass(DuplicatedIdFakeVersion.class)
92+
);
9793
assertThat(e.getMessage(), containsString("have the same version number"));
9894
}
9995

@@ -196,7 +192,7 @@ public void testVersionConstantPresent() {
196192
}
197193

198194
public void testCURRENTIsLatest() {
199-
assertThat(Collections.max(TransportVersions.getAllVersions()), is(TransportVersion.current()));
195+
assertThat(Collections.max(TransportVersion.getAllVersions()), is(TransportVersion.current()));
200196
}
201197

202198
public void testPatchVersionsStillAvailable() {
@@ -233,7 +229,7 @@ public void testToString() {
233229
public void testDenseTransportVersions() {
234230
Set<Integer> missingVersions = new TreeSet<>();
235231
TransportVersion previous = null;
236-
for (var tv : TransportVersions.getAllVersions()) {
232+
for (var tv : TransportVersion.getAllVersions()) {
237233
if (tv.before(TransportVersions.V_8_16_0)) {
238234
continue;
239235
}
@@ -261,7 +257,7 @@ public void testDenseTransportVersions() {
261257
}
262258

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