19
19
20
20
import java .io .IOException ;
21
21
import java .util .Collection ;
22
- import java .util .Comparator ;
23
22
import java .util .HashMap ;
24
23
import java .util .Map ;
25
24
import java .util .Objects ;
26
- import java .util .stream .Collectors ;
27
- import java .util .stream .Stream ;
28
25
29
26
/**
30
27
* Wraps component version numbers for cluster state
@@ -42,25 +39,35 @@ public record CompatibilityVersions(
42
39
Map <String , org .elasticsearch .indices .SystemIndexDescriptor .MappingsVersion > systemIndexMappingsVersion
43
40
) implements Writeable , ToXContentFragment {
44
41
42
+ public static final CompatibilityVersions EMPTY = new CompatibilityVersions (TransportVersions .MINIMUM_COMPATIBLE , Map .of ());
43
+
45
44
/**
46
45
* Constructs a VersionWrapper collecting all the minimum versions from the values of the map.
47
46
*
48
47
* @param compatibilityVersions A map of strings (typically node identifiers) and versions wrappers
49
48
* @return Minimum versions for the cluster
50
49
*/
51
50
public static CompatibilityVersions minimumVersions (Collection <CompatibilityVersions > compatibilityVersions ) {
52
- TransportVersion minimumTransport = compatibilityVersions .stream ()
53
- .map (CompatibilityVersions ::transportVersion )
54
- .min (Comparator .naturalOrder ())
55
- // In practice transportVersions is always nonempty (except in tests) but use a conservative default anyway:
56
- .orElse (TransportVersions .MINIMUM_COMPATIBLE );
57
-
58
- Map <String , SystemIndexDescriptor .MappingsVersion > minimumMappingsVersions = compatibilityVersions .stream ()
59
- .flatMap (mv -> mv .systemIndexMappingsVersion ().entrySet ().stream ())
60
- .collect (
61
- Collectors .toMap (Map .Entry ::getKey , Map .Entry ::getValue , (v1 , v2 ) -> Stream .of (v1 , v2 ).min (Comparator .naturalOrder ()).get ())
62
- );
63
-
51
+ if (compatibilityVersions .isEmpty ()) {
52
+ return EMPTY ;
53
+ }
54
+ TransportVersion minimumTransport = null ;
55
+ Map <String , SystemIndexDescriptor .MappingsVersion > minimumMappingsVersions = null ;
56
+ for (CompatibilityVersions cv : compatibilityVersions ) {
57
+ TransportVersion version = cv .transportVersion ();
58
+ if (minimumTransport == null ) {
59
+ minimumTransport = version ;
60
+ minimumMappingsVersions = new HashMap <>(cv .systemIndexMappingsVersion ());
61
+ continue ;
62
+ }
63
+ if (version .compareTo (minimumTransport ) < 0 ) {
64
+ minimumTransport = version ;
65
+ }
66
+ for (Map .Entry <String , SystemIndexDescriptor .MappingsVersion > entry : cv .systemIndexMappingsVersion ().entrySet ()) {
67
+ minimumMappingsVersions .merge (entry .getKey (), entry .getValue (), (v1 , v2 ) -> v1 .compareTo (v2 ) < 0 ? v1 : v2 );
68
+ }
69
+ }
70
+ // transportVersions is always non-null since we break out on empty above
64
71
return new CompatibilityVersions (minimumTransport , minimumMappingsVersions );
65
72
}
66
73
0 commit comments