Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
talevy committed Jun 1, 2018
1 parent 5838717 commit 7baf86b
Show file tree
Hide file tree
Showing 13 changed files with 293 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ setup:
indices.get_alias:
name: _all

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- match: {test_index_2.aliases.test_blias: { is_write_index: false }}
- is_false: test_index_3
Expand All @@ -88,8 +88,8 @@ setup:
indices.get_alias:
index: _all

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- match: {test_index_2.aliases.test_blias: { is_write_index: false }}
- match: {myindex.aliases: {}}
Expand All @@ -104,8 +104,8 @@ setup:
indices.get_alias:
index: "*"

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- match: {test_index_2.aliases.test_blias: { is_write_index: false }}
- match: {myindex.aliases: {}}
Expand All @@ -130,7 +130,7 @@ setup:
index: test_index
name: test_alias

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2

Expand All @@ -142,8 +142,8 @@ setup:
index: test_index
name: _all

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- is_false: test_index_2

---
Expand All @@ -154,8 +154,8 @@ setup:
index: test_index
name: '*'

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- is_false: test_index_2

---
Expand All @@ -165,7 +165,7 @@ setup:
index: test_index
name: 'test_a*'

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2

Expand All @@ -177,8 +177,8 @@ setup:
index: test_index
name: 'test_alias,test_blias'

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_blias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index.aliases.test_blias: { is_write_index: true }}
- is_false: test_index_2

---
Expand All @@ -188,7 +188,7 @@ setup:
indices.get_alias:
name: test_alias

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2.aliases.test_blias
Expand All @@ -201,7 +201,7 @@ setup:
index: _all
name: test_alias

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2.aliases.test_blias
Expand All @@ -214,7 +214,7 @@ setup:
index: '*'
name: test_alias

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2.aliases.test_blias
Expand All @@ -240,7 +240,7 @@ setup:
index: test_index,test_index_2
name: test_alias

- match: {test_index.aliases.test_alias: { is_write_index: false }}
- match: {test_index.aliases.test_alias: { is_write_index: true }}
- match: {test_index_2.aliases.test_alias: { is_write_index: false }}
- is_false: test_index.aliases.test_blias
- is_false: test_index_2.aliases.test_blias
Expand All @@ -267,7 +267,7 @@ setup:

- match: { 'status': 404 }
- match: { 'error': 'alias [non-existent] missing' }
- match: { test_index.aliases.test_alias: { is_write_index: false } }
- match: { test_index.aliases.test_alias: { is_write_index: true } }

---
"Existent and non-existent aliases returns 404 and the existing alias":
Expand All @@ -279,7 +279,7 @@ setup:

- match: { 'status': 404 }
- match: { 'error': 'aliases [another-non-existent,non-existent] missing' }
- match: { test_index.aliases.test_alias: { is_write_index: false } }
- match: { test_index.aliases.test_alias: { is_write_index: true } }

---
"Getting alias on an non-existent index should return 404":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ public class Alias implements Streamable, ToXContentObject {
@Nullable
private String searchRouting;

private boolean writeIndex;
@Nullable
private Boolean writeIndex;

private Alias() {

Expand Down Expand Up @@ -173,14 +174,14 @@ public Alias searchRouting(String searchRouting) {
/**
* @return the write index flag for the alias
*/
public boolean isWriteIndex() {
public Boolean writeIndex() {
return writeIndex;
}

/**
* Sets whether an alias is pointing to a write-index
*/
public Alias writeIndex(boolean writeIndex) {
public Alias writeIndex(@Nullable Boolean writeIndex) {
this.writeIndex = writeIndex;
return this;
}
Expand All @@ -201,7 +202,7 @@ public void readFrom(StreamInput in) throws IOException {
indexRouting = in.readOptionalString();
searchRouting = in.readOptionalString();
if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
writeIndex = in.readBoolean();
writeIndex = in.readOptionalBoolean();
}
}

Expand All @@ -212,7 +213,7 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeOptionalString(indexRouting);
out.writeOptionalString(searchRouting);
if (out.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
out.writeBoolean(writeIndex);
out.writeOptionalBoolean(writeIndex);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public String getIndex() {
*/
@FunctionalInterface
public interface NewAliasValidator {
void validate(String alias, @Nullable String indexRouting, @Nullable String filter);
void validate(String alias, @Nullable String indexRouting, @Nullable String filter, boolean writeIndex);
}

/**
Expand Down Expand Up @@ -119,16 +119,22 @@ boolean removeIndex() {

@Override
boolean apply(NewAliasValidator aliasValidator, MetaData.Builder metadata, IndexMetaData index) {
aliasValidator.validate(alias, indexRouting, filter);
boolean isWriteIndex = writeIndex == null ? false : writeIndex;
if (writeIndex == null && metadata.getWriteIndex(alias) == null) {
isWriteIndex = true;
}
aliasValidator.validate(alias, indexRouting, filter, isWriteIndex);

AliasMetaData newAliasMd = AliasMetaData.newAliasMetaDataBuilder(alias).filter(filter).indexRouting(indexRouting)
.searchRouting(searchRouting).writeIndex(writeIndex).build();
.searchRouting(searchRouting).writeIndex(isWriteIndex).build();

// Check if this alias already exists
AliasMetaData currentAliasMd = index.getAliases().get(alias);
if (currentAliasMd != null && currentAliasMd.equals(newAliasMd)) {
// It already exists, ignore it
return false;
}

metadata.put(IndexMetaData.builder(index).putAlias(newAliasMd));
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.elasticsearch.Version;
import org.elasticsearch.cluster.AbstractDiffable;
import org.elasticsearch.cluster.Diff;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
Expand All @@ -36,7 +37,6 @@
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;
import java.util.Collections;
Expand All @@ -57,6 +57,7 @@ public class AliasMetaData extends AbstractDiffable<AliasMetaData> implements To

private final Set<String> searchRoutingValues;

@Nullable
private final Boolean writeIndex;

private AliasMetaData(String alias, CompressedXContent filter, String indexRouting, String searchRouting, Boolean writeIndex) {
Expand Down Expand Up @@ -147,7 +148,7 @@ public boolean equals(Object o) {
if (indexRouting != null ? !indexRouting.equals(that.indexRouting) : that.indexRouting != null) return false;
if (searchRouting != null ? !searchRouting.equals(that.searchRouting) : that.searchRouting != null)
return false;
if (writeIndex != null ? !writeIndex.equals(that.writeIndex) : that.writeIndex != null)
if (writeIndex != null ? writeIndex != that.writeIndex : that.writeIndex != null)
return false;

return true;
Expand Down Expand Up @@ -212,7 +213,7 @@ public AliasMetaData(StreamInput in) throws IOException {
if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
writeIndex = in.readOptionalBoolean();
} else {
writeIndex = false;
writeIndex = null;
}
}

Expand Down Expand Up @@ -241,6 +242,7 @@ public static class Builder {

private String searchRouting;

@Nullable
private Boolean writeIndex;


Expand Down Expand Up @@ -307,7 +309,7 @@ public Builder searchRouting(String searchRouting) {
return this;
}

public Builder writeIndex(Boolean writeIndex) {
public Builder writeIndex(@Nullable Boolean writeIndex) {
this.writeIndex = writeIndex;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ public List<IndexMetaData> getIndices() {
return referenceIndexMetaDatas;
}


public IndexMetaData getWriteIndex() {
return referenceIndexMetaDatas.stream().filter(i -> i.getAliases().get(aliasName).writeIndex()).findAny().orElse(null);
}

/**
* Returns the unique alias metadata per concrete index.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,15 @@
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.Rewriteable;
import org.elasticsearch.indices.InvalidAliasNameException;

import java.io.IOException;
import java.util.function.Function;
import java.util.function.Supplier;

import static org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder;

Expand All @@ -57,7 +59,8 @@ public AliasValidator(Settings settings) {
* @throws IllegalArgumentException if the alias is not valid
*/
public void validateAlias(Alias alias, String index, MetaData metaData) {
validateAlias(alias.name(), index, alias.indexRouting(), name -> metaData.index(name));
validateAlias(alias.name(), index, alias.indexRouting(), alias.writeIndex(), metaData::index,
() -> metaData.getWriteIndex(alias.name()));
}

/**
Expand All @@ -66,7 +69,8 @@ public void validateAlias(Alias alias, String index, MetaData metaData) {
* @throws IllegalArgumentException if the alias is not valid
*/
public void validateAliasMetaData(AliasMetaData aliasMetaData, String index, MetaData metaData) {
validateAlias(aliasMetaData.alias(), index, aliasMetaData.indexRouting(), name -> metaData.index(name));
validateAlias(aliasMetaData.alias(), index, aliasMetaData.indexRouting(), aliasMetaData.writeIndex(), metaData::index,
() -> metaData.getWriteIndex(aliasMetaData.alias()));
}

/**
Expand All @@ -90,7 +94,8 @@ public void validateAliasStandalone(Alias alias) {
/**
* Validate a proposed alias.
*/
public void validateAlias(String alias, String index, @Nullable String indexRouting, Function<String, IndexMetaData> indexLookup) {
public void validateAlias(String alias, String index, @Nullable String indexRouting, @Nullable Boolean writeIndex,
Function<String, IndexMetaData> indexLookup, Supplier<Index> writeIndexSupplier) {
validateAliasStandalone(alias, indexRouting);

if (!Strings.hasText(index)) {
Expand All @@ -101,6 +106,11 @@ public void validateAlias(String alias, String index, @Nullable String indexRout
if (indexNamedSameAsAlias != null) {
throw new InvalidAliasNameException(indexNamedSameAsAlias.getIndex(), alias, "an index exists with the same name as the alias");
}

Index existingWriteIndex = writeIndexSupplier.get();
if (Boolean.TRUE.equals(writeIndex) && existingWriteIndex != null && existingWriteIndex.getName().equals(index) == false) {
throw new IllegalArgumentException("alias [" + alias + "] already has a write index [" + existingWriteIndex.getName() + "]");
}
}

void validateAliasStandalone(String alias, String indexRouting) {
Expand Down Expand Up @@ -145,6 +155,27 @@ public void validateAliasFilter(String alias, byte[] filter, QueryShardContext q
}
}

/**
* throws exception if specified alias is attempting to be write_only while this alias points to another index
*
* @param aliasName the alias in question
* @param metaData the Cluster metadata
* @throws IllegalArgumentException if the alias cannot be write_only
*/
public void validateAliasWriteOnly(String aliasName, boolean isWriteIndex, MetaData metaData) {
if (isWriteIndex) {
AliasOrIndex aliasOrIndex = metaData.getAliasAndIndexLookup().get(aliasName);
if (aliasOrIndex != null && aliasOrIndex.isAlias()) {
AliasOrIndex.Alias alias = (AliasOrIndex.Alias) aliasOrIndex;
IndexMetaData writeIndex = alias.getWriteIndex();
if (writeIndex != null) {
throw new IllegalArgumentException("alias [" + aliasName +
"] already has a write index [" + writeIndex.getIndex().getName() + "]");
}
}
}
}

private static void validateAliasFilter(XContentParser parser, QueryShardContext queryShardContext) throws IOException {
QueryBuilder parseInnerQueryBuilder = parseInnerQueryBuilder(parser);
QueryBuilder queryBuilder = Rewriteable.rewrite(parseInnerQueryBuilder, queryShardContext, true);
Expand Down
Loading

0 comments on commit 7baf86b

Please sign in to comment.