Skip to content

Commit 031a80d

Browse files
authored
Use BuildVersion rather than Version for reserved state version (#115406)
1 parent 8a3540f commit 031a80d

File tree

10 files changed

+57
-37
lines changed

10 files changed

+57
-37
lines changed

server/src/main/java/org/elasticsearch/common/settings/LocallyMountedSecrets.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111

1212
import org.apache.lucene.util.SetOnce;
1313
import org.elasticsearch.TransportVersion;
14-
import org.elasticsearch.Version;
1514
import org.elasticsearch.common.hash.MessageDigests;
1615
import org.elasticsearch.common.io.stream.StreamInput;
1716
import org.elasticsearch.common.io.stream.StreamOutput;
1817
import org.elasticsearch.common.io.stream.Writeable;
18+
import org.elasticsearch.env.BuildVersion;
1919
import org.elasticsearch.env.Environment;
2020
import org.elasticsearch.reservedstate.service.ReservedStateVersion;
2121
import org.elasticsearch.xcontent.ConstructingObjectParser;
@@ -130,7 +130,7 @@ public LocallyMountedSecrets(Environment environment) {
130130
throw new IllegalStateException("Error processing secrets file", e);
131131
}
132132
} else {
133-
secrets.set(new LocalFileSecrets(Map.of(), new ReservedStateVersion(-1L, Version.CURRENT)));
133+
secrets.set(new LocalFileSecrets(Map.of(), new ReservedStateVersion(-1L, BuildVersion.current())));
134134
}
135135
this.secretsDir = secretsDirPath.toString();
136136
this.secretsFile = secretsFilePath.toString();

server/src/main/java/org/elasticsearch/env/BuildVersion.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ public static BuildVersion fromVersionId(int versionId) {
7272
return CurrentExtensionHolder.BUILD_EXTENSION.fromVersionId(versionId);
7373
}
7474

75+
/**
76+
* Create a {@link BuildVersion} from a version string.
77+
*
78+
* @param version A string representation of a version
79+
* @return a version representing a build or release of Elasticsearch
80+
*/
81+
public static BuildVersion fromString(String version) {
82+
return CurrentExtensionHolder.BUILD_EXTENSION.fromString(version);
83+
}
84+
7585
/**
7686
* Get the current build version.
7787
*
@@ -110,6 +120,11 @@ public BuildVersion currentBuildVersion() {
110120
public BuildVersion fromVersionId(int versionId) {
111121
return new DefaultBuildVersion(versionId);
112122
}
123+
124+
@Override
125+
public BuildVersion fromString(String version) {
126+
return new DefaultBuildVersion(version);
127+
}
113128
}
114129

115130
}

server/src/main/java/org/elasticsearch/env/DefaultBuildVersion.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@ final class DefaultBuildVersion extends BuildVersion {
2828

2929
public static BuildVersion CURRENT = new DefaultBuildVersion(Version.CURRENT.id());
3030

31-
private final int versionId;
3231
private final Version version;
3332

3433
DefaultBuildVersion(int versionId) {
3534
assert versionId >= 0 : "Release version IDs must be non-negative integers";
36-
this.versionId = versionId;
3735
this.version = Version.fromId(versionId);
3836
}
3937

38+
DefaultBuildVersion(String version) {
39+
this.version = Version.fromString(Objects.requireNonNull(version));
40+
}
41+
4042
@Override
4143
public boolean onOrAfterMinimumCompatible() {
4244
return Version.CURRENT.minimumCompatibilityVersion().onOrBefore(version);
@@ -49,20 +51,20 @@ public boolean isFutureVersion() {
4951

5052
@Override
5153
public int id() {
52-
return versionId;
54+
return version.id();
5355
}
5456

5557
@Override
5658
public boolean equals(Object o) {
5759
if (this == o) return true;
5860
if (o == null || getClass() != o.getClass()) return false;
5961
DefaultBuildVersion that = (DefaultBuildVersion) o;
60-
return versionId == that.versionId;
62+
return version.equals(that.version);
6163
}
6264

6365
@Override
6466
public int hashCode() {
65-
return Objects.hash(versionId);
67+
return Objects.hash(version.id());
6668
}
6769

6870
@Override

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,9 @@ default boolean hasReleaseVersioning() {
3838
* Returns the {@link BuildVersion} for a given version identifier.
3939
*/
4040
BuildVersion fromVersionId(int versionId);
41+
42+
/**
43+
* Returns the {@link BuildVersion} for a given version string.
44+
*/
45+
BuildVersion fromString(String version);
4146
}

server/src/main/java/org/elasticsearch/reservedstate/service/ReservedClusterStateService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
14-
import org.elasticsearch.Version;
1514
import org.elasticsearch.action.ActionListener;
1615
import org.elasticsearch.action.ActionResponse;
1716
import org.elasticsearch.cluster.ClusterState;
@@ -22,6 +21,7 @@
2221
import org.elasticsearch.cluster.service.MasterServiceTaskQueue;
2322
import org.elasticsearch.common.Priority;
2423
import org.elasticsearch.core.Tuple;
24+
import org.elasticsearch.env.BuildVersion;
2525
import org.elasticsearch.reservedstate.ReservedClusterStateHandler;
2626
import org.elasticsearch.reservedstate.TransformState;
2727
import org.elasticsearch.xcontent.ConstructingObjectParser;
@@ -158,7 +158,7 @@ public void process(
158158
}
159159

160160
public void initEmpty(String namespace, ActionListener<ActionResponse.Empty> listener) {
161-
var missingVersion = new ReservedStateVersion(EMPTY_VERSION, Version.CURRENT);
161+
var missingVersion = new ReservedStateVersion(EMPTY_VERSION, BuildVersion.current());
162162
var emptyState = new ReservedStateChunk(Map.of(), missingVersion);
163163
updateTaskQueue.submitTask(
164164
"empty initial cluster state [" + namespace + "]",

server/src/main/java/org/elasticsearch/reservedstate/service/ReservedStateUpdateTask.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
14-
import org.elasticsearch.Version;
1514
import org.elasticsearch.action.ActionListener;
1615
import org.elasticsearch.action.ActionResponse;
1716
import org.elasticsearch.cluster.ClusterState;
@@ -162,11 +161,11 @@ static boolean checkMetadataVersion(
162161
ReservedStateVersion reservedStateVersion,
163162
ReservedStateVersionCheck versionCheck
164163
) {
165-
if (Version.CURRENT.before(reservedStateVersion.minCompatibleVersion())) {
164+
if (reservedStateVersion.buildVersion().isFutureVersion()) {
166165
logger.warn(
167166
() -> format(
168167
"Reserved cluster state version [%s] for namespace [%s] is not compatible with this Elasticsearch node",
169-
reservedStateVersion.minCompatibleVersion(),
168+
reservedStateVersion.buildVersion(),
170169
namespace
171170
)
172171
);

server/src/main/java/org/elasticsearch/reservedstate/service/ReservedStateVersion.java

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

1010
package org.elasticsearch.reservedstate.service;
1111

12-
import org.elasticsearch.Version;
1312
import org.elasticsearch.common.io.stream.StreamInput;
1413
import org.elasticsearch.common.io.stream.StreamOutput;
1514
import org.elasticsearch.common.io.stream.Writeable;
15+
import org.elasticsearch.env.BuildVersion;
1616
import org.elasticsearch.xcontent.ConstructingObjectParser;
1717
import org.elasticsearch.xcontent.ParseField;
1818
import org.elasticsearch.xcontent.XContentParser;
@@ -23,7 +23,7 @@
2323
* File settings metadata class that holds information about
2424
* versioning and Elasticsearch version compatibility
2525
*/
26-
public record ReservedStateVersion(Long version, Version compatibleWith) implements Writeable {
26+
public record ReservedStateVersion(Long version, BuildVersion buildVersion) implements Writeable {
2727

2828
public static final ParseField VERSION = new ParseField("version");
2929
public static final ParseField COMPATIBILITY = new ParseField("compatibility");
@@ -32,7 +32,7 @@ public record ReservedStateVersion(Long version, Version compatibleWith) impleme
3232
"reserved_cluster_state_version_metadata",
3333
a -> {
3434
Long updateId = Long.parseLong((String) a[0]);
35-
Version minCompatVersion = Version.fromString((String) a[1]);
35+
BuildVersion minCompatVersion = BuildVersion.fromString((String) a[1]);
3636

3737
return new ReservedStateVersion(updateId, minCompatVersion);
3838
}
@@ -47,17 +47,13 @@ public static ReservedStateVersion parse(XContentParser parser) {
4747
return PARSER.apply(parser, null);
4848
}
4949

50-
public Version minCompatibleVersion() {
51-
return compatibleWith;
52-
}
53-
5450
public static ReservedStateVersion readFrom(StreamInput input) throws IOException {
55-
return new ReservedStateVersion(input.readLong(), Version.readVersion(input));
51+
return new ReservedStateVersion(input.readLong(), BuildVersion.fromVersionId(input.readVInt()));
5652
}
5753

5854
@Override
5955
public void writeTo(StreamOutput out) throws IOException {
6056
out.writeLong(version());
61-
Version.writeVersion(compatibleWith(), out);
57+
out.writeVInt(buildVersion().id());
6258
}
6359
}

server/src/test/java/org/elasticsearch/reservedstate/service/FileSettingsServiceTests.java

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

1010
package org.elasticsearch.reservedstate.service;
1111

12-
import org.elasticsearch.Version;
1312
import org.elasticsearch.action.ActionListener;
1413
import org.elasticsearch.cluster.ClusterChangedEvent;
1514
import org.elasticsearch.cluster.ClusterName;
@@ -26,6 +25,7 @@
2625
import org.elasticsearch.common.settings.ClusterSettings;
2726
import org.elasticsearch.common.settings.Settings;
2827
import org.elasticsearch.core.TimeValue;
28+
import org.elasticsearch.env.BuildVersion;
2929
import org.elasticsearch.env.Environment;
3030
import org.elasticsearch.reservedstate.action.ReservedClusterSettingsAction;
3131
import org.elasticsearch.tasks.TaskManager;
@@ -277,7 +277,7 @@ public void testStopWorksInMiddleOfProcessing() throws Exception {
277277
throw new RuntimeException(e);
278278
}
279279
}).start();
280-
return new ReservedStateChunk(Map.of(), new ReservedStateVersion(1L, Version.CURRENT));
280+
return new ReservedStateChunk(Map.of(), new ReservedStateVersion(1L, BuildVersion.current()));
281281
}).when(controller).parse(any(String.class), any());
282282

283283
doAnswer((Answer<Void>) invocation -> {

server/src/test/java/org/elasticsearch/reservedstate/service/ReservedClusterStateServiceTests.java

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

1010
package org.elasticsearch.reservedstate.service;
1111

12-
import org.elasticsearch.Version;
1312
import org.elasticsearch.action.ActionListener;
1413
import org.elasticsearch.cluster.ClusterName;
1514
import org.elasticsearch.cluster.ClusterState;
@@ -26,6 +25,7 @@
2625
import org.elasticsearch.common.settings.ClusterSettings;
2726
import org.elasticsearch.common.settings.Settings;
2827
import org.elasticsearch.core.Releasable;
28+
import org.elasticsearch.env.BuildVersion;
2929
import org.elasticsearch.reservedstate.ReservedClusterStateHandler;
3030
import org.elasticsearch.reservedstate.TransformState;
3131
import org.elasticsearch.reservedstate.action.ReservedClusterSettingsAction;
@@ -396,7 +396,7 @@ public TransformState transform(Object source, TransformState prevState) throws
396396
assertTrue(ReservedStateErrorTask.isNewError(null, 1L, ReservedStateVersionCheck.HIGHER_VERSION_ONLY));
397397
assertTrue(ReservedStateErrorTask.isNewError(null, 1L, ReservedStateVersionCheck.HIGHER_OR_SAME_VERSION));
398398

399-
var chunk = new ReservedStateChunk(Map.of("one", "two", "maker", "three"), new ReservedStateVersion(2L, Version.CURRENT));
399+
var chunk = new ReservedStateChunk(Map.of("one", "two", "maker", "three"), new ReservedStateVersion(2L, BuildVersion.current()));
400400
var orderedHandlers = List.of(exceptionThrower.name(), newStateMaker.name());
401401

402402
// We submit a task with two handler, one will cause an exception, the other will create a new state.
@@ -456,7 +456,7 @@ public void testCheckMetadataVersion() {
456456

457457
ReservedStateUpdateTask task = new ReservedStateUpdateTask(
458458
"test",
459-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, Version.CURRENT)),
459+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, BuildVersion.current())),
460460
ReservedStateVersionCheck.HIGHER_VERSION_ONLY,
461461
Map.of(),
462462
List.of(),
@@ -466,7 +466,7 @@ public void testCheckMetadataVersion() {
466466
assertThat("Cluster state should be modified", task.execute(state), not(sameInstance(state)));
467467
task = new ReservedStateUpdateTask(
468468
"test",
469-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, Version.CURRENT)),
469+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, BuildVersion.current())),
470470
ReservedStateVersionCheck.HIGHER_VERSION_ONLY,
471471
Map.of(),
472472
List.of(),
@@ -477,7 +477,7 @@ public void testCheckMetadataVersion() {
477477

478478
task = new ReservedStateUpdateTask(
479479
"test",
480-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(123L, Version.CURRENT)),
480+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(123L, BuildVersion.current())),
481481
ReservedStateVersionCheck.HIGHER_VERSION_ONLY,
482482
Map.of(),
483483
List.of(),
@@ -487,7 +487,7 @@ public void testCheckMetadataVersion() {
487487
assertThat("Cluster state should not be modified", task.execute(state), sameInstance(state));
488488
task = new ReservedStateUpdateTask(
489489
"test",
490-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(123L, Version.CURRENT)),
490+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(123L, BuildVersion.current())),
491491
ReservedStateVersionCheck.HIGHER_OR_SAME_VERSION,
492492
Map.of(),
493493
List.of(),
@@ -498,7 +498,7 @@ public void testCheckMetadataVersion() {
498498

499499
task = new ReservedStateUpdateTask(
500500
"test",
501-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(122L, Version.CURRENT)),
501+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(122L, BuildVersion.current())),
502502
ReservedStateVersionCheck.HIGHER_VERSION_ONLY,
503503
Map.of(),
504504
List.of(),
@@ -508,7 +508,7 @@ public void testCheckMetadataVersion() {
508508
assertThat("Cluster state should not be modified", task.execute(state), sameInstance(state));
509509
task = new ReservedStateUpdateTask(
510510
"test",
511-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(122L, Version.CURRENT)),
511+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(122L, BuildVersion.current())),
512512
ReservedStateVersionCheck.HIGHER_OR_SAME_VERSION,
513513
Map.of(),
514514
List.of(),
@@ -519,7 +519,7 @@ public void testCheckMetadataVersion() {
519519

520520
task = new ReservedStateUpdateTask(
521521
"test",
522-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, Version.fromId(Version.CURRENT.id + 1))),
522+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, BuildVersion.fromVersionId(BuildVersion.current().id() + 1))),
523523
ReservedStateVersionCheck.HIGHER_VERSION_ONLY,
524524
Map.of(),
525525
List.of(),
@@ -529,7 +529,7 @@ public void testCheckMetadataVersion() {
529529
assertThat("Cluster state should not be modified", task.execute(state), sameInstance(state));
530530
task = new ReservedStateUpdateTask(
531531
"test",
532-
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, Version.fromId(Version.CURRENT.id + 1))),
532+
new ReservedStateChunk(Map.of(), new ReservedStateVersion(124L, BuildVersion.fromVersionId(BuildVersion.current().id() + 1))),
533533
ReservedStateVersionCheck.HIGHER_OR_SAME_VERSION,
534534
Map.of(),
535535
List.of(),
@@ -627,7 +627,7 @@ public void testCheckAndReportError() {
627627
assertNull(controller.checkAndReportError("test", List.of(), null, ReservedStateVersionCheck.HIGHER_VERSION_ONLY));
628628
verify(controller, times(0)).updateErrorState(any());
629629

630-
var version = new ReservedStateVersion(2L, Version.CURRENT);
630+
var version = new ReservedStateVersion(2L, BuildVersion.current());
631631
var error = controller.checkAndReportError("test", List.of("test error"), version, ReservedStateVersionCheck.HIGHER_VERSION_ONLY);
632632
assertThat(error, instanceOf(IllegalStateException.class));
633633
assertThat(error.getMessage(), is("Error processing state change request for test, errors: test error"));
@@ -659,7 +659,10 @@ public TransformState transform(Object source, TransformState prevState) {
659659
Metadata metadata = Metadata.builder().put(operatorMetadata).build();
660660
ClusterState state = ClusterState.builder(new ClusterName("test")).metadata(metadata).build();
661661

662-
var chunk = new ReservedStateChunk(Map.of("non-state", "two", "maker", "three"), new ReservedStateVersion(2L, Version.CURRENT));
662+
var chunk = new ReservedStateChunk(
663+
Map.of("non-state", "two", "maker", "three"),
664+
new ReservedStateVersion(2L, BuildVersion.current())
665+
);
663666
var orderedHandlers = List.of(exceptionThrower.name(), newStateMaker.name());
664667

665668
ClusterService clusterService = mock(ClusterService.class);

x-pack/plugin/ilm/src/test/java/org/elasticsearch/xpack/ilm/action/ReservedLifecycleStateServiceTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
package org.elasticsearch.xpack.ilm.action;
99

10-
import org.elasticsearch.Version;
1110
import org.elasticsearch.action.admin.cluster.repositories.reservedstate.ReservedRepositoryAction;
1211
import org.elasticsearch.client.internal.Client;
1312
import org.elasticsearch.cluster.ClusterModule;
@@ -22,6 +21,7 @@
2221
import org.elasticsearch.common.settings.Settings;
2322
import org.elasticsearch.core.Releasable;
2423
import org.elasticsearch.core.TimeValue;
24+
import org.elasticsearch.env.BuildVersion;
2525
import org.elasticsearch.license.XPackLicenseState;
2626
import org.elasticsearch.reservedstate.TransformState;
2727
import org.elasticsearch.reservedstate.action.ReservedClusterSettingsAction;
@@ -418,7 +418,7 @@ public void testOperatorControllerWithPluginPackage() {
418418
)
419419
)
420420
),
421-
new ReservedStateVersion(123L, Version.CURRENT)
421+
new ReservedStateVersion(123L, BuildVersion.current())
422422
);
423423

424424
controller.process("operator", pack, randomFrom(ReservedStateVersionCheck.values()), x::set);

0 commit comments

Comments
 (0)