ElasticSearch运行测试时随机失败
我有一个测试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%达到峰值)
澄清:当我说失败测试,余与怪异异常意味着误差以上(未失败的测试如所提到的由于值不正确)。每次插入/更新操作后,我都进行了手动刷新,因此值是正确的。
调查ElasticSearch日志文件(在DEBUG电平)和源代码之后,原来实际上发生的事情是,索引创建后,碎片进入RECOVERING
状态,有时我的测试试图在ElasticSearch上执行查询,而碎片尚未激活 - 因此例外。
修复很简单 - 创建索引后,就等到碎片是使用setWaitForActiveShards
功能和更加偏执我还是否使用[ESIntegTestCase]加setWaitForYellowStatus
您应将此标记为接受的答案 –
感谢您的提醒。在接受自己的答案之前,由于延迟2天而忘了它 – GantengX
建议用ESIntegTestCase来进行整合测试。
ESIntegTestCase
有一些辅助方法,如:ensureGreen
和refresh
......以确保Elasticsearch准备继续测试。您可以配置node settings
进行测试。
如果使用Elasticsearch
直接作为测试盒,它可能导致各种问题:
- 喜欢你
Exception
,这似乎是它的恢复索引derp_test
碎片。 - 即使你已经收录您的数据转换成指数,但是当你立刻查询会失败,因为集群需要冲洗或刷新 ...
那些大多数问题可以只使用Thread.sleep
等待一段时间来解决:),但这是一个不好的方法来做到这一点。
尝试在插入数据之后并在执行查询之前手动刷新索引,以确保数据可搜索。
或者:
哎呀我的坏,我应该更清楚,当我说“失败的测试”我的意思是错误,而不是给予无效的结果。每次插入/更新后,我也会刷新 – GantengX
活跃(https://www.elastic.co /guide/en/elasticsearch/reference/current/integration-tests.html)进行集成测试? – chengpohi
@chengpohi不,目前它只是把测试盒视为一个普通的es盒子。这是一个反模式还是什么? – GantengX