elastic/elasticsearch · error · RuntimeException

Missing upper bound {} for stack version {}

Error message

Missing upper bound {} for stack version {}

What it means

RuntimeException from UpdateTransportVersionsCSVTask.run() when getUpperBoundFromGitBase(upperBoundName) returns null for the given stack version. Before appending a row to TransportVersions.csv the task needs the upper bound (max transport-version id) for the release branch derived from the stack version.

Source

Thrown at build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/UpdateTransportVersionsCSVTask.java:46

    @ServiceReference("transportVersionResources")
    abstract Property<TransportVersionResourcesService> getResourceService();

    @InputFile
    public abstract RegularFileProperty getTransportVersionsFile();

    @Input
    @Option(option = "stack-version", description = "The Elasticsearch version to record in TransportVersions.csv")
    public abstract Property<String> getStackVersion();

    @TaskAction
    public void run() throws IOException {
        Version stackVersion = Version.fromString(getStackVersion().get());
        String upperBoundName = getUpperBoundName(stackVersion);
        TransportVersionResourcesService resources = getResourceService().get();
        TransportVersionUpperBound upperBound = resources.getUpperBoundFromGitBase(upperBoundName);

        if (upperBound == null) {
            throw new RuntimeException("Missing upper bound " + upperBoundName + " for stack version " + stackVersion);
        }

        int expectedTransportVersionId = upperBound.definitionId().complete();

        // Check if this version is already in the CSV file (idempotency check)
        Integer existingTransportVersionId = getExistingTransportVersionId(stackVersion);
        if (existingTransportVersionId != null) {
            if (existingTransportVersionId != expectedTransportVersionId) {
                throw new RuntimeException(
                    "Version "
                        + stackVersion
                        + " already exists in TransportVersions.csv with transport version ID "
                        + existingTransportVersionId
                        + ", but expected "
                        + expectedTransportVersionId
                );
            }
            getLogger().lifecycle(

View on GitHub (pinned to db6a809a66)

Solutions

  1. Run GenerateInitialTransportVersionTask for the stack version first to create the upper bound.
  2. Confirm the upper-bound file for the derived branch name exists on the base branch.
  3. Sync the transport-resources directory from the base/upstream before re-running the update task.
Defensive patterns

Strategy: validation

Validate before calling

String upperBoundName = getUpperBoundName(stackVersion);
TransportVersionUpperBound upperBound = resources.getUpperBoundFromGitBase(upperBoundName);
if (upperBound == null) {
    throw new IllegalStateException("No upper bound '" + upperBoundName + "' for " + stackVersion + "; run GenerateInitialTransportVersionTask first");
}

Prevention

When it happens

Trigger: The upper-bound CSV named by getUpperBoundName(stackVersion) does not exist in the git base of the transport-resources directory when updating the canonical TransportVersions.csv.

Common situations: Running the update task for a stack version whose branch upper bound was never created; pointing at the wrong base; the resources directory not synced with upstream; running before GenerateInitialTransportVersionTask has seeded the upper bound.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/d6e3e0842ed1eae1. Report an issue: GitHub.