应用程序初始化期间发生错误:ClusterSearcher应该具有顶级调度

时间:2019-06-19 00:11:21

标签: vespa

包含多个内容的应用程序以及包含多个文档的每个内容都引发“ ClusterSearcher应该具有顶级调度”。当部署在具有多个内容节点的多节点群集上时。在具有单个内容节点的单个节点群集上也是如此。

使用[Vespa版本:] 7.51.13

com.yahoo.container.di.componentgraph.core.ComponentNode $ ComponentConstructorException:在acme中构造“ com.yahoo.prelude.cluster.ClusterSearcher”时出错。 由以下原因引起:java.lang.IllegalStateException:ClusterSearcher应该具有顶级调度。

================= services.xml =============

  <?xml version="1.0" encoding="utf-8" ?>

  

<admin version="2.0">
  <adminserver hostalias="admin0"/>
  <configservers>
    <configserver hostalias="admin0"/>
  </configservers>
</admin>

<container id="container" version="1.0">

  <config name="search.config.qr-start">
    <jvm>
      <heapSizeAsPercentageOfPhysicalMemory>50</heapSizeAsPercentageOfPhysicalMemory>
    </jvm>
  </config>

  <document-api />

  <http>
    <server id="stateless1" port="8080">
    </server>
  </http>

  <search>
    <chain id="default" inherits="vespa">
      <searcher id="com.acme.search.CatalogSearcher" bundle="sth-search">
        <config name="com.acme.search.Searcher">
          <redirectsFile>redirects.txt</redirectsFile>
          <autoCorrectAPI>https://apps02.acme.com:9815/search/</autoCorrectAPI>
          <connectionTimeout>250</connectionTimeout>
          <connectionRequestTimeout>250</connectionRequestTimeout>
          <socketTimeout>250</socketTimeout>
        </config>
      </searcher>
    </chain>
  </search>
  <nodes jvmargs="-verbose:gc">
    <node hostalias="stateless0"/>
    <node hostalias="stateless1"/>
  </nodes>
</container>

<content id="sth" version="1.0">
  <redundancy>2</redundancy>
  <documents>
    <document type="sth" mode="index" />
  </documents>
  <nodes>
    <node hostalias="content0" distribution-key="0"/>
    <node hostalias="content1" distribution-key="1"/>
  </nodes>
</content>

<content id="thesaurus" version="1.0">
  <redundancy>2</redundancy>
  <documents>
    <document type="thesaurus" mode="index"/>
  </documents>
  <nodes>
    <node hostalias="content0" distribution-key="0"/>
    <node hostalias="content1" distribution-key="1"/>
  </nodes>
</content>

<content id="acme" version="1.0">
  <redundancy>2</redundancy>
  <documents>
    <document type="vc_products" mode="index" />
    <document type="vc_thesaurus" mode="index"/>
  </documents>
  <nodes>
    <node hostalias="content0" distribution-key="0"/>
    <node hostalias="content1" distribution-key="1"/>
  </nodes>
</content>

1 个答案:

答案 0 :(得分:1)

从注释中得到的不是在实际部署在多个节点上时而是在尝试在单元测试中实例化模拟Application实例时得到的,例如Application.fromApplicationPackage(...)。

这样做的原因是,应用程序无法完全模拟完整的应用程序,只能模拟无状态的容器部件。在此设置中实例化的ClusterSearcher抱怨说它看不到下游的任何真实内容集群(这是正确的),它不知道它是在模拟设置中创建的。

由于这个原因,您需要为单元测试创​​建特殊的services.xmls,因为通常在生产环境中使用时会出现类似的问题。使用应用程序可以很好地测试一组组件的特定功能,但不能用于真正的生产应用程序的单元测试。

我们想通过在应用程序内部模拟组件集群来改善这一点,但目前尚无人在研究它。如果你想尝试一下代码 https://github.com/vespa-engine/vespa/tree/master/application