public virtual void Init(IndexReader reader) { this.reader = reader; timeElapsed = 0; t = new ThreadClass(new System.Threading.ThreadStart(this.Run)); t.Start(); }
protected internal virtual void Start(int numNodes, double runTimeSec, int maxSearcherAgeSeconds) { EndTime = DateTime.UtcNow.AddSeconds(runTimeSec); this.MaxSearcherAgeSeconds = maxSearcherAgeSeconds; Nodes = new NodeState[numNodes]; for (int nodeID = 0; nodeID < numNodes; nodeID++) { Nodes[nodeID] = new NodeState(this, Random(), nodeID, numNodes); } long[] nodeVersions = new long[Nodes.Length]; for (int nodeID = 0; nodeID < numNodes; nodeID++) { IndexSearcher s = Nodes[nodeID].Mgr.Acquire(); try { nodeVersions[nodeID] = Nodes[nodeID].Searchers.Record(s); } finally { Nodes[nodeID].Mgr.Release(s); } } for (int nodeID = 0; nodeID < numNodes; nodeID++) { IndexSearcher s = Nodes[nodeID].Mgr.Acquire(); Debug.Assert(nodeVersions[nodeID] == Nodes[nodeID].Searchers.Record(s)); Debug.Assert(s != null); try { BroadcastNodeReopen(nodeID, nodeVersions[nodeID], s); } finally { Nodes[nodeID].Mgr.Release(s); } } ChangeIndicesThread = new ChangeIndices(this); ChangeIndicesThread.Start(); }
public virtual void TestIntermediateClose() { Directory dir = NewDirectory(); // Test can deadlock if we use SMS: IndexWriter writer = new IndexWriter(dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())).SetMergeScheduler(new ConcurrentMergeScheduler())); writer.AddDocument(new Document()); writer.Commit(); CountdownEvent awaitEnterWarm = new CountdownEvent(1); CountdownEvent awaitClose = new CountdownEvent(1); AtomicBoolean triedReopen = new AtomicBoolean(false); //TaskScheduler es = Random().NextBoolean() ? null : Executors.newCachedThreadPool(new NamedThreadFactory("testIntermediateClose")); TaskScheduler es = Random().NextBoolean() ? null : TaskScheduler.Default; SearcherFactory factory = new SearcherFactoryAnonymousInnerClassHelper2(this, awaitEnterWarm, awaitClose, triedReopen, es); SearcherManager searcherManager = Random().NextBoolean() ? new SearcherManager(dir, factory) : new SearcherManager(writer, Random().NextBoolean(), factory); if (VERBOSE) { Console.WriteLine("sm created"); } IndexSearcher searcher = searcherManager.Acquire(); try { Assert.AreEqual(1, searcher.IndexReader.NumDocs); } finally { searcherManager.Release(searcher); } writer.AddDocument(new Document()); writer.Commit(); AtomicBoolean success = new AtomicBoolean(false); Exception[] exc = new Exception[1]; ThreadClass thread = new ThreadClass(() => new RunnableAnonymousInnerClassHelper(this, triedReopen, searcherManager, success, exc).Run()); thread.Start(); if (VERBOSE) { Console.WriteLine("THREAD started"); } awaitEnterWarm.Wait(); if (VERBOSE) { Console.WriteLine("NOW call close"); } searcherManager.Dispose(); awaitClose.Signal(); thread.Join(); try { searcherManager.Acquire(); Assert.Fail("already closed"); } catch (AlreadyClosedException ex) { // expected } Assert.IsFalse(success.Get()); Assert.IsTrue(triedReopen.Get()); Assert.IsNull(exc[0], "" + exc[0]); writer.Dispose(); dir.Dispose(); //if (es != null) //{ // es.shutdown(); // es.awaitTermination(1, TimeUnit.SECONDS); //} }