Elasticsearch 2.2.0 ESIntegTestCase:ensureYellow()导致“超时等待黄色”

时间:2016-03-09 09:19:48

标签: java unit-testing elasticsearch

我正在重写我们的集成测试以使用Elasticsearch 2.2.0。 我有一个抽象的测试用例类,它扩展了org.elasticsearch.test.ESIntegTestCase

@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE, numDataNodes = 1)
@ThreadLeakScope(ThreadLeakScope.Scope.NONE)
public abstract class AbstractApplicationTest extends ESIntegTestCase {
   ...

    @Override
    protected Settings nodeSettings(int nodeOrdinal) {
        return Settings.settingsBuilder()
                .put(super.nodeSettings(nodeOrdinal))
                .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
                .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1)
                .put(Node.HTTP_ENABLED, true)
                .put("script.groovy.sandbox.enabled", true)
                .put("script.engine.groovy.inline.search", true)
                .put("script.engine.groovy.inline.update", "true")
                .put("script.inline", true)
                .put("script.update", true)
                .put("script.indexed", true)
                .put("script.default_lang", "groovy")
                .build();
    }

    @Override
    protected Collection<Class<? extends Plugin>> nodePlugins() {
        return pluginList(GroovyPlugin.class, DeleteByQueryPlugin.class, AnalysisICUPlugin.class);
    }

    @Before
    public void setUpElastic() throws Exception {
        // add the index and the mappings
        prepareCreate("bokun")
                .setSettings(Settings.builder().loadFromSource(loadFromClasspath("indices/settings.json")))
                .addMapping(AccommodationSearchIndex.INDEX_ACCOMMODATION_TYPE, loadFromClasspath("indices/accommodation.json"))
                .addMapping(AccommodationSearchIndex.INDEX_ROOM_TYPE, loadFromClasspath("indices/room.json"))
                ...
                .execute().actionGet();
        ensureYellow();
    }
    ...
}

我的测试用例类扩展了这个抽象类。它有6个测试,在上面的电话ensureYellow()期间,其中有3-4个测试失败并显示“超时等待黄色”消息。

如果我注释掉ensureYellow()调用,那么在执行索引请求时,我会从Elasticsearch获得“unavailable_shards_exception”:

{
    "took": 60001,
    "errors": true,
    "items": [{
        "index": {
            "_index": "bokun",
            "_type": "activity_availability",
            "_id": "20_20160309",
            "status": 503,
            "error": {
                "type": "unavailable_shards_exception",
                "reason": "[bokun][2] primary shard is not active Timeout: [1m], request: [shard bulk {[bokun][2]}]"
            }
        }
    }, {
        "index": {
            "_index": "bokun",
            "_type": "activity_availability",
            "_id": "20_20160310",
            "status": 503,
            "error": {
                "type": "unavailable_shards_exception",
                "reason": "[bokun][1] primary shard is not active Timeout: [1m], request: [shard bulk {[bokun][1]}]"
            }
        }
    }, 
    ...
    {
        "index": {
            "_index": "bokun",
            "_type": "activity_availability",
            "_id": "20_20160322",
            "status": 503,
            "error": {
                "type": "unavailable_shards_exception",
                "reason": "[bokun][0] primary shard is not active Timeout: [1m], request: [shard bulk {[bokun][0]}]"
            }
        }
    }, {
        "index": {
            "_index": "bokun",
            "_type": "activity",
            "_id": "12",
            "status": 503,
            "error": {
                "type": "unavailable_shards_exception",
                "reason": "[bokun][2] primary shard is not active Timeout: [1m], request: [shard bulk {[bokun][2]}]"
            }
        }
    }]
}

测试用例范围是ESIntegTestCase.Scope.SUITE,这意味着将为每个SUITE创建一个集群而不是测试,然后我在每次测试之前创建索引并添加映射。我假设在每次测试后删除索引,因为page表示:

  

默认情况下,测试使用每个测试套件的唯一群集运行。的   当然,每次测试都会删除所有索引和模板。

有谁知道我在这里做错了什么?

P.S。我正在使用SBT来运行我的测试。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。我启动了一个调试器并在EsIntegTestCase中找到了一个我没有输出的日志语句。所以我修改了我的日志配置,然后弹性搜索的实际错误开始出现。

问题是字段映射不一致:

ensureYellow timed out, cluster state:
version: 8
state uuid: twZ91SH7QIytVTrQuixDbg
from_diff: false
meta data version: 3
nodes: 
   {node_s0}{H_1t-4MwSKueM5vXRw_P4A}{local}{local[1]}{mode=local}, local, master
routing_table (version 6):
-- index [bokun]
----shard_id [bokun][0]
--------[bokun][0], node[null], [P], v[3], s[UNASSIGNED], unassigned_info[[reason=ALLOCATION_FAILED], at[2016-03-09T13:07:48.812Z], details[failed to update mappings, failure IllegalArgumentException[Mapper for [translations.excerpt] conflicts with existing mapping in other types:
[mapper [translations.excerpt] has different [store] values]]]]