/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.versioning; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.test.ESIntegTestCase; import org.junit.Test; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; /** * */ public class ConcurrentDocumentOperationIT extends ESIntegTestCase { @Test public void concurrentOperationOnSameDocTest() throws Exception { logger.info("--> create an index with 1 shard and max replicas based on nodes"); assertAcked(prepareCreate("test") .setSettings(settingsBuilder().put(indexSettings()).put("index.number_of_shards", 1))); logger.info("execute concurrent updates on the same doc"); int numberOfUpdates = 100; final AtomicReference<Throwable> failure = new AtomicReference<>(); final CountDownLatch latch = new CountDownLatch(numberOfUpdates); for (int i = 0; i < numberOfUpdates; i++) { client().prepareIndex("test", "type1", "1").setSource("field1", i).execute(new ActionListener<IndexResponse>() { @Override public void onResponse(IndexResponse response) { latch.countDown(); } @Override public void onFailure(Throwable e) { e.printStackTrace(); failure.set(e); latch.countDown(); } }); } latch.await(); assertThat(failure.get(), nullValue()); client().admin().indices().prepareRefresh().execute().actionGet(); logger.info("done indexing, check all have the same field value"); Map masterSource = client().prepareGet("test", "type1", "1").execute().actionGet().getSourceAsMap(); for (int i = 0; i < (cluster().size() * 5); i++) { assertThat(client().prepareGet("test", "type1", "1").execute().actionGet().getSourceAsMap(), equalTo(masterSource)); } } }