From f0007fd4ae26e8766af76a785f24d9ebeb2ff701 Mon Sep 17 00:00:00 2001 From: Shay Banon Date: Mon, 7 May 2012 14:27:30 +0300 Subject: [PATCH] Create Index: Allow to provide index warmers when creating an index, closes #1917. --- .../indices/create/CreateIndexRequest.java | 54 +++++++++++++++---- .../create/CreateIndexRequestBuilder.java | 6 +++ .../create/TransportCreateIndexAction.java | 30 ++++++----- .../metadata/MetaDataCreateIndexService.java | 13 ++++- .../wamer/SimpleIndicesWarmerTests.java | 31 +++++++++++ 5 files changed, 111 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java b/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java index 52d4f314fdb28..447311f451e70 100644 --- a/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java +++ b/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequest.java @@ -25,6 +25,7 @@ import org.elasticsearch.ElasticSearchParseException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.master.MasterNodeOperationRequest; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -65,6 +66,8 @@ public class CreateIndexRequest extends MasterNodeOperationRequest { private Map mappings = newHashMap(); + private Map customs = newHashMap(); + private TimeValue timeout = new TimeValue(10, TimeUnit.SECONDS); CreateIndexRequest() { @@ -271,15 +274,28 @@ public CreateIndexRequest source(byte[] source, int offset, int length) { */ public CreateIndexRequest source(Map source) { boolean found = false; - if (source.containsKey("settings")) { - settings((Map) source.get("settings")); - found = true; - } - if (source.containsKey("mappings")) { - found = true; - Map mappings = (Map) source.get("mappings"); - for (Map.Entry entry : mappings.entrySet()) { - mapping(entry.getKey(), (Map) entry.getValue()); + for (Map.Entry entry : source.entrySet()) { + String name = entry.getKey(); + if (name.equals("settings")) { + found = true; + settings((Map) entry.getValue()); + } else if (name.equals("mappings")) { + found = true; + Map mappings = (Map) entry.getValue(); + for (Map.Entry entry1 : mappings.entrySet()) { + mapping(entry1.getKey(), (Map) entry1.getValue()); + } + } else { + // maybe custom? + IndexMetaData.Custom.Factory factory = IndexMetaData.lookupFactory(name); + if (factory != null) { + found = true; + try { + customs.put(name, factory.fromMap((Map) entry.getValue())); + } catch (IOException e) { + throw new ElasticSearchParseException("failed to parse custom metadata for [" + name + "]"); + } + } } } if (!found) { @@ -293,6 +309,15 @@ Map mappings() { return this.mappings; } + public CreateIndexRequest custom(IndexMetaData.Custom custom) { + customs.put(custom.type(), custom); + return this; + } + + Map customs() { + return this.customs; + } + /** * Timeout to wait for the index creation to be acknowledged by current cluster nodes. Defaults * to 10s. @@ -338,6 +363,12 @@ public void readFrom(StreamInput in) throws IOException { for (int i = 0; i < size; i++) { mappings.put(in.readUTF(), in.readUTF()); } + int customSize = in.readVInt(); + for (int i = 0; i < customSize; i++) { + String type = in.readUTF(); + IndexMetaData.Custom customIndexMetaData = IndexMetaData.lookupFactorySafe(type).readFrom(in); + customs.put(type, customIndexMetaData); + } } @Override @@ -352,5 +383,10 @@ public void writeTo(StreamOutput out) throws IOException { out.writeUTF(entry.getKey()); out.writeUTF(entry.getValue()); } + out.writeVInt(customs.size()); + for (Map.Entry entry : customs.entrySet()) { + out.writeUTF(entry.getKey()); + IndexMetaData.lookupFactorySafe(entry.getKey()).writeTo(entry.getValue(), out); + } } } \ No newline at end of file diff --git a/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequestBuilder.java b/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequestBuilder.java index 2f8f1a922d4e3..6afc6f7a1757e 100644 --- a/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequestBuilder.java +++ b/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexRequestBuilder.java @@ -22,6 +22,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.admin.indices.support.BaseIndicesRequestBuilder; import org.elasticsearch.client.IndicesAdminClient; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -159,6 +160,11 @@ public CreateIndexRequestBuilder setSource(Map source) { return this; } + public CreateIndexRequestBuilder setCustom(IndexMetaData.Custom custom) { + request.custom(custom); + return this; + } + /** * Sets the settings and mappings as a single source. */ diff --git a/src/main/java/org/elasticsearch/action/admin/indices/create/TransportCreateIndexAction.java b/src/main/java/org/elasticsearch/action/admin/indices/create/TransportCreateIndexAction.java index 3e8ecdab8ed7c..5168c3a2197ce 100644 --- a/src/main/java/org/elasticsearch/action/admin/indices/create/TransportCreateIndexAction.java +++ b/src/main/java/org/elasticsearch/action/admin/indices/create/TransportCreateIndexAction.java @@ -83,19 +83,23 @@ protected CreateIndexResponse masterOperation(CreateIndexRequest request, Cluste final AtomicReference responseRef = new AtomicReference(); final AtomicReference failureRef = new AtomicReference(); final CountDownLatch latch = new CountDownLatch(1); - createIndexService.createIndex(new MetaDataCreateIndexService.Request(cause, request.index()).settings(request.settings()).mappings(request.mappings()).timeout(request.timeout()), new MetaDataCreateIndexService.Listener() { - @Override - public void onResponse(MetaDataCreateIndexService.Response response) { - responseRef.set(new CreateIndexResponse(response.acknowledged())); - latch.countDown(); - } - - @Override - public void onFailure(Throwable t) { - failureRef.set(t); - latch.countDown(); - } - }); + createIndexService.createIndex(new MetaDataCreateIndexService.Request(cause, request.index()).settings(request.settings()) + .mappings(request.mappings()) + .customs(request.customs()) + .timeout(request.timeout()), + new MetaDataCreateIndexService.Listener() { + @Override + public void onResponse(MetaDataCreateIndexService.Response response) { + responseRef.set(new CreateIndexResponse(response.acknowledged())); + latch.countDown(); + } + + @Override + public void onFailure(Throwable t) { + failureRef.set(t); + latch.countDown(); + } + }); try { latch.await(); diff --git a/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java b/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java index b6da90ed3f004..a64c38d9fad7c 100644 --- a/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java +++ b/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java @@ -68,6 +68,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import static com.google.common.collect.Maps.newHashMap; import static org.elasticsearch.cluster.ClusterState.newClusterStateBuilder; import static org.elasticsearch.cluster.metadata.IndexMetaData.*; import static org.elasticsearch.cluster.metadata.MetaData.newMetaDataBuilder; @@ -154,7 +155,9 @@ public ClusterState execute(ClusterState currentState) { mappings.put(entry.getKey(), parseMapping(entry.getValue())); } - // TODO: request should be able to add custom metadata + for (Map.Entry entry : request.customs.entrySet()) { + customs.put(entry.getKey(), entry.getValue()); + } // apply templates, merging the mappings into the request mapping if exists for (IndexTemplateMetaData template : templates) { @@ -503,6 +506,9 @@ public static class Request { Map mappings = Maps.newHashMap(); + Map customs = newHashMap(); + + TimeValue timeout = TimeValue.timeValueSeconds(5); Set blocks = Sets.newHashSet(); @@ -536,6 +542,11 @@ public Request mappingsCompressed(Map mappings) throws return this; } + public Request customs(Map customs) { + this.customs.putAll(customs); + return this; + } + public Request blocks(Set blocks) { this.blocks.addAll(blocks); return this; diff --git a/src/test/java/org/elasticsearch/test/integration/indices/wamer/SimpleIndicesWarmerTests.java b/src/test/java/org/elasticsearch/test/integration/indices/wamer/SimpleIndicesWarmerTests.java index 466e8774047dd..be09386f61903 100644 --- a/src/test/java/org/elasticsearch/test/integration/indices/wamer/SimpleIndicesWarmerTests.java +++ b/src/test/java/org/elasticsearch/test/integration/indices/wamer/SimpleIndicesWarmerTests.java @@ -111,4 +111,35 @@ public void templateWarmer() { client.prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); client.prepareIndex("test", "type1", "2").setSource("field", "value2").setRefresh(true).execute().actionGet(); } + + @Test + public void createIndexWarmer() { + client.admin().indices().prepareDelete().execute().actionGet(); + + client.admin().indices().prepareCreate("test") + .setSource("{\n" + + " \"settings\" : {\n" + + " \"index.number_of_shards\" : 1\n" + + " },\n" + + " \"warmers\" : {\n" + + " \"warmer_1\" : {\n" + + " \"types\" : [],\n" + + " \"source\" : {\n" + + " \"query\" : {\n" + + " \"match_all\" : {}\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}") + .execute().actionGet(); + + ClusterState clusterState = client.admin().cluster().prepareState().execute().actionGet().state(); + IndexWarmersMetaData warmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); + assertThat(warmersMetaData, Matchers.notNullValue()); + assertThat(warmersMetaData.entries().size(), equalTo(1)); + + client.prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); + client.prepareIndex("test", "type1", "2").setSource("field", "value2").setRefresh(true).execute().actionGet(); + } }