使用Elasticsearch::Extensions在Ruby on Rails上进行测试(主线程中的异常:java.lang.IllegalArgumentException: 未知的 [gateway] 类型 [none])
在主线程中出现异常:”main” java.lang.IllegalArgumentException:未知的[网关]类型[none]。
在使用rspec进行应用程序的测试,使用Elasticsearch时,遇到了上述错误,被卡住了,所以作为备忘录。。。
ES默认情况下,在启动时网关应该是本地的,但为什么却不是呢…
进行调查1
当我尝试根据错误追踪源代码时,大致可以在以下链接找到:
https://github.com/elastic/elasticsearch/blob/master/core/src/main/java/org/elasticsearch/common/util/ExtensionPoint.java#L150
我摔倒了。
所以从这里开始尝试跟踪。。。
https://github.com/jprante/elasticsearch-server/blob/master/elasticsearch-server-node/src/main/java/org/elasticsearch/gateway/GatewayModule.java#L28
然后,完全不明白为什么网关会变成“无”。
调查2
而且,更进一步,令人困惑的是,
TEST_CLUSTER_NAME=my-testing-cluster \
TEST_CLUSTER_COMMAND=/usr/local/Cellar/elasticsearch/0.90.10/bin/elasticsearch \
TEST_CLUSTER_PORT=9350 \
TEST_CLUSTER_NODES=3 \
TEST_CLUSTER_NAME=my_testing_cluster \
ruby -r elasticsearch -e "require 'elasticsearch/extensions/test/cluster'; Elasticsearch::Extensions::Test::Cluster.start"
像这样从命令中执行的话,就能成功运行…这样的感觉。
进行第三次调查
瀏覽文件…
嘗試使用指令再現…
~ $ elasticsearch -D es.foreground=yes -D es.cluster.name=elasticsearch-test-apple-no-macbook-pro.local -D es.node.name=node-1 -D es.http.port=9250 -D es.path.data=/tmp/elasticsearch_test -D es.path.work=/tmp -D es.path.logs=/tmp/log/elasticsearch -D es.cluster.routing.allocation.disk.threshold_enabled=false -D es.network.host=localhost -D es.script.inline=true -D es.script.stored=true -D es.node.attr.testattr=test -D es.path.repo=/tmp -D es.repositories.url.allowed_urls=http://snapshot.test* -D es.logger.level=DEBUG -D es.gateway.type=none
:
:
Exception in thread "main" java.lang.IllegalArgumentException: Unknown [gateway] type [none]
at org.elasticsearch.common.util.ExtensionPoint$SelectedType.bindType(ExtensionPoint.java:146)
at org.elasticsearch.gateway.GatewayModule.configure(GatewayModule.java:53)
at <<<guice>>>
at org.elasticsearch.node.Node.<init>(Node.java:213)
at org.elasticsearch.node.Node.<init>(Node.java:140)
at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.java:143)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:178)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.
我又看到了。
D es.gateway.type=none的意思是”要是”。
如果设置为“D es.gateway=local”,就是错误的。
[2016-07-24 21:17:02,368][INFO ][node ] [node-1] started
[2016-07-24 21:17:02,371][DEBUG][cluster.service ] [node-1] processing [local-gateway-elected-state]: execute
[2016-07-24 21:17:02,372][DEBUG][cluster.service ] [node-1] cluster state updated, version [2], source [local-gateway-elected-state]
[2016-07-24 21:17:02,372][DEBUG][cluster.service ] [node-1] publishing cluster state version [2]
[2016-07-24 21:17:02,372][DEBUG][cluster.service ] [node-1] set local cluster state to version 2
[2016-07-24 21:17:02,389][INFO ][gateway ] [node-1] recovered [0] indices into cluster_state
[2016-07-24 21:17:02,389][DEBUG][cluster.service ] [node-1] processing [local-gateway-elected-state]: took 18ms done applying updated cluster_state (version: 2, uuid: -NnoHok5TRWNODw59ligMQ)
旁边,顺利启动成功。
顺带说一下,由于默认为local,则可以使用” -D es.gateway=none “。
最后的结果
Elasticsearch::Extensions::Test::Cluster.start port: 9250, network_host: 'localhost', es_params: '-D es.gateway=local' unless Elasticsearch::Extensions::Test::Cluster.running?(on: 9250)`
在启动TEST集群时添加配置,完成设置。
顺便提一下,我们还指定了network_host,但是这只是为了解决在CI测试时会感到不舒服的问题,因为默认情况下它是0.0.0.0(默认网关),所以我们只是固定了它。
迷茫…
在主线程中发生异常:”main” java.lang.IllegalArgumentException: 未知 [gateway] 类型 [none]。
关于这个问题,为什么会变成这样还是目前不清楚。也不是在elasticsearch.yml文件中进行了设置。。。首先不知道是不是个bug,总之先继续往前进行吧,暂时将其标记为FIXME。