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
- Finish the rolling upgrade so all nodes support data_streams.modify.delete_index
- Remove the old-version nodes from the cluster
- 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
- Defer delete_backing_index automations until the rolling upgrade is complete
- Check the cluster's min node version before issuing the action
- Queue delete requests and replay after upgrade
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
- Ran out of versions to go to for {}
- Expected one jar in ${dir}; found ${candidates.size()}
- update_offsets is not supported anymore. Please fix your ana
- backing index [%s] in tsdb mode doesn't have the [%s] index
- Cannot add dynamic templates that define dimension fields on
AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12).
Data as JSON: /api/errors/d546f9b0a69ba696.
Report an issue: GitHub.