Create Index: Allow to provide index warmers when creating an index, closes #1917.

This commit is contained in:
Shay Banon 2012-05-07 14:27:30 +03:00
parent ca2dc1801c
commit f0007fd4ae
5 changed files with 110 additions and 22 deletions

View File

@ -25,6 +25,7 @@ import org.elasticsearch.ElasticSearchIllegalArgumentException;
import org.elasticsearch.ElasticSearchParseException; import org.elasticsearch.ElasticSearchParseException;
import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.support.master.MasterNodeOperationRequest; import org.elasticsearch.action.support.master.MasterNodeOperationRequest;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.collect.MapBuilder;
import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.StreamOutput;
@ -65,6 +66,8 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
private Map<String, String> mappings = newHashMap(); private Map<String, String> mappings = newHashMap();
private Map<String, IndexMetaData.Custom> customs = newHashMap();
private TimeValue timeout = new TimeValue(10, TimeUnit.SECONDS); private TimeValue timeout = new TimeValue(10, TimeUnit.SECONDS);
CreateIndexRequest() { CreateIndexRequest() {
@ -271,15 +274,28 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
*/ */
public CreateIndexRequest source(Map<String, Object> source) { public CreateIndexRequest source(Map<String, Object> source) {
boolean found = false; boolean found = false;
if (source.containsKey("settings")) { for (Map.Entry<String, Object> entry : source.entrySet()) {
settings((Map<String, Object>) source.get("settings")); String name = entry.getKey();
found = true; if (name.equals("settings")) {
} found = true;
if (source.containsKey("mappings")) { settings((Map<String, Object>) entry.getValue());
found = true; } else if (name.equals("mappings")) {
Map<String, Object> mappings = (Map<String, Object>) source.get("mappings"); found = true;
for (Map.Entry<String, Object> entry : mappings.entrySet()) { Map<String, Object> mappings = (Map<String, Object>) entry.getValue();
mapping(entry.getKey(), (Map<String, Object>) entry.getValue()); for (Map.Entry<String, Object> entry1 : mappings.entrySet()) {
mapping(entry1.getKey(), (Map<String, Object>) entry1.getValue());
}
} else {
// maybe custom?
IndexMetaData.Custom.Factory factory = IndexMetaData.lookupFactory(name);
if (factory != null) {
found = true;
try {
customs.put(name, factory.fromMap((Map<String, Object>) entry.getValue()));
} catch (IOException e) {
throw new ElasticSearchParseException("failed to parse custom metadata for [" + name + "]");
}
}
} }
} }
if (!found) { if (!found) {
@ -293,6 +309,15 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
return this.mappings; return this.mappings;
} }
public CreateIndexRequest custom(IndexMetaData.Custom custom) {
customs.put(custom.type(), custom);
return this;
}
Map<String, IndexMetaData.Custom> customs() {
return this.customs;
}
/** /**
* Timeout to wait for the index creation to be acknowledged by current cluster nodes. Defaults * Timeout to wait for the index creation to be acknowledged by current cluster nodes. Defaults
* to <tt>10s</tt>. * to <tt>10s</tt>.
@ -338,6 +363,12 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
mappings.put(in.readUTF(), in.readUTF()); 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 @Override
@ -352,5 +383,10 @@ public class CreateIndexRequest extends MasterNodeOperationRequest {
out.writeUTF(entry.getKey()); out.writeUTF(entry.getKey());
out.writeUTF(entry.getValue()); out.writeUTF(entry.getValue());
} }
out.writeVInt(customs.size());
for (Map.Entry<String, IndexMetaData.Custom> entry : customs.entrySet()) {
out.writeUTF(entry.getKey());
IndexMetaData.lookupFactorySafe(entry.getKey()).writeTo(entry.getValue(), out);
}
} }
} }

View File

@ -22,6 +22,7 @@ package org.elasticsearch.action.admin.indices.create;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.support.BaseIndicesRequestBuilder; import org.elasticsearch.action.admin.indices.support.BaseIndicesRequestBuilder;
import org.elasticsearch.client.IndicesAdminClient; import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
@ -159,6 +160,11 @@ public class CreateIndexRequestBuilder extends BaseIndicesRequestBuilder<CreateI
return this; return this;
} }
public CreateIndexRequestBuilder setCustom(IndexMetaData.Custom custom) {
request.custom(custom);
return this;
}
/** /**
* Sets the settings and mappings as a single source. * Sets the settings and mappings as a single source.
*/ */

View File

@ -83,19 +83,23 @@ public class TransportCreateIndexAction extends TransportMasterNodeOperationActi
final AtomicReference<CreateIndexResponse> responseRef = new AtomicReference<CreateIndexResponse>(); final AtomicReference<CreateIndexResponse> responseRef = new AtomicReference<CreateIndexResponse>();
final AtomicReference<Throwable> failureRef = new AtomicReference<Throwable>(); final AtomicReference<Throwable> failureRef = new AtomicReference<Throwable>();
final CountDownLatch latch = new CountDownLatch(1); 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() { createIndexService.createIndex(new MetaDataCreateIndexService.Request(cause, request.index()).settings(request.settings())
@Override .mappings(request.mappings())
public void onResponse(MetaDataCreateIndexService.Response response) { .customs(request.customs())
responseRef.set(new CreateIndexResponse(response.acknowledged())); .timeout(request.timeout()),
latch.countDown(); new MetaDataCreateIndexService.Listener() {
} @Override
public void onResponse(MetaDataCreateIndexService.Response response) {
responseRef.set(new CreateIndexResponse(response.acknowledged()));
latch.countDown();
}
@Override @Override
public void onFailure(Throwable t) { public void onFailure(Throwable t) {
failureRef.set(t); failureRef.set(t);
latch.countDown(); latch.countDown();
} }
}); });
try { try {
latch.await(); latch.await();

View File

@ -68,6 +68,7 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; 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.ClusterState.newClusterStateBuilder;
import static org.elasticsearch.cluster.metadata.IndexMetaData.*; import static org.elasticsearch.cluster.metadata.IndexMetaData.*;
import static org.elasticsearch.cluster.metadata.MetaData.newMetaDataBuilder; import static org.elasticsearch.cluster.metadata.MetaData.newMetaDataBuilder;
@ -154,7 +155,9 @@ public class MetaDataCreateIndexService extends AbstractComponent {
mappings.put(entry.getKey(), parseMapping(entry.getValue())); mappings.put(entry.getKey(), parseMapping(entry.getValue()));
} }
// TODO: request should be able to add custom metadata for (Map.Entry<String, Custom> entry : request.customs.entrySet()) {
customs.put(entry.getKey(), entry.getValue());
}
// apply templates, merging the mappings into the request mapping if exists // apply templates, merging the mappings into the request mapping if exists
for (IndexTemplateMetaData template : templates) { for (IndexTemplateMetaData template : templates) {
@ -503,6 +506,9 @@ public class MetaDataCreateIndexService extends AbstractComponent {
Map<String, String> mappings = Maps.newHashMap(); Map<String, String> mappings = Maps.newHashMap();
Map<String, IndexMetaData.Custom> customs = newHashMap();
TimeValue timeout = TimeValue.timeValueSeconds(5); TimeValue timeout = TimeValue.timeValueSeconds(5);
Set<ClusterBlock> blocks = Sets.newHashSet(); Set<ClusterBlock> blocks = Sets.newHashSet();
@ -536,6 +542,11 @@ public class MetaDataCreateIndexService extends AbstractComponent {
return this; return this;
} }
public Request customs(Map<String, Custom> customs) {
this.customs.putAll(customs);
return this;
}
public Request blocks(Set<ClusterBlock> blocks) { public Request blocks(Set<ClusterBlock> blocks) {
this.blocks.addAll(blocks); this.blocks.addAll(blocks);
return this; return this;

View File

@ -111,4 +111,35 @@ public class SimpleIndicesWarmerTests extends AbstractNodesTests {
client.prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); client.prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet();
client.prepareIndex("test", "type1", "2").setSource("field", "value2").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();
}
} }