diff --git a/src/main/java/org/elasticsearch/index/aliases/IndexAliasesService.java b/src/main/java/org/elasticsearch/index/aliases/IndexAliasesService.java index 09d607bf9d6..47b1de66fd6 100644 --- a/src/main/java/org/elasticsearch/index/aliases/IndexAliasesService.java +++ b/src/main/java/org/elasticsearch/index/aliases/IndexAliasesService.java @@ -39,6 +39,7 @@ import org.elasticsearch.indices.AliasFilterParsingException; import org.elasticsearch.indices.InvalidAliasNameException; import java.io.IOException; +import java.util.Map; import static org.elasticsearch.common.collect.MapBuilder.newMapBuilder; @@ -67,10 +68,20 @@ public class IndexAliasesService extends AbstractIndexComponent implements Itera return aliases.get(alias); } + public IndexAlias create(String alias, @Nullable CompressedString filter) { + return new IndexAlias(alias, filter, parse(alias, filter)); + } + public void add(String alias, @Nullable CompressedString filter) { add(new IndexAlias(alias, filter, parse(alias, filter))); } + public void addAll(Map aliases) { + synchronized (mutex) { + this.aliases = newMapBuilder(this.aliases).putAll(aliases).immutableMap(); + } + } + /** * Returns the filter associated with listed filtering aliases. *

diff --git a/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java b/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java index f7cbd4e12be..d7ca96d8667 100644 --- a/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java +++ b/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java @@ -62,10 +62,13 @@ import org.elasticsearch.indices.recovery.RecoveryTarget; import org.elasticsearch.indices.recovery.StartRecoveryRequest; import org.elasticsearch.threadpool.ThreadPool; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentMap; +import static com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.Sets.newHashSet; import static org.elasticsearch.ExceptionsHelper.detailedMessage; @@ -433,9 +436,7 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent aliases, IndexAliasesService indexAliasesService) { + HashMap newAliases = newHashMap(); + for (AliasMetaData aliasMd : aliases) { + String alias = aliasMd.alias(); + CompressedString filter = aliasMd.filter(); + try { + if (!indexAliasesService.hasAlias(alias)) { if (logger.isDebugEnabled()) { - logger.debug("[{}] updating alias [{}], filter [{}]", index, alias, filter); + logger.debug("[{}] adding alias [{}], filter [{}]", index, alias, filter); + } + newAliases.put(alias, indexAliasesService.create(alias, filter)); + } else { + if ((filter == null && indexAliasesService.alias(alias).filter() != null) || + (filter != null && !filter.equals(indexAliasesService.alias(alias).filter()))) { + if (logger.isDebugEnabled()) { + logger.debug("[{}] updating alias [{}], filter [{}]", index, alias, filter); + } + newAliases.put(alias, indexAliasesService.create(alias, filter)); } - indexAliasesService.add(alias, filter); } + } catch (Exception e) { + logger.warn("[{}] failed to add alias [{}], filter [{}]", e, index, alias, filter); } - } catch (Exception e) { - logger.warn("[{}] failed to add alias [{}], filter [{}]", e, index, alias, filter); } - + indexAliasesService.addAll(newAliases); } private void applyNewOrUpdatedShards(final ClusterChangedEvent event) throws ElasticSearchException {