mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-09 22:45:04 +00:00
Validate the _rollover
target index name early to also fail if dry_run=true (#21330)
Today we validate the target index name late and therefore don't fail for instance if the target index already exists and `dry_run=true` was specified. This change validates the index name before we early terminate if dry_run is set. Closes #21149
This commit is contained in:
parent
ed2865863c
commit
436ba7b5fc
@ -44,6 +44,7 @@ import org.elasticsearch.cluster.service.ClusterService;
|
|||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.index.shard.DocsStats;
|
import org.elasticsearch.index.shard.DocsStats;
|
||||||
|
import org.elasticsearch.indices.IndexAlreadyExistsException;
|
||||||
import org.elasticsearch.threadpool.ThreadPool;
|
import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.transport.TransportService;
|
import org.elasticsearch.transport.TransportService;
|
||||||
|
|
||||||
@ -109,16 +110,18 @@ public class TransportRolloverAction extends TransportMasterNodeAction<RolloverR
|
|||||||
final String sourceProvidedName = indexMetaData.getSettings().get(IndexMetaData.SETTING_INDEX_PROVIDED_NAME,
|
final String sourceProvidedName = indexMetaData.getSettings().get(IndexMetaData.SETTING_INDEX_PROVIDED_NAME,
|
||||||
indexMetaData.getIndex().getName());
|
indexMetaData.getIndex().getName());
|
||||||
final String sourceIndexName = indexMetaData.getIndex().getName();
|
final String sourceIndexName = indexMetaData.getIndex().getName();
|
||||||
|
final String unresolvedName = (rolloverRequest.getNewIndexName() != null)
|
||||||
|
? rolloverRequest.getNewIndexName()
|
||||||
|
: generateRolloverIndexName(sourceProvidedName, indexNameExpressionResolver);
|
||||||
|
final String rolloverIndexName = indexNameExpressionResolver.resolveDateMathExpression(unresolvedName);
|
||||||
|
MetaDataCreateIndexService.validateIndexName(rolloverIndexName, state); // will fail if the index already exists
|
||||||
client.admin().indices().prepareStats(sourceIndexName).clear().setDocs(true).execute(
|
client.admin().indices().prepareStats(sourceIndexName).clear().setDocs(true).execute(
|
||||||
new ActionListener<IndicesStatsResponse>() {
|
new ActionListener<IndicesStatsResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(IndicesStatsResponse statsResponse) {
|
public void onResponse(IndicesStatsResponse statsResponse) {
|
||||||
final Set<Condition.Result> conditionResults = evaluateConditions(rolloverRequest.getConditions(),
|
final Set<Condition.Result> conditionResults = evaluateConditions(rolloverRequest.getConditions(),
|
||||||
statsResponse.getTotal().getDocs(), metaData.index(sourceIndexName));
|
statsResponse.getTotal().getDocs(), metaData.index(sourceIndexName));
|
||||||
final String unresolvedName = (rolloverRequest.getNewIndexName() != null)
|
|
||||||
? rolloverRequest.getNewIndexName()
|
|
||||||
: generateRolloverIndexName(sourceProvidedName, indexNameExpressionResolver);
|
|
||||||
final String rolloverIndexName = indexNameExpressionResolver.resolveDateMathExpression(unresolvedName);
|
|
||||||
if (rolloverRequest.isDryRun()) {
|
if (rolloverRequest.isDryRun()) {
|
||||||
listener.onResponse(
|
listener.onResponse(
|
||||||
new RolloverResponse(sourceIndexName, rolloverIndexName, conditionResults, true, false, false, false));
|
new RolloverResponse(sourceIndexName, rolloverIndexName, conditionResults, true, false, false, false));
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
"type" : "time",
|
"type" : "time",
|
||||||
"description" : "Explicit operation timeout"
|
"description" : "Explicit operation timeout"
|
||||||
},
|
},
|
||||||
|
"dry_run": {
|
||||||
|
"type" : "boolean",
|
||||||
|
"description" : "If set to true the rollover action will only be validated but not actually performed even if a condition matches. The default is false"
|
||||||
|
},
|
||||||
"master_timeout": {
|
"master_timeout": {
|
||||||
"type" : "time",
|
"type" : "time",
|
||||||
"description" : "Specify timeout for connection to master"
|
"description" : "Specify timeout for connection to master"
|
||||||
|
@ -102,3 +102,56 @@
|
|||||||
- match: { dry_run: false }
|
- match: { dry_run: false }
|
||||||
- match: { conditions: { "[max_docs: 1]": false } }
|
- match: { conditions: { "[max_docs: 1]": false } }
|
||||||
|
|
||||||
|
---
|
||||||
|
"Rollover with dry-run but target index exists":
|
||||||
|
|
||||||
|
- skip:
|
||||||
|
version: " - 5.0.0"
|
||||||
|
reason: bug fixed in 5.0.1 - dry run was returning just fine even if the index exists
|
||||||
|
|
||||||
|
# create index with alias
|
||||||
|
- do:
|
||||||
|
indices.create:
|
||||||
|
index: logs-1
|
||||||
|
wait_for_active_shards: 1
|
||||||
|
body:
|
||||||
|
aliases:
|
||||||
|
logs_index: {}
|
||||||
|
logs_search: {}
|
||||||
|
|
||||||
|
- do:
|
||||||
|
indices.create:
|
||||||
|
index: logs-000002
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: /index_already_exists_exception/
|
||||||
|
indices.rollover:
|
||||||
|
dry_run: true
|
||||||
|
alias: "logs_search"
|
||||||
|
wait_for_active_shards: 1
|
||||||
|
body:
|
||||||
|
conditions:
|
||||||
|
max_docs: 1
|
||||||
|
|
||||||
|
# also do it without dry_run
|
||||||
|
- do:
|
||||||
|
catch: /index_already_exists_exception/
|
||||||
|
indices.rollover:
|
||||||
|
dry_run: false
|
||||||
|
alias: "logs_search"
|
||||||
|
wait_for_active_shards: 1
|
||||||
|
body:
|
||||||
|
conditions:
|
||||||
|
max_docs: 1
|
||||||
|
|
||||||
|
- do:
|
||||||
|
catch: /invalid_index_name_exception/
|
||||||
|
indices.rollover:
|
||||||
|
new_index: invalid|index|name
|
||||||
|
dry_run: true
|
||||||
|
alias: "logs_search"
|
||||||
|
wait_for_active_shards: 1
|
||||||
|
body:
|
||||||
|
conditions:
|
||||||
|
max_docs: 1
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user