2017-05-04 166 views
1

我有一个测试ElasticSearch框(2.3.0),我的测试使用ES失败的随机顺序,真是令人沮丧(失败,所有碎片失败异常)。ElasticSearch运行测试时随机失败

望着elastic_search.log文件只给我看了这个

[2017-05-04 04:19:15,990][DEBUG][action.search.type  ] [es-testing-1] All shards failed for phase: [query] 
RemoteTransportException[[es-testing-1][127.0.0.1:9300][indices:data/read/search[phase/query]]]; nested: IllegalIndexShardStateException[CurrentState[RECOVERING] operations only allowed when shard state is one of [POST_RECOVERY, STARTED, RELOCATED]]; 
Caused by: [derp_test][[derp_test][3]] IllegalIndexShardStateException[CurrentState[RECOVERING] operations only allowed when shard state is one of [POST_RECOVERY, STARTED, RELOCATED]] 
    at org.elasticsearch.index.shard.IndexShard.readAllowed(IndexShard.java:993) 
    at org.elasticsearch.index.shard.IndexShard.acquireSearcher(IndexShard.java:814) 
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:641) 
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:618) 
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:369) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:368) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchQueryTransportHandler.messageReceived(SearchServiceTransportAction.java:365) 
    at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350) 
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 

任何想法是怎么回事?到目前为止,我的研究只告诉我这很可能是由于腐败的超时日志 - 但我不认为删除超时日志将会有所帮助,因为测试将丢掉每个命名空间的测试索引

ES测试盒具有3.5GB RAM,使用2.5GB堆大小,CPU使用率是在测试过程中相当正常(15%达到峰值)


澄清:当我说失败测试,​​余与怪异异常意味着误差以上(未失败的测试如所提到的由于值不正确)。每次插入/更新操作后,我都进行了手动刷新,因此值是正确的。

+0

活跃(https://www.elastic.co /guide/en/elasticsearch/reference/current/integration-tests.html)进行集成测试? – chengpohi

+0

@chengpohi不,目前它只是把测试盒视为一个普通的es盒子。这是一个反模式还是什么? – GantengX

回答

1

调查ElasticSearch日志文件(在DEBUG电平)和源代码之后,原来实际上发生的事情是,索引创建后,碎片进入RECOVERING状态,有时我的测试试图在ElasticSearch上执行查询,而碎片尚未激活 - 因此例外。

修复很简单 - 创建索引后,就等到碎片是使用setWaitForActiveShards功能和更加偏执我还是否使用[ESIntegTestCase]加setWaitForYellowStatus

+0

您应将此标记为接受的答案 –

+0

感谢您的提醒。在接受自己的答案之前,由于延迟2天而忘了它 – GantengX

0

建议用ESIntegTestCase来进行整合测试。

ESIntegTestCase有一些辅助方法,如:ensureGreenrefresh ......以确保Elasticsearch准备继续测试。您可以配置node settings进行测试。

如果使用Elasticsearch直接作为测试盒,它可能导致各种问题:

  1. 喜欢你Exception,这似乎是它的恢复索引 derp_test碎片。
  2. 即使你已经收录您的数据转换成指数,但是当你立刻查询会失败,因为集群需要冲洗刷新 ...

那些大多数问题可以只使用Thread.sleep等待一段时间来解决:),但这是一个不好的方法来做到这一点。

+1

嗯我不确定在这种情况下我是否可以轻松使用ESIntegTestCase,因为它是一个clojure项目,而ES只是方程的一部分。我会看看我是否可以用flush/refresh来解决这个问题 – GantengX

+0

是的,你应该尝试**同步**操作。 – chengpohi

0

尝试在插入数据之后并在执行查询之前手动刷新索引,以确保数据可搜索。

或者:

+0

哎呀我的坏,我应该更清楚,当我说“失败的测试”我的意思是错误,而不是给予无效的结果。每次插入/更新后,我也会刷新 – GantengX