3

我们在 Sitecore 中搜索 Lucene 索引时遇到问题。在一段时间内一切正常,然后,在看似随机的时间之后,我们开始在每次针对索引的搜索中收到以下错误:

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 即可解决此问题。这让我相信发生了某种内存损坏,但我不确定是什么导致了这种情况或如何弄清楚发生了什么。

4

2 回答 2

3

Sitecore 支持针对 Sitecore 6.6 提供了一个解决方法。Lucene.NET 2.9.4 中使用的 WeakHashTable 类显然存在一些令人讨厌的线程安全问题。此问题已在更高版本的 Lucene.NET 中以及通过 Sitecore 7 中的相应升级得到解决。

于 2013-06-25T23:32:03.823 回答
1

Try increasing number of worker threads for Sitecore by adding following setting to web.config

<setting name="MaxWorkerThreads" value="100"/> 
于 2013-04-09T20:50:02.707 回答