public override void Run() { try { IndexReader lastReader = null; IndexSearcher lastSearcher = null; while (Operations.DecrementAndGet() >= 0) { // bias toward a recently changed doc int id = rand.Next(100) < 25 ? OuterInstance.LastId : rand.Next(Ndocs); // when indexing, we update the index, then the model // so when querying, we should first check the model, and then the index long val; DirectoryReader r; lock (OuterInstance) { val = OuterInstance.CommittedModel[id]; r = OuterInstance.Reader; r.IncRef(); } if (VERBOSE) { Console.WriteLine("TEST: " + Thread.CurrentThread.Name + ": s id=" + id + " val=" + val + " r=" + r.Version); } // sreq = req("wt","json", "q","id:"+Integer.toString(id), "omitHeader","true"); IndexSearcher searcher; if (r == lastReader) { // Just re-use lastSearcher, else // newSearcher may create too many thread // pools (ExecutorService): searcher = lastSearcher; } else { searcher = OuterInstance.NewSearcher(r); lastReader = r; lastSearcher = searcher; } Query q = new TermQuery(new Term("id", Convert.ToString(id))); TopDocs results = searcher.Search(q, 10); if (results.TotalHits == 0 && Tombstones) { // if we couldn't find the doc, look for its tombstone q = new TermQuery(new Term("id", "-" + Convert.ToString(id))); results = searcher.Search(q, 1); if (results.TotalHits == 0) { if (val == -1L) { // expected... no doc was added yet r.DecRef(); continue; } Assert.Fail("No documents or tombstones found for id " + id + ", expected at least " + val + " reader=" + r); } } if (results.TotalHits == 0 && !Tombstones) { // nothing to do - we can't tell anything from a deleted doc without tombstones } else { // we should have found the document, or its tombstone if (results.TotalHits != 1) { Console.WriteLine("FAIL: hits id:" + id + " val=" + val); foreach (ScoreDoc sd in results.ScoreDocs) { Document doc = r.Document(sd.Doc); Console.WriteLine(" docID=" + sd.Doc + " id:" + doc.Get("id") + " foundVal=" + doc.Get(OuterInstance.Field)); } Assert.Fail("id=" + id + " reader=" + r + " totalHits=" + results.TotalHits); } Document doc_ = searcher.Doc(results.ScoreDocs[0].Doc); long foundVal = Convert.ToInt64(doc_.Get(OuterInstance.Field)); if (foundVal < Math.Abs(val)) { Assert.Fail("foundVal=" + foundVal + " val=" + val + " id=" + id + " reader=" + r); } } r.DecRef(); } } catch (Exception e) { Operations.Set((int)-1L); Console.WriteLine(Thread.CurrentThread.Name + ": FAILED: unexpected exception"); Console.WriteLine(e.StackTrace); throw new Exception(e.Message, e); } }