首页 > 解决方案 > 应用程序初始化期间出错:ClusterSearcher 应具有顶级调度

问题描述

具有多个内容且每个内容具有多个文档的应用程序正在抛出“ClusterSearcher 应该具有顶级调度”。当部署在具有多个内容节点的多节点集群上时。这同样适用于具有单个内容节点的单节点集群。

使用 [Vespa 版本:] 7.51.13

com.yahoo.container.di.componentgraph.core.ComponentNode$ComponentConstructorException:错误构造'com.yahoo.prelude.cluster.ClusterSearcher in acme' 原因: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>

标签: vespa

解决方案


从评论中,您不会在实际部署在多个节点上时得到这个,而是当您尝试在单元测试中实例化模拟应用程序实例时,如 Application.fromApplicationPackage(...)。

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

出于这个原因,您需要为单元测试创​​建特殊的 services.xmls,因为通常您在生产中使用的那个会产生这样的问题。使用 Application 适用于测试一组组件的特定功能,但不适用于单元测试您的真实生产应用程序。

我们想通过在应用程序中模拟组件集群来改进这一点,但目前没有人在处理它。如果你想尝试一下,代码在 https://github.com/vespa-engine/vespa/tree/master/application


推荐阅读