Повреждение индекса Lucene?

Мы используем поиск в спящем режиме (5.6.5.Final) + lucene (5.5.5) и замечаем периодические проблемы на некоторых из наших серверов при запросе индекса.

Я не уверен на 100%, какую информацию мне нужно было бы предоставить, чтобы попытаться сузить проблему, но мы видим следы стека в журналах, например:

 java.lang.ArrayIndexOutOfBoundsException
 at org.apache.lucene.store.ByteArrayDataInput.readVInt(ByteArrayDataInput.java:105)
 at org.apache.lucene.codecs.blocktree.IntersectTermsEnumFrame.nextNonLeaf(IntersectTermsEnumFrame.java:254)
 at org.apache.lucene.codecs.blocktree.IntersectTermsEnumFrame.next(IntersectTermsEnumFrame.java:239)
 at org.apache.lucene.codecs.blocktree.IntersectTermsEnum.popPushNext(IntersectTermsEnum.java:345) 
 at org.apache.lucene.codecs.blocktree.IntersectTermsEnum._next(IntersectTermsEnum.java:713)
 at org.apache.lucene.codecs.blocktree.IntersectTermsEnum.next(IntersectTermsEnum.java:501)
 at org.apache.lucene.index.FilteredTermsEnum.next(FilteredTermsEnum.java:224)
 at org.apache.lucene.search.FuzzyTermsEnum.next(FuzzyTermsEnum.java:240)
 at org.apache.lucene.search.TermCollectingRewrite.collectTerms(TermCollectingRewrite.java:67)
 at org.apache.lucene.search.TopTermsRewrite.rewrite(TopTermsRewrite.java:67)
 at org.apache.lucene.search.MultiTermQuery.rewrite(MultiTermQuery.java:331)
 at org.apache.lucene.search.BooleanQuery.rewrite(BooleanQuery.java:278)
 at org.apache.lucene.search.BooleanQuery.rewrite(BooleanQuery.java:278)
 at org.hibernate.search.query.engine.impl.LazyQueryState.rewrittenQuery(LazyQueryState.java:192)
 at org.hibernate.search.query.engine.impl.LazyQueryState.search(LazyQueryState.java:103)
 at org.hibernate.search.query.engine.impl.QueryHits.updateTopDocs(QueryHits.java:241)
 at org.hibernate.search.query.engine.impl.QueryHits.<init>(QueryHits.java:136)
 at org.hibernate.search.query.engine.impl.LuceneHSQuery.getQueryHits(LuceneHSQuery.java:360)
 at org.hibernate.search.query.engine.impl.LuceneHSQuery.queryEntityInfos(LuceneHSQuery.java:145)
 at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.list(FullTextQueryImpl.java:197)
 at org.hibernate.search.jpa.impl.FullTextQueryImpl.getResultList(FullTextQueryImpl.java:157)

Трассировки стека не всегда одинаковы (вместо readVInt они могут быть в readVLong), но исключением всегда является ArrayIndexOutOfBoundsException.

Когда я запустил инструмент проверки индекса (org.apache.lucene.index.CheckIndex) с индексом, полученным с сервера, он не сообщил об ошибках:

Segments file=segments_2 numSegments=1 version=5.5.5 id=e963cq35m2ov726h5wwj8aw39 format=
  1 of 1: name=_1t maxDoc=300616
    version=5.5.5
    id=e963cq35m2ov726h5wwj8aw38
    codec=Lucene54
    compound=false
    numFiles=10
    size (MB)=45.838
    diagnostics = {os=Linux, java.vendor=Oracle Corporation, java.version=1.8.0_141, java.vm.version=25.141-b16, lucene.version=5.5.5, mergeMaxNumSegments=1, os.arch=amd64, java.runtime.version=1.8.0_141-b16, source=merge, mergeFactor=5, os.version=2.6.32-696.3.2.el6.x86_64, timestamp=1533021441077}
    no deletions
    test: open reader.........OK [took 1.027 sec]
    test: check integrity.....OK [took 0.040 sec]
    test: check live docs.....OK [took 0.000 sec]
    test: field infos.........OK [9 fields] [took 0.000 sec]
    test: field norms.........OK [7 fields] [took 0.041 sec]
    test: terms, freq, prox...OK [1231930 terms; 16245644 terms/docs pairs; 16300635 tokens] [took 1.719 sec]
    test: stored fields.......OK [601232 total field count; avg 2.0 fields per doc] [took 0.215 sec]
    test: term vectors........OK [0 total term vector count; avg 0.0 term/freq vector fields per doc] [took 0.000 sec]
    test: docvalues...........OK [0 docvalues fields; 0 BINARY; 0 NUMERIC; 0 SORTED; 0 SORTED_NUMERIC; 0 SORTED_SET] [took 0.000 sec]

No problems were detected with this index.

Мы перестраиваем индекс на главном узле, а затем копируем его на подчиненные. Я думаю, что это может быть проблема с коррупцией при копировании, но я думаю, что программа проверки сообщит о подобных проблемах. Есть идеи, что я могу сделать, чтобы сузить эту проблему?

Как вы копируете индекс? Вам действительно не следует пытаться изменить состояние индекса, не зная, что вы делаете. Вы используете подходящий filsystem-master / filesystem-slaveпровайдеры каталогов? Вы также используете один из встроенные бэкэнды или просто не выполняете никаких изменений базы данных на ведомых устройствах?

yrodiere 01.08.2018 08:52

Мы используем провайдер каталога FSSlaveDirectoryProvider и серверную часть JMS для внесения изменений.

Mike Hum 01.08.2018 21:59

Хорошо, на данный момент это либо проблема конфигурации, либо ошибка. Предоставьте список всех установленных вами свойств Hibernate Search и их значений как на главном, так и на подчиненных устройствах. Также подтвердите, что вы не изменяете индекс ни через собственные API Lucene, ни через доступ к файловой системе.

yrodiere 02.08.2018 08:24

Я не уверен, можно ли это квалифицировать как вмешательство, поскольку у нас обычно никогда не возникает проблем с ним, и он работает без проблем в течение довольно долгого времени, но мы регулярно перестраиваем индекс (в последнее время с каждой недели до каждой ночи ). Задание выполняется на главном узле: 1. Остановите фоновый процесс, в котором запущен приемник JMS. 2. Запустите массовый индексатор (указанный в отдельном каталоге) и скопируйте полученный индекс после его выполнения в локальный главный индекс. 3. Перезапустите прослушиватель JMS.

Mike Hum 02.08.2018 14:12

Хотя кажется, что мы переопределяем стратегию чтения по умолчанию (SharingBufferReaderProvider), поскольку в прошлом у нас были проблемы с этим процессом. Судя по прошлой заявке, мы получали «java.lang.IllegalStateException: тот же сегмент _a имеет недопустимые изменения; вероятно, вы повторно открываете программу чтения после незаконного удаления файлов индекса самостоятельно и создания нового индекса вместо них». Переопределенный считыватель просто улавливает ошибку и закрывает считыватель, а затем снова открывает их. Мы перестраивали индекс с этим «исправлением» в течение некоторого времени и на самом деле не обнаружили никаких проблем с ним.

Mike Hum 02.08.2018 14:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
439
0

Другие вопросы по теме