Skip to content

Commit c288684

Browse files
authored
Use NavigableSet for representing test version sets, rather than List (#121266)
1 parent 68c8fa6 commit c288684

File tree

15 files changed

+149
-185
lines changed

15 files changed

+149
-185
lines changed

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ public static IntFunction<String> generateVersionsLookup(Class<?> versionContain
7878
// replace all version lists with the smallest & greatest versions
7979
versions.replaceAll((k, v) -> {
8080
if (v.size() == 1) {
81-
return List.of(v.get(0));
81+
return List.of(v.getFirst());
8282
} else {
8383
v.sort(Comparator.naturalOrder());
84-
return List.of(v.get(0), v.get(v.size() - 1));
84+
return List.of(v.getFirst(), v.getLast());
8585
}
8686
});
8787

@@ -100,14 +100,14 @@ private static IntFunction<String> lookupFunction(NavigableMap<Integer, List<Ver
100100

101101
String lowerBound, upperBound;
102102
if (versionRange != null) {
103-
lowerBound = versionRange.get(0).toString();
104-
upperBound = lastItem(versionRange).toString();
103+
lowerBound = versionRange.getFirst().toString();
104+
upperBound = versionRange.getLast().toString();
105105
} else {
106106
// infer the bounds from the surrounding entries
107107
var lowerRange = versions.lowerEntry(id);
108108
if (lowerRange != null) {
109109
// the next version is just a guess - might be a newer revision, might be a newer minor or major...
110-
lowerBound = nextVersion(lastItem(lowerRange.getValue())).toString();
110+
lowerBound = nextVersion(lowerRange.getValue().getLast()).toString();
111111
} else {
112112
// a really old version we don't have a record for
113113
// assume it's an old version id - we can just return it directly
@@ -122,7 +122,7 @@ private static IntFunction<String> lookupFunction(NavigableMap<Integer, List<Ver
122122
var upperRange = versions.higherEntry(id);
123123
if (upperRange != null) {
124124
// too hard to guess what version this id might be for using the next version - just use it directly
125-
upperBound = upperRange.getValue().get(0).toString();
125+
upperBound = upperRange.getValue().getFirst().toString();
126126
} else {
127127
// a newer version than all we know about? Can't map it...
128128
upperBound = "[" + id + "]";
@@ -133,10 +133,6 @@ private static IntFunction<String> lookupFunction(NavigableMap<Integer, List<Ver
133133
};
134134
}
135135

136-
private static <T> T lastItem(List<T> list) {
137-
return list.get(list.size() - 1);
138-
}
139-
140136
private static Version nextVersion(Version version) {
141137
return new Version(version.id + 100); // +1 to revision
142138
}

server/src/main/java/org/elasticsearch/index/IndexVersions.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.TreeMap;
2525
import java.util.TreeSet;
2626
import java.util.function.IntFunction;
27-
import java.util.stream.Collectors;
2827

2928
@SuppressWarnings("deprecation")
3029
public class IndexVersions {
@@ -250,10 +249,6 @@ static NavigableMap<Integer, IndexVersion> getAllVersionIds(Class<?> cls) {
250249
return Collections.unmodifiableNavigableMap(builder);
251250
}
252251

253-
static Collection<IndexVersion> getAllWriteVersions() {
254-
return VERSION_IDS.values().stream().filter(v -> v.onOrAfter(IndexVersions.MINIMUM_COMPATIBLE)).collect(Collectors.toSet());
255-
}
256-
257252
static Collection<IndexVersion> getAllVersions() {
258253
return VERSION_IDS.values();
259254
}

server/src/main/java/org/elasticsearch/internal/VersionExtension.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@
1212
import org.elasticsearch.TransportVersion;
1313
import org.elasticsearch.index.IndexVersion;
1414

15-
import java.util.List;
15+
import java.util.Collection;
1616

1717
/**
1818
* Allows plugging in current version elements.
1919
*/
2020
public interface VersionExtension {
2121
/**
22-
* Returns list of {@link TransportVersion} defined by extension
22+
* Returns additional {@link TransportVersion} defined by extension
2323
*/
24-
List<TransportVersion> getTransportVersions();
24+
Collection<TransportVersion> getTransportVersions();
2525

2626
/**
2727
* Returns the {@link IndexVersion} that Elasticsearch should use.

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

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

1515
import java.lang.reflect.Modifier;
16-
import java.util.Collections;
17-
import java.util.List;
1816
import java.util.Set;
1917
import java.util.regex.Matcher;
2018
import java.util.regex.Pattern;
2119

20+
import static org.hamcrest.Matchers.contains;
2221
import static org.hamcrest.Matchers.containsString;
2322
import static org.hamcrest.Matchers.endsWith;
24-
import static org.hamcrest.Matchers.equalTo;
2523
import static org.hamcrest.Matchers.greaterThan;
2624
import static org.hamcrest.Matchers.is;
2725
import static org.hamcrest.Matchers.lessThan;
@@ -69,13 +67,11 @@ public static class DuplicatedIdFakeVersion {
6967
public void testStaticTransportVersionChecks() {
7068
assertThat(
7169
TransportVersions.collectAllVersionIdsDefinedInClass(CorrectFakeVersion.class),
72-
equalTo(
73-
List.of(
74-
CorrectFakeVersion.V_0_000_002,
75-
CorrectFakeVersion.V_0_000_003,
76-
CorrectFakeVersion.V_0_000_004,
77-
CorrectFakeVersion.V_0_00_01
78-
)
70+
contains(
71+
CorrectFakeVersion.V_0_000_002,
72+
CorrectFakeVersion.V_0_000_003,
73+
CorrectFakeVersion.V_0_000_004,
74+
CorrectFakeVersion.V_0_00_01
7975
)
8076
);
8177
AssertionError e = expectThrows(
@@ -184,7 +180,7 @@ public void testVersionConstantPresent() {
184180
}
185181

186182
public void testCURRENTIsLatest() {
187-
assertThat(Collections.max(TransportVersion.getAllVersions()), is(TransportVersion.current()));
183+
assertThat(TransportVersion.getAllVersions().getLast(), is(TransportVersion.current()));
188184
}
189185

190186
public void testPatchVersionsStillAvailable() {

test/framework/src/main/java/org/elasticsearch/index/KnownIndexVersions.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
package org.elasticsearch.index;
1111

12-
import java.util.List;
12+
import java.util.Collections;
13+
import java.util.NavigableSet;
14+
import java.util.TreeSet;
1315

1416
/**
1517
* Provides access to all known index versions
@@ -18,10 +20,12 @@ public class KnownIndexVersions {
1820
/**
1921
* A sorted list of all known index versions
2022
*/
21-
public static final List<IndexVersion> ALL_VERSIONS = List.copyOf(IndexVersions.getAllVersions());
23+
public static final NavigableSet<IndexVersion> ALL_VERSIONS = Collections.unmodifiableNavigableSet(
24+
new TreeSet<>(IndexVersions.getAllVersions())
25+
);
2226

2327
/**
2428
* A sorted list of all known index versions that can be written to
2529
*/
26-
public static final List<IndexVersion> ALL_WRITE_VERSIONS = List.copyOf(IndexVersions.getAllWriteVersions());
30+
public static final NavigableSet<IndexVersion> ALL_WRITE_VERSIONS = ALL_VERSIONS.tailSet(IndexVersions.MINIMUM_COMPATIBLE, true);
2731
}

test/framework/src/main/java/org/elasticsearch/test/AbstractBWCSerializationTestCase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.elasticsearch.xcontent.ToXContent;
1515

1616
import java.io.IOException;
17-
import java.util.List;
17+
import java.util.Collection;
1818

1919
import static org.elasticsearch.test.BWCVersions.DEFAULT_BWC_VERSIONS;
2020

@@ -28,7 +28,7 @@ public abstract class AbstractBWCSerializationTestCase<T extends Writeable & ToX
2828
/**
2929
* The bwc versions to test serialization against
3030
*/
31-
protected List<TransportVersion> bwcVersions() {
31+
protected Collection<TransportVersion> bwcVersions() {
3232
return DEFAULT_BWC_VERSIONS;
3333
}
3434

test/framework/src/main/java/org/elasticsearch/test/BWCVersions.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@
1212
import org.elasticsearch.TransportVersion;
1313
import org.elasticsearch.TransportVersions;
1414

15-
import java.util.Collections;
16-
import java.util.List;
15+
import java.util.NavigableSet;
1716

1817
public final class BWCVersions {
1918
private BWCVersions() {}
2019

21-
public static List<TransportVersion> getAllBWCVersions() {
22-
List<TransportVersion> allVersions = TransportVersion.getAllVersions();
23-
int minCompatVersion = Collections.binarySearch(allVersions, TransportVersions.MINIMUM_COMPATIBLE);
24-
return allVersions.subList(minCompatVersion, allVersions.size());
20+
public static NavigableSet<TransportVersion> getAllBWCVersions() {
21+
return TransportVersionUtils.allReleasedVersions().tailSet(TransportVersions.MINIMUM_COMPATIBLE, true);
2522
}
2623

27-
public static final List<TransportVersion> DEFAULT_BWC_VERSIONS = getAllBWCVersions();
24+
public static final NavigableSet<TransportVersion> DEFAULT_BWC_VERSIONS = getAllBWCVersions();
2825
}

test/framework/src/main/java/org/elasticsearch/test/TransportVersionUtils.java

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,23 @@
1414
import org.elasticsearch.core.Nullable;
1515

1616
import java.util.Collections;
17-
import java.util.List;
17+
import java.util.NavigableSet;
1818
import java.util.Random;
1919
import java.util.Set;
20+
import java.util.TreeSet;
2021
import java.util.stream.Collectors;
2122

23+
import static org.apache.lucene.tests.util.LuceneTestCase.random;
24+
2225
public class TransportVersionUtils {
26+
27+
private static final NavigableSet<TransportVersion> RELEASED_VERSIONS = Collections.unmodifiableNavigableSet(
28+
new TreeSet<>(TransportVersion.getAllVersions())
29+
);
30+
2331
/** Returns all released versions */
24-
public static List<TransportVersion> allReleasedVersions() {
25-
return TransportVersion.getAllVersions();
32+
public static NavigableSet<TransportVersion> allReleasedVersions() {
33+
return RELEASED_VERSIONS;
2634
}
2735

2836
/** Returns the oldest known {@link TransportVersion} */
@@ -32,7 +40,7 @@ public static TransportVersion getFirstVersion() {
3240

3341
/** Returns a random {@link TransportVersion} from all available versions. */
3442
public static TransportVersion randomVersion() {
35-
return ESTestCase.randomFrom(allReleasedVersions());
43+
return VersionUtils.randomFrom(random(), allReleasedVersions(), TransportVersion::fromId);
3644
}
3745

3846
/** Returns a random {@link TransportVersion} from all available versions without the ignore set */
@@ -42,7 +50,7 @@ public static TransportVersion randomVersion(Set<TransportVersion> ignore) {
4250

4351
/** Returns a random {@link TransportVersion} from all available versions. */
4452
public static TransportVersion randomVersion(Random random) {
45-
return allReleasedVersions().get(random.nextInt(allReleasedVersions().size()));
53+
return VersionUtils.randomFrom(random, allReleasedVersions(), TransportVersion::fromId);
4654
}
4755

4856
/** Returns a random {@link TransportVersion} between <code>minVersion</code> and <code>maxVersion</code> (inclusive). */
@@ -55,24 +63,21 @@ public static TransportVersion randomVersionBetween(
5563
throw new IllegalArgumentException("maxVersion [" + maxVersion + "] cannot be less than minVersion [" + minVersion + "]");
5664
}
5765

58-
int minVersionIndex = 0;
59-
List<TransportVersion> allReleasedVersions = allReleasedVersions();
66+
NavigableSet<TransportVersion> versions = allReleasedVersions();
6067
if (minVersion != null) {
61-
minVersionIndex = Collections.binarySearch(allReleasedVersions, minVersion);
68+
if (versions.contains(minVersion) == false) {
69+
throw new IllegalArgumentException("minVersion [" + minVersion + "] does not exist.");
70+
}
71+
versions = versions.tailSet(minVersion, true);
6272
}
63-
int maxVersionIndex = allReleasedVersions.size() - 1;
6473
if (maxVersion != null) {
65-
maxVersionIndex = Collections.binarySearch(allReleasedVersions, maxVersion);
66-
}
67-
if (minVersionIndex < 0) {
68-
throw new IllegalArgumentException("minVersion [" + minVersion + "] does not exist.");
69-
} else if (maxVersionIndex < 0) {
70-
throw new IllegalArgumentException("maxVersion [" + maxVersion + "] does not exist.");
71-
} else {
72-
// minVersionIndex is inclusive so need to add 1 to this index
73-
int range = maxVersionIndex + 1 - minVersionIndex;
74-
return allReleasedVersions.get(minVersionIndex + random.nextInt(range));
74+
if (versions.contains(maxVersion) == false) {
75+
throw new IllegalArgumentException("maxVersion [" + maxVersion + "] does not exist.");
76+
}
77+
versions = versions.headSet(maxVersion, true);
7578
}
79+
80+
return VersionUtils.randomFrom(random, versions, TransportVersion::fromId);
7681
}
7782

7883
public static TransportVersion getPreviousVersion() {
@@ -82,42 +87,28 @@ public static TransportVersion getPreviousVersion() {
8287
}
8388

8489
public static TransportVersion getPreviousVersion(TransportVersion version) {
85-
int place = Collections.binarySearch(allReleasedVersions(), version);
86-
if (place < 0) {
87-
// version does not exist - need the item before the index this version should be inserted
88-
place = -(place + 1);
89-
}
90-
91-
if (place < 1) {
90+
TransportVersion lower = allReleasedVersions().lower(version);
91+
if (lower == null) {
9292
throw new IllegalArgumentException("couldn't find any released versions before [" + version + "]");
9393
}
94-
return allReleasedVersions().get(place - 1);
94+
return lower;
9595
}
9696

9797
public static TransportVersion getNextVersion(TransportVersion version) {
9898
return getNextVersion(version, false);
9999
}
100100

101101
public static TransportVersion getNextVersion(TransportVersion version, boolean createIfNecessary) {
102-
List<TransportVersion> allReleasedVersions = allReleasedVersions();
103-
int place = Collections.binarySearch(allReleasedVersions, version);
104-
if (place < 0) {
105-
// version does not exist - need the item at the index this version should be inserted
106-
place = -(place + 1);
107-
} else {
108-
// need the *next* version
109-
place++;
110-
}
111-
112-
if (place < 0 || place >= allReleasedVersions.size()) {
102+
TransportVersion higher = allReleasedVersions().higher(version);
103+
if (higher == null) {
113104
if (createIfNecessary) {
114105
// create a new transport version one greater than specified
115106
return new TransportVersion(version.id() + 1);
116107
} else {
117108
throw new IllegalArgumentException("couldn't find any released versions after [" + version + "]");
118109
}
119110
}
120-
return allReleasedVersions.get(place);
111+
return higher;
121112
}
122113

123114
/** Returns a random {@code TransportVersion} that is compatible with {@link TransportVersion#current()} */

0 commit comments

Comments
 (0)