Allow users to override the name for the rollover index

This commit is contained in:
Areek Zillur 2016-06-09 13:43:19 -04:00
parent 756af81b00
commit 41d31541a6
10 changed files with 74 additions and 24 deletions

View File

@ -70,14 +70,16 @@ public class RolloverRequest extends AcknowledgedRequest<RolloverRequest> implem
} }
private String alias; private String alias;
private String newIndexName;
private boolean dryRun; private boolean dryRun;
private Set<Condition> conditions = new HashSet<>(2); private Set<Condition> conditions = new HashSet<>(2);
private CreateIndexRequest createIndexRequest = new CreateIndexRequest("_na_"); private CreateIndexRequest createIndexRequest = new CreateIndexRequest("_na_");
RolloverRequest() {} RolloverRequest() {}
public RolloverRequest(String alias) { public RolloverRequest(String alias, String newIndexName) {
this.alias = alias; this.alias = alias;
this.newIndexName = newIndexName;
} }
@Override @Override
@ -96,6 +98,7 @@ public class RolloverRequest extends AcknowledgedRequest<RolloverRequest> implem
public void readFrom(StreamInput in) throws IOException { public void readFrom(StreamInput in) throws IOException {
super.readFrom(in); super.readFrom(in);
alias = in.readString(); alias = in.readString();
newIndexName = in.readOptionalString();
dryRun = in.readBoolean(); dryRun = in.readBoolean();
int size = in.readVInt(); int size = in.readVInt();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
@ -109,6 +112,7 @@ public class RolloverRequest extends AcknowledgedRequest<RolloverRequest> implem
public void writeTo(StreamOutput out) throws IOException { public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out); super.writeTo(out);
out.writeString(alias); out.writeString(alias);
out.writeOptionalString(newIndexName);
out.writeBoolean(dryRun); out.writeBoolean(dryRun);
out.writeVInt(conditions.size()); out.writeVInt(conditions.size());
for (Condition condition : conditions) { for (Condition condition : conditions) {
@ -134,6 +138,12 @@ public class RolloverRequest extends AcknowledgedRequest<RolloverRequest> implem
this.alias = alias; this.alias = alias;
} }
/**
* Sets the alias to rollover to another index
*/
public void setNewIndexName(String newIndexName) {
this.newIndexName = newIndexName;
}
/** /**
* Sets if the rollover should not be executed when conditions are met * Sets if the rollover should not be executed when conditions are met
*/ */
@ -175,6 +185,10 @@ public class RolloverRequest extends AcknowledgedRequest<RolloverRequest> implem
return alias; return alias;
} }
String getNewIndexName() {
return newIndexName;
}
CreateIndexRequest getCreateIndexRequest() { CreateIndexRequest getCreateIndexRequest() {
return createIndexRequest; return createIndexRequest;
} }

View File

@ -31,8 +31,13 @@ public class RolloverRequestBuilder extends MasterNodeOperationRequestBuilder<Ro
super(client, action, new RolloverRequest()); super(client, action, new RolloverRequest());
} }
public RolloverRequestBuilder setAlias(String sourceAlias) { public RolloverRequestBuilder setAlias(String alias) {
this.request.setAlias(sourceAlias); this.request.setAlias(alias);
return this;
}
public RolloverRequestBuilder setNewIndexName(String newIndexName) {
this.request.setNewIndexName(newIndexName);
return this; return this;
} }

View File

@ -106,7 +106,9 @@ public class TransportRolloverAction extends TransportMasterNodeAction<RolloverR
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 rolloverIndexName = generateRolloverIndexName(sourceIndexName); final String rolloverIndexName = (rolloverRequest.getNewIndexName() != null)
? rolloverRequest.getNewIndexName()
: generateRolloverIndexName(sourceIndexName);
if (rolloverRequest.isDryRun()) { if (rolloverRequest.isDryRun()) {
listener.onResponse( listener.onResponse(
new RolloverResponse(sourceIndexName, rolloverIndexName, conditionResults, true, false)); new RolloverResponse(sourceIndexName, rolloverIndexName, conditionResults, true, false));

View File

@ -299,7 +299,7 @@ public class MetaDataMappingService extends AbstractComponent {
assert mappingType != null; assert mappingType != null;
if (!MapperService.DEFAULT_MAPPING.equals(mappingType) && mappingType.charAt(0) == '_') { if (!MapperService.DEFAULT_MAPPING.equals(mappingType) && mappingType.charAt(0) == '_') {
throw new InvalidTypeNameException("Document mapping type name can't start with '_'"); throw new InvalidTypeNameException("Document mapping type name can't start with '_', found: [" + mappingType + "]");
} }
MetaData.Builder builder = MetaData.builder(metaData); MetaData.Builder builder = MetaData.builder(metaData);
for (Tuple<IndexService, IndexMetaData> toUpdate : updateList) { for (Tuple<IndexService, IndexMetaData> toUpdate : updateList) {

View File

@ -38,12 +38,13 @@ public class RestRolloverIndexAction extends BaseRestHandler {
public RestRolloverIndexAction(Settings settings, RestController controller, Client client) { public RestRolloverIndexAction(Settings settings, RestController controller, Client client) {
super(settings, client); super(settings, client);
controller.registerHandler(RestRequest.Method.POST, "/{index}/_rollover", this); controller.registerHandler(RestRequest.Method.POST, "/{index}/_rollover", this);
controller.registerHandler(RestRequest.Method.POST, "/{index}/_rollover/{new_index}", this);
} }
@SuppressWarnings({"unchecked"}) @SuppressWarnings({"unchecked"})
@Override @Override
public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) { public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) {
RolloverRequest rolloverIndexRequest = new RolloverRequest(request.param("index")); RolloverRequest rolloverIndexRequest = new RolloverRequest(request.param("index"), request.param("new_index"));
if (request.hasContent()) { if (request.hasContent()) {
rolloverIndexRequest.source(request.content()); rolloverIndexRequest.source(request.content());
} }

View File

@ -130,6 +130,24 @@ public class RolloverIT extends ESIntegTestCase {
assertNull(newIndex); assertNull(newIndex);
} }
public void testRolloverWithNewIndexName() throws Exception {
assertAcked(prepareCreate("test_index").addAlias(new Alias("test_alias")).get());
index("test_index", "type1", "1", "field", "value");
flush("test_index");
final RolloverResponse response = client().admin().indices().prepareRolloverIndex("test_alias")
.setNewIndexName("test_new_index").get();
assertThat(response.getOldIndex(), equalTo("test_index"));
assertThat(response.getNewIndex(), equalTo("test_new_index"));
assertThat(response.isDryRun(), equalTo(false));
assertThat(response.isRolledOver(), equalTo(true));
assertThat(response.getConditionStatus().size(), equalTo(0));
final ClusterState state = client().admin().cluster().prepareState().get().getState();
final IndexMetaData oldIndex = state.metaData().index("test_index");
assertFalse(oldIndex.getAliases().containsKey("test_alias"));
final IndexMetaData newIndex = state.metaData().index("test_new_index");
assertTrue(newIndex.getAliases().containsKey("test_alias"));
}
public void testRolloverOnExistingIndex() throws Exception { public void testRolloverOnExistingIndex() throws Exception {
assertAcked(prepareCreate("test_index-0").addAlias(new Alias("test_alias")).get()); assertAcked(prepareCreate("test_index-0").addAlias(new Alias("test_alias")).get());
index("test_index-0", "type1", "1", "field", "value"); index("test_index-0", "type1", "1", "field", "value");

View File

@ -31,7 +31,7 @@ import static org.hamcrest.Matchers.equalTo;
public class RolloverRequestTests extends ESTestCase { public class RolloverRequestTests extends ESTestCase {
public void testConditionsParsing() throws Exception { public void testConditionsParsing() throws Exception {
final RolloverRequest request = new RolloverRequest(randomAsciiOfLength(10)); final RolloverRequest request = new RolloverRequest(randomAsciiOfLength(10), randomAsciiOfLength(10));
final XContentBuilder builder = XContentFactory.jsonBuilder() final XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject() .startObject()
.startObject("conditions") .startObject("conditions")
@ -56,7 +56,7 @@ public class RolloverRequestTests extends ESTestCase {
} }
public void testParsingWithIndexSettings() throws Exception { public void testParsingWithIndexSettings() throws Exception {
final RolloverRequest request = new RolloverRequest(randomAsciiOfLength(10)); final RolloverRequest request = new RolloverRequest(randomAsciiOfLength(10), randomAsciiOfLength(10));
final XContentBuilder builder = XContentFactory.jsonBuilder() final XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject() .startObject()
.startObject("conditions") .startObject("conditions")

View File

@ -91,7 +91,7 @@ public class TransportRolloverActionTests extends ESTestCase {
String sourceAlias = randomAsciiOfLength(10); String sourceAlias = randomAsciiOfLength(10);
String sourceIndex = randomAsciiOfLength(10); String sourceIndex = randomAsciiOfLength(10);
String targetIndex = randomAsciiOfLength(10); String targetIndex = randomAsciiOfLength(10);
final RolloverRequest rolloverRequest = new RolloverRequest(sourceAlias); final RolloverRequest rolloverRequest = new RolloverRequest(sourceAlias, targetIndex);
final IndicesAliasesClusterStateUpdateRequest updateRequest = final IndicesAliasesClusterStateUpdateRequest updateRequest =
TransportRolloverAction.prepareRolloverAliasesUpdateRequest(sourceIndex, targetIndex, rolloverRequest); TransportRolloverAction.prepareRolloverAliasesUpdateRequest(sourceIndex, targetIndex, rolloverRequest);
@ -137,13 +137,16 @@ public class TransportRolloverActionTests extends ESTestCase {
).build(); ).build();
expectThrows(IllegalArgumentException.class, () -> expectThrows(IllegalArgumentException.class, () ->
TransportRolloverAction.validate(metaData, new RolloverRequest(aliasWithMultipleIndices))); TransportRolloverAction.validate(metaData, new RolloverRequest(aliasWithMultipleIndices,
randomAsciiOfLength(10))));
expectThrows(IllegalArgumentException.class, () -> expectThrows(IllegalArgumentException.class, () ->
TransportRolloverAction.validate(metaData, new RolloverRequest(randomFrom(index1, index2)))); TransportRolloverAction.validate(metaData, new RolloverRequest(randomFrom(index1, index2),
randomAsciiOfLength(10))));
expectThrows(IllegalArgumentException.class, () -> expectThrows(IllegalArgumentException.class, () ->
TransportRolloverAction.validate(metaData, new RolloverRequest(randomAsciiOfLength(5))) TransportRolloverAction.validate(metaData, new RolloverRequest(randomAsciiOfLength(5),
randomAsciiOfLength(10)))
); );
TransportRolloverAction.validate(metaData, new RolloverRequest(alias)); TransportRolloverAction.validate(metaData, new RolloverRequest(alias, randomAsciiOfLength(10)));
} }
public void testGenerateRolloverIndexName() throws Exception { public void testGenerateRolloverIndexName() throws Exception {
@ -162,7 +165,7 @@ public class TransportRolloverActionTests extends ESTestCase {
public void testCreateIndexRequest() throws Exception { public void testCreateIndexRequest() throws Exception {
String alias = randomAsciiOfLength(10); String alias = randomAsciiOfLength(10);
String rolloverIndex = randomAsciiOfLength(10); String rolloverIndex = randomAsciiOfLength(10);
final RolloverRequest rolloverRequest = new RolloverRequest(alias); final RolloverRequest rolloverRequest = new RolloverRequest(alias, randomAsciiOfLength(10));
final Settings settings = Settings.builder() final Settings settings = Settings.builder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT) .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID()) .put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())

View File

@ -4,9 +4,7 @@
The rollover index API allows to switch the index pointed to by an alias given some predicates. The rollover index API allows to switch the index pointed to by an alias given some predicates.
In order to rollover an index, the provided alias has to point to a single index. Upon satisfying In order to rollover an index, the provided alias has to point to a single index. Upon satisfying
any of the predicates, the alias is switched to point to the rollover index, if the rollover index any of the predicates, the alias is switched to point to the rollover index, if the rollover index
already exists, the rollover fails. The rollover API requires the old concrete index name to have already exists, the rollover fails.
`{index_prefix}-{num}` format, as rollover index name is generated following `{index_prefix}-{num+1}`
format.
This API is syntactic sugar for changing the index pointed to by an alias given some predicate. This API is syntactic sugar for changing the index pointed to by an alias given some predicate.
@ -14,18 +12,18 @@ The rollover API must be used against an alias that points to a single index:
[source,js] [source,js]
-------------------------------------------------- --------------------------------------------------
$ curl -XPUT 'http://localhost:9200/index-1/' -d '{ $ curl -XPUT 'http://localhost:9200/index1' -d '{
"aliases" : { "aliases" : {
"index_alias": {} "index_alias": {}
} }
}' }'
-------------------------------------------------- --------------------------------------------------
To rollover `index_alias` to point to a new index: To rollover `index_alias` to point to a new index `index2`:
[source,js] [source,js]
-------------------------------------------------- --------------------------------------------------
$ curl -XPOST 'http://localhost:9200/index_alias/_rollover' -d '{ $ curl -XPOST 'http://localhost:9200/index_alias/_rollover/index2' -d '{
"conditions" : { "conditions" : {
"max_age": "7d", <1> "max_age": "7d", <1>
"max_docs": 1000 <2> "max_docs": 1000 <2>
@ -35,10 +33,14 @@ $ curl -XPOST 'http://localhost:9200/index_alias/_rollover' -d '{
<1> Sets a condition that the index has to be at least 7 days old <1> Sets a condition that the index has to be at least 7 days old
<2> Sets a condition that the index has to have at least a 1000 documents <2> Sets a condition that the index has to have at least a 1000 documents
The API call above switches the index pointed to by `index_alias` from `index-1` to `index-2`, if any The API call above switches the index pointed to by `index_alias` from `index1` to `index2`, if any
of the conditions are met. `index-2` is created (using matching <<indices-templates>> if available). of the conditions are met. `index2` is created (using matching <<indices-templates>> if available).
The API call returns immediately if none of the conditions are met. The API call returns immediately if none of the conditions are met.
The rollover API can be used without specifying the name for the new index. In this case, the API requires
the old concrete index name to have `{index_prefix}-{num}` format, as rollover index name is generated
following `{index_prefix}-{num+1}` format.
The `_rollover` API is similar to <<indices-create-index>> and accepts `settings`, `mappings` and The `_rollover` API is similar to <<indices-create-index>> and accepts `settings`, `mappings` and
`aliases` to override the index create request for the rollover index. `aliases` to override the index create request for the rollover index.

View File

@ -3,13 +3,18 @@
"documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/indices-rollover-index.html", "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/indices-rollover-index.html",
"methods": ["POST"], "methods": ["POST"],
"url": { "url": {
"path": "/{alias}/_rollover", "path": "/{alias}/_rollover}",
"paths": ["/{alias}/_rollover"], "paths": ["/{alias}/_rollover", "/{alias}/_rollover/{new_index}"],
"parts": { "parts": {
"alias": { "alias": {
"type" : "string", "type" : "string",
"required" : true, "required" : true,
"description" : "The name of the alias to rollover" "description" : "The name of the alias to rollover"
},
"new_index": {
"type" : "string",
"required" : false,
"description" : "The name of the rollover index"
} }
}, },
"params": { "params": {