Индексы Lucene в Sitecore повреждены (ArgumentOutOfRangeException)

У нас возникла проблема с поиском индекса Lucene в Sitecore. Некоторое время все работает нормально, а затем, после того, что кажется случайным, мы начинаем получать следующую ошибку при каждом поиске по индексу:

System.ArgumentOutOfRangeException 
Message: Non-negative number required. 
Parameter name: capacity Source: mscorlib 
  at System.Collections.Hashtable..ctor(Int32 capacity, Single loadFactor)
  at System.Collections.Hashtable.Clone() 
  at SupportClass.WeakHashTable.Clean() 
  at SupportClass.WeakHashTable.CleanIfNeeded() 
  at SupportClass.WeakHashTable.Add(Object key, Object value) 
  at Lucene.Net.Util.CloseableThreadLocal.Set(Object object) 
  at Lucene.Net.Index.TermInfosReader.GetThreadResources() 
  at Lucene.Net.Index.TermInfosReader.Get(Term term, Boolean useCache) 
  at Lucene.Net.Index.SegmentReader.DocFreq(Term t) 
  at Lucene.Net.Index.DirectoryReader.DocFreq(Term t) 
  at Lucene.Net.Search.Similarity.IdfExplain(Term term, Searcher searcher)
  at Lucene.Net.Search.TermQuery.CreateWeight(Searcher searcher) 
  at Lucene.Net.Search.BooleanQuery.BooleanWeight..ctor(BooleanQuery enclosingInstance, Searcher searcher) 
  at Lucene.Net.Search.BooleanQuery.CreateWeight(Searcher searcher) 
  at Lucene.Net.Search.Query.Weight(Searcher searcher) 
  at Lucene.Net.Search.Hits..ctor(Searcher s, Query q, Filter f, Sort o) 
  at Lucene.Net.Search.Searcher.Search(Query query, Sort sort) 
  at scSearchContrib.Searcher.QueryRunner.RunQuery(Query query, Boolean showAllVersions, String sortField, Boolean reverse, Int32 start, Int32 end) 
  at scSearchContrib.Searcher.QueryRunner.GetItems(IEnumerable`1 parameters, Boolean showAllVersions, String sortField, Boolean reverse, Int32 start, Int32 end) at

Глядя на вызываемый код.Net и код Lucene.Net (через ILSpy), я не понимаю, как это могло бы произойти. Вызов.Clone() для хеш-таблицы не должен позволять передавать отрицательное число для емкости хеш-таблицы.

Это происходило несколько раз на нескольких серверах в нашей ферме, и перезапуск IIS решает проблему. Это заставляет меня верить, что происходит какое-то повреждение памяти, но я не уверен, что может вызвать это или как выяснить, что происходит.

2 ответа

Для поддержки Sitecore есть обходной путь для Sitecore 6.6. Очевидно, есть некоторые неприятные проблемы с безопасностью потоков с классом WeakHashTable, используемым в Lucene.NET 2.9.4. Эта проблема решена в более поздних версиях Lucene.NET и с помощью соответствующих обновлений в Sitecore 7.

Попробуйте увеличить количество рабочих потоков для Sitecore, добавив следующий параметр в web.config.

<setting name="MaxWorkerThreads" value="100"/> 
Другие вопросы по тегам