Skip to content

Commit f086ef1

Browse files
authored
Make current Version pluggable for serverless (elastic#96539)
Version.CURRENT is statically loaded as a constant early during startup. Yet serverless needs to be able to override the current Version so it can add additional versions. This commit makes Version.CURRENT pluggable via SPI. Note that the only way for this to be plugged in is via an additional jar on the boot layer.
1 parent c076810 commit f086ef1

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

server/src/main/java/module-info.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@
277277
exports org.elasticsearch.indices.recovery.plan;
278278
exports org.elasticsearch.indices.store;
279279
exports org.elasticsearch.ingest;
280+
exports org.elasticsearch.internal to org.elasticsearch.serverless.version;
280281
exports org.elasticsearch.lucene.analysis.miscellaneous;
281282
exports org.elasticsearch.lucene.grouping;
282283
exports org.elasticsearch.lucene.queries;
@@ -382,6 +383,7 @@
382383
uses org.elasticsearch.reservedstate.ReservedClusterStateHandlerProvider;
383384
uses org.elasticsearch.jdk.ModuleQualifiedExportsService;
384385
uses org.elasticsearch.node.internal.TerminationHandlerProvider;
386+
uses org.elasticsearch.internal.VersionExtension;
385387

386388
provides org.apache.lucene.codecs.PostingsFormat
387389
with

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.common.io.stream.StreamInput;
1313
import org.elasticsearch.common.io.stream.StreamOutput;
1414
import org.elasticsearch.core.Assertions;
15+
import org.elasticsearch.internal.VersionExtension;
1516

1617
import java.io.IOException;
1718
import java.lang.reflect.Field;
@@ -136,7 +137,7 @@ private static TransportVersion registerTransportVersion(int id, String uniqueId
136137
* Reference to the most recent transport version.
137138
* This should be the transport version with the highest id.
138139
*/
139-
public static final TransportVersion CURRENT = V_8_500_008;
140+
public static final TransportVersion CURRENT = findCurrent(V_8_500_008);
140141

141142
/**
142143
* Reference to the earliest compatible transport version to this version of the codebase.
@@ -264,6 +265,15 @@ public static TransportVersion fromString(String str) {
264265
return TransportVersion.fromId(Integer.parseInt(str));
265266
}
266267

268+
// finds the pluggable current version, or uses the given fallback
269+
private static TransportVersion findCurrent(TransportVersion fallback) {
270+
var versionExtension = VersionExtension.load();
271+
if (versionExtension == null) {
272+
return fallback;
273+
}
274+
return new TransportVersion(versionExtension.getCurrentTransportVersionId());
275+
}
276+
267277
@Override
268278
public int compareTo(TransportVersion other) {
269279
return Integer.compare(this.id, other.id);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.internal;
10+
11+
import java.util.ServiceLoader;
12+
13+
/**
14+
* Allows plugging in current version elements.
15+
*/
16+
public interface VersionExtension {
17+
/**
18+
* Returns the version id of the current transport version.
19+
* Note this cannot return a TransportVersion object because it needs to be
20+
* called during static initialization of TransportVersion.
21+
*/
22+
int getCurrentTransportVersionId();
23+
24+
/**
25+
* Loads a single VersionExtension, or returns {@code null} if none are found.
26+
*/
27+
static VersionExtension load() {
28+
var loader = ServiceLoader.load(VersionExtension.class);
29+
var extensions = loader.stream().toList();
30+
if (extensions.size() > 1) {
31+
throw new IllegalStateException("More than one version extension found");
32+
} else if (extensions.size() == 0) {
33+
return null;
34+
}
35+
return extensions.get(0).get();
36+
}
37+
}

0 commit comments

Comments
 (0)