Sitecore中的Lucene索引已损坏(ArgumentOutOfRangeException)

Sitecore中的Lucene索引已损坏(ArgumentOutOfRangeException),sitecore,lucene.net,sitecore6,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,

我们在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解决了这个问题。这让我相信内存中发生了某种损坏,但我不确定是什么原因导致了这种情况,也不确定如何找出原因。

尝试通过在web.config中添加以下设置来增加Sitecore的工作线程数

<setting name="MaxWorkerThreads" value="100"/> 


Sitecore支持为Sitecore 6.6提供了一个解决方案。Lucene.NET 2.9.4中使用的WeakHashTable类显然存在一些严重的线程安全问题。Lucene.NET的更高版本以及Sitecore 7中相应的升级解决了这个问题。

Lucene版本使用了什么?您使用的产品是否对其进行了修改?如果可以,从WeakHashtable Count属性发布代码(应该重写该方法)。如果该代码被修改并以某种方式返回-1,那么来自MS的Clone()方法将生成该异常。它是Lucene的2.9.4版,尚未更新。WeakHashtable.Count没有代码,因为该属性未被重写,并使用Hashtable中的基本实现。为什么这样做?我在发布时遇到过类似的问题,发布过去常常遇到异常,每次我都必须重置应用程序池,增加MaxWorkerThreads修复了我的问题。我们已经做到了这一点,Sitecore支持部门确实已经准备好了一个热修复程序可以部署:-)对于那些寻找修复程序的人来说,它就在这里-