Skip to content

Commit

Permalink
Improved how aliases are handled in the cluster state.
Browse files Browse the repository at this point in the history
The following changes improved alias creation:
* Moved away from ImmutableMap to JCF's UnmodifiableMap. The ImmutableMap always made a copy, whereas the UnmodifiableMap just wraps the target map.
* Reducing the number of maps being created during the creation of MetaData and IndexMetadata.
* Changed IndexAliasesService's aliases from a copy on write ImmutableMap to ConcurrentMap.

Closes #3410
  • Loading branch information
martijnvg committed Jul 30, 2013
1 parent 6b46ec5 commit 1593bd4
Show file tree
Hide file tree
Showing 11 changed files with 312 additions and 158 deletions.
Expand Up @@ -143,6 +143,10 @@ List<AliasAction> aliasActions() {
return this.aliasActions;
}

public List<AliasAction> getAliasActions() {
return aliasActions();
}

/**
* Timeout to wait till the put mapping gets acknowledged of all current cluster nodes. Defaults to
* <tt>10s</tt>.
Expand Down
Expand Up @@ -19,7 +19,6 @@

package org.elasticsearch.action.admin.indices.exists.types;

import com.google.common.collect.ImmutableMap;
import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.support.master.TransportMasterNodeOperationAction;
Expand All @@ -33,6 +32,8 @@
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.Map;

/**
* Types exists transport action.
*/
Expand Down Expand Up @@ -84,7 +85,7 @@ protected void masterOperation(final TypesExistsRequest request, final ClusterSt
return;
}

ImmutableMap<String, MappingMetaData> mappings = state.metaData().getIndices().get(concreteIndex).mappings();
Map<String, MappingMetaData> mappings = state.metaData().getIndices().get(concreteIndex).mappings();
if (mappings.isEmpty()) {
listener.onResponse(new TypesExistsResponse(false));
return;
Expand Down
Expand Up @@ -20,7 +20,6 @@
package org.elasticsearch.cluster;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.cluster.metadata.MetaData;
Expand Down Expand Up @@ -166,8 +165,8 @@ public boolean nodesChanged() {

public boolean indicesStateChanged() {
if (metaDataChanged()) {
ImmutableMap<String,IndexMetaData> indices = state.metaData().indices();
ImmutableMap<String,IndexMetaData> previousIndices = previousState.metaData().indices();
Map<String,IndexMetaData> indices = state.metaData().indices();
Map<String,IndexMetaData> previousIndices = previousState.metaData().indices();

for (Map.Entry<String, IndexMetaData> entry : indices.entrySet()) {
IndexMetaData indexMetaData = entry.getValue();
Expand Down
Expand Up @@ -19,6 +19,7 @@

package org.elasticsearch.cluster.metadata;

import com.google.common.collect.ImmutableSet;
import org.elasticsearch.ElasticSearchGenerationException;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.compress.CompressedString;
Expand All @@ -30,7 +31,9 @@
import org.elasticsearch.common.xcontent.XContentParser;

import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.Set;

/**
*
Expand All @@ -41,15 +44,22 @@ public class AliasMetaData {

private final CompressedString filter;

private String indexRouting;
private final String indexRouting;

private String searchRouting;
private final String searchRouting;

private final Set<String> searchRoutingValues;

private AliasMetaData(String alias, CompressedString filter, String indexRouting, String searchRouting) {
this.alias = alias;
this.filter = filter;
this.indexRouting = indexRouting;
this.searchRouting = searchRouting;
if (searchRouting != null) {
searchRoutingValues = Collections.unmodifiableSet(Strings.splitStringByCommaToSet(searchRouting));
} else {
searchRoutingValues = ImmutableSet.of();
}
}

public String alias() {
Expand All @@ -68,6 +78,10 @@ public CompressedString getFilter() {
return filter();
}

public boolean filteringRequired() {
return filter != null;
}

public String getSearchRouting() {
return searchRouting();
}
Expand All @@ -84,6 +98,10 @@ public String indexRouting() {
return indexRouting;
}

public Set<String> searchRoutingValues() {
return searchRoutingValues;
}

public static Builder builder(String alias) {
return new Builder(alias);
}
Expand Down
24 changes: 12 additions & 12 deletions src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
Expand Up @@ -161,21 +161,21 @@ public static State fromString(String state) {

private final State state;

private final ImmutableMap<String, AliasMetaData> aliases;
private final Map<String, AliasMetaData> aliases;

private final Settings settings;

private final ImmutableMap<String, MappingMetaData> mappings;
private final Map<String, MappingMetaData> mappings;

private final ImmutableMap<String, Custom> customs;
private final Map<String, Custom> customs;

private transient final int totalNumberOfShards;

private final DiscoveryNodeFilters requireFilters;
private final DiscoveryNodeFilters includeFilters;
private final DiscoveryNodeFilters excludeFilters;

private IndexMetaData(String index, long version, State state, Settings settings, ImmutableMap<String, MappingMetaData> mappings, ImmutableMap<String, AliasMetaData> aliases, ImmutableMap<String, Custom> customs) {
private IndexMetaData(String index, long version, State state, Settings settings, Map<String, MappingMetaData> mappings, Map<String, AliasMetaData> aliases, Map<String, Custom> customs) {
Preconditions.checkArgument(settings.getAsInt(SETTING_NUMBER_OF_SHARDS, -1) != -1, "must specify numberOfShards for index [" + index + "]");
Preconditions.checkArgument(settings.getAsInt(SETTING_NUMBER_OF_REPLICAS, -1) != -1, "must specify numberOfReplicas for index [" + index + "]");
this.index = index;
Expand Down Expand Up @@ -264,19 +264,19 @@ public Settings getSettings() {
return settings();
}

public ImmutableMap<String, AliasMetaData> aliases() {
public Map<String, AliasMetaData> aliases() {
return this.aliases;
}

public ImmutableMap<String, AliasMetaData> getAliases() {
public Map<String, AliasMetaData> getAliases() {
return aliases();
}

public ImmutableMap<String, MappingMetaData> mappings() {
public Map<String, MappingMetaData> mappings() {
return mappings;
}

public ImmutableMap<String, MappingMetaData> getMappings() {
public Map<String, MappingMetaData> getMappings() {
return mappings();
}

Expand All @@ -301,11 +301,11 @@ public MappingMetaData mappingOrDefault(String mappingType) {
return mappings.get(MapperService.DEFAULT_MAPPING);
}

public ImmutableMap<String, Custom> customs() {
public Map<String, Custom> customs() {
return this.customs;
}

public ImmutableMap<String, Custom> getCustoms() {
public Map<String, Custom> getCustoms() {
return this.customs;
}

Expand Down Expand Up @@ -508,7 +508,7 @@ public IndexMetaData build() {
AliasMetaData aliasMd = AliasMetaData.newAliasMetaDataBuilder(alias).build();
tmpAliases.put(alias, aliasMd);
}
tmpAliases.putAll(aliases.immutableMap());
tmpAliases.putAll(aliases.map());
// Remove index.aliases from settings once they are migrated to the new data structure
tmpSettings = ImmutableSettings.settingsBuilder().put(settings).putArray("index.aliases").build();
}
Expand All @@ -521,7 +521,7 @@ public IndexMetaData build() {
}
}

return new IndexMetaData(index, version, state, tmpSettings, mappings.immutableMap(), tmpAliases.immutableMap(), customs.immutableMap());
return new IndexMetaData(index, version, state, tmpSettings, mappings.readOnlyMap(), tmpAliases.readOnlyMap(), customs.readOnlyMap());
}

public static void toXContent(IndexMetaData indexMetaData, XContentBuilder builder, ToXContent.Params params) throws IOException {
Expand Down

0 comments on commit 1593bd4

Please sign in to comment.