Sitecore中的Lucene索引被破坏(ArgumentOutOfRangeException)

时间:2013-04-09 16:00:52

标签: sitecore lucene.net sitecore6

我们在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可以解决问题。这让我相信存在某种内存中的腐败现象,但我不确定是什么原因造成这种情况或如何弄清楚发生了什么。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

通过将以下设置添加到web.config

,尝试增加Sitecore的工作线程数
<setting name="MaxWorkerThreads" value="100"/>