From ca8297a450c9047b105a52e6fc4f9021044df825 Mon Sep 17 00:00:00 2001 From: David Roberts Date: Mon, 1 Nov 2021 14:59:31 +0000 Subject: [PATCH] [ML] Preserve alias attributes when making them hidden This is a followup to #77416. If aliases on ML hidden indices are made hidden then all attributes of the alias need to be preserved. The particularly critical case for ML is where a job's results alias has a filter that restricts documents returned when searching the shared results index to those that relate to the job. --- .../xpack/ml/MlInitializationService.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MlInitializationService.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MlInitializationService.java index 3ddbdf04ffc1a..d22d768b242a4 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MlInitializationService.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MlInitializationService.java @@ -177,19 +177,27 @@ private void makeMlInternalIndicesHidden() { IndicesAliasesRequest indicesAliasesRequest = new IndicesAliasesRequest(); for (ObjectObjectCursor> entry : getAliasesResponse.getAliases()) { String index = entry.key; - String[] nonHiddenAliases = entry.value.stream() - .filter(metadata -> metadata.isHidden() == null || metadata.isHidden() == false) - .map(AliasMetadata::alias) - .toArray(String[]::new); - if (nonHiddenAliases.length == 0) { - continue; - } - indicesAliasesRequest.addAliasAction( - IndicesAliasesRequest.AliasActions.add() + for (AliasMetadata existingAliasMetadata : entry.value) { + if (existingAliasMetadata.isHidden() == null || existingAliasMetadata.isHidden() == false) { + continue; + } + IndicesAliasesRequest.AliasActions addReplacementAliasAction = IndicesAliasesRequest.AliasActions.add() .index(index) - .aliases(entry.value.stream().map(AliasMetadata::alias).toArray(String[]::new)) - .isHidden(true) - ); + .aliases(existingAliasMetadata.getAlias()) + .writeIndex(existingAliasMetadata.writeIndex()) + .isHidden(true); + // Be sure to preserve all attributes apart from is_hidden + if (existingAliasMetadata.filteringRequired()) { + addReplacementAliasAction.filter(existingAliasMetadata.getFilter().string()); + } + if (existingAliasMetadata.indexRouting() != null) { + addReplacementAliasAction.indexRouting(existingAliasMetadata.indexRouting()); + } + if (existingAliasMetadata.searchRouting() != null) { + addReplacementAliasAction.searchRouting(existingAliasMetadata.searchRouting()); + } + indicesAliasesRequest.addAliasAction(addReplacementAliasAction); + } } if (indicesAliasesRequest.getAliasActions().isEmpty()) { logger.debug("There are no ML internal aliases that need to be made hidden, [{}]", getAliasesResponse.getAliases());