elastic/elasticsearch · error · IllegalArgumentException

delete_backing_index is an unsupported action type for this

Error message

delete_backing_index is an unsupported action type for this mixed version cluster

What it means

IllegalArgumentException when a modify-data-stream request contains a delete_backing_index action but the cluster does not advertise the 'data_streams.modify.delete_index' capability — i.e. at least one node is on an older version during a rolling upgrade. The REST handler gates the action behind clusterSupportsFeature.

Source

Thrown at modules/data-streams/src/main/java/org/elasticsearch/datastreams/rest/RestModifyDataStreamsAction.java:71

        try (XContentParser parser = request.contentParser()) {
            modifyDsRequest = ModifyDataStreamsAction.Request.PARSER.parse(
                parser,
                actions -> new ModifyDataStreamsAction.Request(
                    RestUtils.getMasterNodeTimeout(request),
                    RestUtils.getAckTimeout(request),
                    actions
                )
            );
        }
        if (modifyDsRequest.getActions() == null || modifyDsRequest.getActions().isEmpty()) {
            throw new IllegalArgumentException("no data stream actions specified, at least one must be specified");
        }
        boolean hasDeleteIndexAction = modifyDsRequest.getActions()
            .stream()
            .anyMatch(action -> action.getType() == DataStreamAction.Type.DELETE_BACKING_INDEX);
        if (hasDeleteIndexAction) {
            if (clusterSupportsFeature.test(DataStreamFeatures.DATA_STREAMS_MODIFY_DELETE_INDEX) == false) {
                throw new IllegalArgumentException("delete_backing_index is an unsupported action type for this mixed version cluster");
            }
        }
        return channel -> client.execute(ModifyDataStreamsAction.INSTANCE, modifyDsRequest, new RestToXContentListener<>(channel));
    }

    @Override
    public Set<String> supportedCapabilities() {
        return Set.of("data_streams.modify.delete_index");
    }
}

View on GitHub (pinned to db6a809a66)

Solutions

  1. Finish the rolling upgrade so all nodes support data_streams.modify.delete_index
  2. Remove the old-version nodes from the cluster
  3. Temporarily drop delete_backing_index actions until the upgrade completes

Example fix

// before (mixed cluster): rejected
POST _data_stream/_modify {"actions":[{"delete_backing_index":{...}}]}
// after upgrade completes: same request is accepted; or remove the action until then
Defensive patterns

Strategy: validation

Validate before calling

// Check cluster capability client-side before sending delete_backing_index:
boolean supported = clusterSupportsFeature("data_streams.modify.delete_index");
if (!supported && requestHasDelete(actions)) {
    throw new IllegalStateException("delete_backing_index unsupported until upgrade completes");
}

Try / catch

try { modifyDataStreams(actions); }
catch (IllegalArgumentException e) {
    if (e.getMessage().contains("delete_backing_index")) { /* defer action until upgrade done */ }
    else throw e;
}

Prevention

When it happens

Trigger: POST _data_stream/_modify with a delete_backing_index action while mixed-version nodes exist; DataStreamFeatures.DATA_STREAMS_MODIFY_DELETE_INDEX returns false from the feature check.

Common situations: Mid rolling upgrade; a node hasn't been upgraded yet; snapshot restore into a mixed cluster; testing against a partially upgraded staging cluster.

Related errors


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