Ошибка во время инициализации приложения: ClusterSearcher должен иметь диспетчер верхнего уровня - PullRequest
1 голос
/ 19 июня 2019

Приложение с несколькими контентом и каждым контентом с несколькими документами выдает «ClusterSearcher должен иметь диспетчеризацию верхнего уровня». при развертывании в многоузловом кластере с несколькими узлами контента. То же самое работает для кластера с одним узлом с одним узлом контента.

Использование [Vespa version:] 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>

1 Ответ

1 голос
/ 21 июня 2019

Из комментариев вы получаете это не при фактическом развертывании на нескольких узлах, а при попытке создать экземпляр ложного экземпляра приложения в модульном тесте, как в Application.fromApplicationPackage (...).

Причина этого заключается в том, что приложение не может полностью смоделировать полное приложение, только части контейнера без сохранения состояния.ClusterSearcher, который создается в этой настройке, жалуется, что не может видеть никаких реальных кластеров контента в нисходящем направлении (что правильно), он не знает, что он был создан в фиктивной установке.

По этой причине вам нужносоздать специальные services.xmls для модульных тестов, так как в общем случае тот, который вы используете в рабочей среде, создаст такие проблемы.Использование приложения хорошо работает для тестирования определенных функциональных возможностей набора компонентов, но не для модульного тестирования вашего реального производственного приложения.

Мы хотели бы улучшить это путем моделирования кластеров компонентов внутри приложения, но в настоящее время никто не работает над этим.если вы хотите попробовать это, код в https://github.com/vespa-engine/vespa/tree/master/application

...