Skip to content

Commit ece9f50

Browse files
committed
explore
1 parent 053e9fb commit ece9f50

15 files changed

+312
-54
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/alias/Alias.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class Alias implements Streamable, ToXContentObject {
4848
private static final ParseField ROUTING = new ParseField("routing");
4949
private static final ParseField INDEX_ROUTING = new ParseField("index_routing", "indexRouting", "index-routing");
5050
private static final ParseField SEARCH_ROUTING = new ParseField("search_routing", "searchRouting", "search-routing");
51+
private static final ParseField IS_WRITE_INDEX = new ParseField("is_write_index");
5152

5253
private String name;
5354

@@ -60,6 +61,9 @@ public class Alias implements Streamable, ToXContentObject {
6061
@Nullable
6162
private String searchRouting;
6263

64+
@Nullable
65+
private boolean writeIndex;
66+
6367
private Alias() {
6468

6569
}
@@ -166,6 +170,18 @@ public Alias searchRouting(String searchRouting) {
166170
return this;
167171
}
168172

173+
public boolean isWriteIndex() {
174+
return writeIndex;
175+
}
176+
177+
/**
178+
* Associates a write-only alias boolean flag to the alias
179+
*/
180+
public Alias writeIndex(boolean writeIndex) {
181+
this.writeIndex = writeIndex;
182+
return this;
183+
}
184+
169185
/**
170186
* Allows to read an alias from the provided input stream
171187
*/
@@ -181,6 +197,7 @@ public void readFrom(StreamInput in) throws IOException {
181197
filter = in.readOptionalString();
182198
indexRouting = in.readOptionalString();
183199
searchRouting = in.readOptionalString();
200+
writeIndex = in.readBoolean();
184201
}
185202

186203
@Override
@@ -189,6 +206,7 @@ public void writeTo(StreamOutput out) throws IOException {
189206
out.writeOptionalString(filter);
190207
out.writeOptionalString(indexRouting);
191208
out.writeOptionalString(searchRouting);
209+
out.writeBoolean(writeIndex);
192210
}
193211

194212
/**
@@ -218,6 +236,10 @@ public static Alias fromXContent(XContentParser parser) throws IOException {
218236
} else if (SEARCH_ROUTING.match(currentFieldName, parser.getDeprecationHandler())) {
219237
alias.searchRouting(parser.text());
220238
}
239+
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
240+
if (IS_WRITE_INDEX.match(currentFieldName, parser.getDeprecationHandler())) {
241+
alias.writeIndex(parser.booleanValue());
242+
}
221243
}
222244
}
223245
return alias;
@@ -244,6 +266,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
244266
}
245267
}
246268

269+
builder.field(IS_WRITE_INDEX.getPreferredName(), writeIndex);
270+
247271
builder.endObject();
248272
return builder;
249273
}

server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public static class AliasActions implements AliasesRequest, Writeable, ToXConten
8484
private static final ParseField ROUTING = new ParseField("routing");
8585
private static final ParseField INDEX_ROUTING = new ParseField("index_routing", "indexRouting", "index-routing");
8686
private static final ParseField SEARCH_ROUTING = new ParseField("search_routing", "searchRouting", "search-routing");
87+
private static final ParseField IS_WRITE_INDEX = new ParseField("is_write_index");
8788

8889
private static final ParseField ADD = new ParseField("add");
8990
private static final ParseField REMOVE = new ParseField("remove");
@@ -179,6 +180,7 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
179180
ADD_PARSER.declareField(AliasActions::routing, XContentParser::text, ROUTING, ValueType.INT);
180181
ADD_PARSER.declareField(AliasActions::indexRouting, XContentParser::text, INDEX_ROUTING, ValueType.INT);
181182
ADD_PARSER.declareField(AliasActions::searchRouting, XContentParser::text, SEARCH_ROUTING, ValueType.INT);
183+
ADD_PARSER.declareField(AliasActions::writeIndex, XContentParser::booleanValue, IS_WRITE_INDEX, ValueType.BOOLEAN);
182184
}
183185
private static final ObjectParser<AliasActions, Void> REMOVE_PARSER = parser(REMOVE.getPreferredName(), AliasActions::remove);
184186
private static final ObjectParser<AliasActions, Void> REMOVE_INDEX_PARSER = parser(REMOVE_INDEX.getPreferredName(),
@@ -215,6 +217,7 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
215217
private String routing;
216218
private String indexRouting;
217219
private String searchRouting;
220+
private boolean writeIndex;
218221

219222
public AliasActions(AliasActions.Type type) {
220223
this.type = type;
@@ -401,6 +404,18 @@ public AliasActions filter(QueryBuilder filter) {
401404
}
402405
}
403406

407+
public AliasActions writeIndex(boolean writeIndex) {
408+
if (type != AliasActions.Type.ADD) {
409+
throw new IllegalArgumentException("[is_write_index] is unsupported for [" + type + "]");
410+
}
411+
this.writeIndex = writeIndex;
412+
return this;
413+
}
414+
415+
public boolean isWriteIndex() {
416+
return writeIndex;
417+
}
418+
404419
@Override
405420
public String[] aliases() {
406421
return aliases;

server/src/main/java/org/elasticsearch/action/admin/indices/alias/TransportIndicesAliasesAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ protected void masterOperation(final IndicesAliasesRequest request, final Cluste
100100
switch (action.actionType()) {
101101
case ADD:
102102
for (String alias : concreteAliases(action, state.metaData(), index)) {
103-
finalActions.add(new AliasAction.Add(index, alias, action.filter(), action.indexRouting(), action.searchRouting()));
103+
finalActions.add(new AliasAction.Add(index, alias, action.filter(), action.indexRouting(),
104+
action.searchRouting(), action.isWriteIndex()));
104105
}
105106
break;
106107
case REMOVE:

server/src/main/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverAction.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ protected void masterOperation(final RolloverRequest rolloverRequest, final Clus
109109
final MetaData metaData = state.metaData();
110110
validate(metaData, rolloverRequest);
111111
final AliasOrIndex aliasOrIndex = metaData.getAliasAndIndexLookup().get(rolloverRequest.getAlias());
112-
final IndexMetaData indexMetaData = aliasOrIndex.getIndices().get(0);
112+
final IndexMetaData indexMetaData = ((AliasOrIndex.Alias) aliasOrIndex).getWriteIndices().get(0);
113113
final String sourceProvidedName = indexMetaData.getSettings().get(IndexMetaData.SETTING_INDEX_PROVIDED_NAME,
114114
indexMetaData.getIndex().getName());
115115
final String sourceIndexName = indexMetaData.getIndex().getName();
@@ -118,7 +118,7 @@ protected void masterOperation(final RolloverRequest rolloverRequest, final Clus
118118
: generateRolloverIndexName(sourceProvidedName, indexNameExpressionResolver);
119119
final String rolloverIndexName = indexNameExpressionResolver.resolveDateMathExpression(unresolvedName);
120120
MetaDataCreateIndexService.validateIndexName(rolloverIndexName, state); // will fail if the index already exists
121-
checkNoDuplicatedAliasInIndexTemplate(metaData, rolloverIndexName, rolloverRequest.getAlias());
121+
// checkNoDuplicatedAliasInIndexTemplate(metaData, rolloverIndexName, rolloverRequest.getAlias());
122122
client.admin().indices().prepareStats(sourceIndexName).clear().setDocs(true).execute(
123123
new ActionListener<IndicesStatsResponse>() {
124124
@Override
@@ -172,9 +172,11 @@ public void onFailure(Exception e) {
172172

173173
static IndicesAliasesClusterStateUpdateRequest prepareRolloverAliasesUpdateRequest(String oldIndex, String newIndex,
174174
RolloverRequest request) {
175+
// TODO(talevy): why wasn't filter,routing inherited?
175176
List<AliasAction> actions = unmodifiableList(Arrays.asList(
176-
new AliasAction.Add(newIndex, request.getAlias(), null, null, null),
177-
new AliasAction.Remove(oldIndex, request.getAlias())));
177+
new AliasAction.Add(oldIndex, request.getAlias(), null, null, null, false),
178+
new AliasAction.Add(newIndex, request.getAlias(), null, null, null, true)
179+
));
178180
final IndicesAliasesClusterStateUpdateRequest updateRequest = new IndicesAliasesClusterStateUpdateRequest(actions)
179181
.ackTimeout(request.ackTimeout())
180182
.masterNodeTimeout(request.masterNodeTimeout());
@@ -221,8 +223,9 @@ static void validate(MetaData metaData, RolloverRequest request) {
221223
if (aliasOrIndex.isAlias() == false) {
222224
throw new IllegalArgumentException("source alias is a concrete index");
223225
}
224-
if (aliasOrIndex.getIndices().size() != 1) {
225-
throw new IllegalArgumentException("source alias maps to multiple indices");
226+
AliasOrIndex.Alias alias = (AliasOrIndex.Alias) aliasOrIndex;
227+
if (alias.getIndices().size() > 1 && alias.getWriteIndices().isEmpty()) {
228+
throw new IllegalArgumentException("source alias maps to multiple indices with none set as write index");
226229
}
227230
}
228231

server/src/main/java/org/elasticsearch/cluster/metadata/AliasAction.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public String getIndex() {
5151

5252
/**
5353
* Apply the action.
54-
*
54+
*
5555
* @param aliasValidator call to validate a new alias before adding it to the builder
5656
* @param metadata metadata builder for the changes made by all actions as part of this request
5757
* @param index metadata for the index being changed
@@ -64,7 +64,7 @@ public String getIndex() {
6464
*/
6565
@FunctionalInterface
6666
public interface NewAliasValidator {
67-
void validate(String alias, @Nullable String indexRouting, @Nullable String filter);
67+
void validate(String alias, @Nullable String indexRouting, @Nullable String filter, boolean writeIndex);
6868
}
6969

7070
/**
@@ -82,10 +82,14 @@ public static class Add extends AliasAction {
8282
@Nullable
8383
private final String searchRouting;
8484

85+
@Nullable
86+
private final Boolean writeIndex;
87+
8588
/**
8689
* Build the operation.
8790
*/
88-
public Add(String index, String alias, @Nullable String filter, @Nullable String indexRouting, @Nullable String searchRouting) {
91+
public Add(String index, String alias, @Nullable String filter, @Nullable String indexRouting,
92+
@Nullable String searchRouting, @Nullable Boolean writeIndex) {
8993
super(index);
9094
if (false == Strings.hasText(alias)) {
9195
throw new IllegalArgumentException("[alias] is required");
@@ -94,6 +98,7 @@ public Add(String index, String alias, @Nullable String filter, @Nullable String
9498
this.filter = filter;
9599
this.indexRouting = indexRouting;
96100
this.searchRouting = searchRouting;
101+
this.writeIndex = writeIndex;
97102
}
98103

99104
/**
@@ -110,9 +115,18 @@ boolean removeIndex() {
110115

111116
@Override
112117
boolean apply(NewAliasValidator aliasValidator, MetaData.Builder metadata, IndexMetaData index) {
113-
aliasValidator.validate(alias, indexRouting, filter);
118+
boolean modifiedWriteIndex = Boolean.TRUE.equals(writeIndex);
119+
120+
// If alias for index is not set as write_index:true, we can safely try and set it so
121+
// TODO(talevy): do we want the same behavior here as in index creation?
122+
if (writeIndex == null && AliasValidator.validAliasWriteOnly(alias, true, metadata.indices())) {
123+
modifiedWriteIndex = true;
124+
}
125+
126+
aliasValidator.validate(alias, indexRouting, filter, modifiedWriteIndex);
127+
114128
AliasMetaData newAliasMd = AliasMetaData.newAliasMetaDataBuilder(alias).filter(filter).indexRouting(indexRouting)
115-
.searchRouting(searchRouting).build();
129+
.searchRouting(searchRouting).writeIndex(modifiedWriteIndex).build();
116130
// Check if this alias already exists
117131
AliasMetaData currentAliasMd = index.getAliases().get(alias);
118132
if (currentAliasMd != null && currentAliasMd.equals(newAliasMd)) {
@@ -182,4 +196,4 @@ boolean apply(NewAliasValidator aliasValidator, MetaData.Builder metadata, Index
182196
throw new UnsupportedOperationException();
183197
}
184198
}
185-
}
199+
}

server/src/main/java/org/elasticsearch/cluster/metadata/AliasMetaData.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ public class AliasMetaData extends AbstractDiffable<AliasMetaData> {
5454

5555
private final Set<String> searchRoutingValues;
5656

57-
private AliasMetaData(String alias, CompressedXContent filter, String indexRouting, String searchRouting) {
57+
private final Boolean writeIndex;
58+
59+
private AliasMetaData(String alias, CompressedXContent filter, String indexRouting, String searchRouting, Boolean writeIndex) {
5860
this.alias = alias;
5961
this.filter = filter;
6062
this.indexRouting = indexRouting;
@@ -64,10 +66,11 @@ private AliasMetaData(String alias, CompressedXContent filter, String indexRouti
6466
} else {
6567
searchRoutingValues = emptySet();
6668
}
69+
this.writeIndex = writeIndex;
6770
}
6871

6972
private AliasMetaData(AliasMetaData aliasMetaData, String alias) {
70-
this(alias, aliasMetaData.filter(), aliasMetaData.indexRouting(), aliasMetaData.searchRouting());
73+
this(alias, aliasMetaData.filter(), aliasMetaData.indexRouting(), aliasMetaData.searchRouting(), aliasMetaData.isWriteIndex());
7174
}
7275

7376
public String alias() {
@@ -110,6 +113,10 @@ public Set<String> searchRoutingValues() {
110113
return searchRoutingValues;
111114
}
112115

116+
public Boolean isWriteIndex() {
117+
return writeIndex;
118+
}
119+
113120
public static Builder builder(String alias) {
114121
return new Builder(alias);
115122
}
@@ -137,6 +144,8 @@ public boolean equals(Object o) {
137144
if (indexRouting != null ? !indexRouting.equals(that.indexRouting) : that.indexRouting != null) return false;
138145
if (searchRouting != null ? !searchRouting.equals(that.searchRouting) : that.searchRouting != null)
139146
return false;
147+
if (writeIndex != that.writeIndex)
148+
return false;
140149

141150
return true;
142151
}
@@ -147,6 +156,7 @@ public int hashCode() {
147156
result = 31 * result + (filter != null ? filter.hashCode() : 0);
148157
result = 31 * result + (indexRouting != null ? indexRouting.hashCode() : 0);
149158
result = 31 * result + (searchRouting != null ? searchRouting.hashCode() : 0);
159+
result = 31 * result + Boolean.hashCode(writeIndex);
150160
return result;
151161
}
152162

@@ -171,7 +181,7 @@ public void writeTo(StreamOutput out) throws IOException {
171181
} else {
172182
out.writeBoolean(false);
173183
}
174-
184+
out.writeBoolean(isWriteIndex());
175185
}
176186

177187
public AliasMetaData(StreamInput in) throws IOException {
@@ -193,6 +203,7 @@ public AliasMetaData(StreamInput in) throws IOException {
193203
searchRouting = null;
194204
searchRoutingValues = emptySet();
195205
}
206+
writeIndex = in.readBoolean();
196207
}
197208

198209
public static Diff<AliasMetaData> readDiffFrom(StreamInput in) throws IOException {
@@ -209,6 +220,8 @@ public static class Builder {
209220

210221
private String searchRouting;
211222

223+
private boolean writeIndex;
224+
212225

213226
public Builder(String alias) {
214227
this.alias = alias;
@@ -219,6 +232,7 @@ public Builder(AliasMetaData aliasMetaData) {
219232
filter = aliasMetaData.filter();
220233
indexRouting = aliasMetaData.indexRouting();
221234
searchRouting = aliasMetaData.searchRouting();
235+
writeIndex = aliasMetaData.isWriteIndex();
222236
}
223237

224238
public String alias() {
@@ -272,8 +286,13 @@ public Builder searchRouting(String searchRouting) {
272286
return this;
273287
}
274288

289+
public Builder writeIndex(boolean writeIndex) {
290+
this.writeIndex = writeIndex;
291+
return this;
292+
}
293+
275294
public AliasMetaData build() {
276-
return new AliasMetaData(alias, filter, indexRouting, searchRouting);
295+
return new AliasMetaData(alias, filter, indexRouting, searchRouting, writeIndex);
277296
}
278297

279298
public static void toXContent(AliasMetaData aliasMetaData, XContentBuilder builder, ToXContent.Params params) throws IOException {
@@ -295,6 +314,8 @@ public static void toXContent(AliasMetaData aliasMetaData, XContentBuilder build
295314
builder.field("search_routing", aliasMetaData.searchRouting());
296315
}
297316

317+
builder.field("is_write_index", Boolean.TRUE.equals(aliasMetaData.isWriteIndex()));
318+
298319
builder.endObject();
299320
}
300321

@@ -327,6 +348,10 @@ public static AliasMetaData fromXContent(XContentParser parser) throws IOExcepti
327348
} else if ("search_routing".equals(currentFieldName) || "searchRouting".equals(currentFieldName)) {
328349
builder.searchRouting(parser.text());
329350
}
351+
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
352+
if ("is_write_index".equals(currentFieldName)) {
353+
builder.writeIndex(parser.booleanValue());
354+
}
330355
}
331356
}
332357
return builder.build();

server/src/main/java/org/elasticsearch/cluster/metadata/AliasOrIndex.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Collections;
2626
import java.util.Iterator;
2727
import java.util.List;
28+
import java.util.stream.Collectors;
2829

2930
/**
3031
* Encapsulates the {@link IndexMetaData} instances of a concrete index or indices an alias is pointing to.
@@ -95,6 +96,12 @@ public List<IndexMetaData> getIndices() {
9596
return referenceIndexMetaDatas;
9697
}
9798

99+
100+
public List<IndexMetaData> getWriteIndices() {
101+
return referenceIndexMetaDatas.stream()
102+
.filter(i -> i.getAliases().get(aliasName).isWriteIndex()).collect(Collectors.toList());
103+
}
104+
98105
/**
99106
* Returns the unique alias metadata per concrete index.
100107
*

0 commit comments

Comments
 (0)