mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-06-29 01:44:36 -04:00
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:
parent
c1467e02c8
commit
61982c461f
3 changed files with 57 additions and 0 deletions
6
docs/changelog/106708.yaml
Normal file
6
docs/changelog/106708.yaml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
pr: 106708
|
||||||
|
summary: Improve error message when rolling over DS alias
|
||||||
|
area: Data streams
|
||||||
|
type: bug
|
||||||
|
issues:
|
||||||
|
- 106137
|
|
@ -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))
|
||||||
|
|
|
@ -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)));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue