Improve error message when rolling over DS alias (#106708)

Currently a null pointer exception is thrown when trying to execute a
rollover on a data stream alias. This commit checks before trying to
execute if we're attempting to rollover a data stream alias or not.

Fixes #106137 

---------

Co-authored-by: James Baiera <james.baiera@gmail.com>
This commit is contained in:
Larisa Motova 2024-03-25 10:26:00 -10:00 committed by GitHub
parent c1467e02c8
commit 61982c461f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 57 additions and 0 deletions

View file

@ -0,0 +1,6 @@
pr: 106708
summary: Improve error message when rolling over DS alias
area: Data streams
type: bug
issues:
- 106137

View file

@ -215,6 +215,16 @@ public class TransportRolloverAction extends TransportMasterNodeAction<RolloverR
} }
} }
final IndexAbstraction rolloverTargetAbstraction = clusterState.metadata()
.getIndicesLookup()
.get(rolloverRequest.getRolloverTarget());
if (rolloverTargetAbstraction.getType() == IndexAbstraction.Type.ALIAS && rolloverTargetAbstraction.isDataStreamRelated()) {
listener.onFailure(
new IllegalStateException("Aliases to data streams cannot be rolled over. Please rollover the data stream itself.")
);
return;
}
IndicesStatsRequest statsRequest = new IndicesStatsRequest().indices(rolloverRequest.getRolloverTarget()) IndicesStatsRequest statsRequest = new IndicesStatsRequest().indices(rolloverRequest.getRolloverTarget())
.clear() .clear()
.indicesOptions(IndicesOptions.fromOptions(true, false, true, true)) .indicesOptions(IndicesOptions.fromOptions(true, false, true, true))

View file

@ -552,6 +552,47 @@ public class TransportRolloverActionTests extends ESTestCase {
} }
} }
public void testRolloverAliasToDataStreamFails() throws Exception {
final IndexMetadata backingIndexMetadata = IndexMetadata.builder(".ds-logs-ds-000001")
.settings(settings(IndexVersion.current()))
.numberOfShards(1)
.numberOfReplicas(1)
.build();
final DataStream dataStream = new DataStream(
"logs-ds",
List.of(backingIndexMetadata.getIndex()),
1,
Map.of(),
false,
false,
false,
false,
IndexMode.STANDARD
);
Metadata.Builder metadataBuilder = Metadata.builder().put(backingIndexMetadata, false).put(dataStream);
metadataBuilder.put("ds-alias", dataStream.getName(), true, null);
final ClusterState stateBefore = ClusterState.builder(ClusterName.DEFAULT).metadata(metadataBuilder).build();
final TransportRolloverAction transportRolloverAction = new TransportRolloverAction(
mock(TransportService.class),
mockClusterService,
mockThreadPool,
mockActionFilters,
mockIndexNameExpressionResolver,
rolloverService,
mockClient,
mockAllocationService,
mockMetadataDataStreamService,
dataStreamAutoShardingService
);
final PlainActionFuture<RolloverResponse> future = new PlainActionFuture<>();
RolloverRequest rolloverRequest = new RolloverRequest("ds-alias", null);
transportRolloverAction.masterOperation(mock(CancellableTask.class), rolloverRequest, stateBefore, future);
IllegalStateException illegalStateException = expectThrows(IllegalStateException.class, future::actionGet);
assertThat(illegalStateException.getMessage(), containsString("Aliases to data streams cannot be rolled over."));
}
private IndicesStatsResponse createIndicesStatResponse(String indexName, long totalDocs, long primariesDocs) { private IndicesStatsResponse createIndicesStatResponse(String indexName, long totalDocs, long primariesDocs) {
final CommonStats primaryStats = mock(CommonStats.class); final CommonStats primaryStats = mock(CommonStats.class);
when(primaryStats.getDocs()).thenReturn(new DocsStats(primariesDocs, 0, between(1, 10000))); when(primaryStats.getDocs()).thenReturn(new DocsStats(primariesDocs, 0, between(1, 10000)));