| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| using System; |
| using Lucene.Net.Support; |
| using NUnit.Framework; |
| |
| using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer; |
| using Document = Lucene.Net.Documents.Document; |
| using Directory = Lucene.Net.Store.Directory; |
| using MockRAMDirectory = Lucene.Net.Store.MockRAMDirectory; |
| using HeavyAtomicInt = Lucene.Net.Index.TestIndexWriterReader.HeavyAtomicInt; |
| using LuceneTestCase = Lucene.Net.Util.LuceneTestCase; |
| |
| namespace Lucene.Net.Index |
| { |
| |
| [TestFixture] |
| public class TestNRTReaderWithThreads:LuceneTestCase |
| { |
| internal System.Random random = new System.Random(); |
| internal HeavyAtomicInt seq = new HeavyAtomicInt(1); |
| |
| [Test] |
| public virtual void TestIndexing() |
| { |
| Directory mainDir = new MockRAMDirectory(); |
| IndexWriter writer = new IndexWriter(mainDir, new WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.LIMITED); |
| writer.UseCompoundFile = false; |
| IndexReader reader = writer.GetReader(); // start pooling readers |
| reader.Close(); |
| writer.MergeFactor = 2; |
| writer.SetMaxBufferedDocs(10); |
| RunThread[] indexThreads = new RunThread[4]; |
| for (int x = 0; x < indexThreads.Length; x++) |
| { |
| indexThreads[x] = new RunThread(this, x % 2, writer); |
| indexThreads[x].Name = "Thread " + x; |
| indexThreads[x].Start(); |
| } |
| long startTime = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond); |
| long duration = 5 * 1000; |
| while (((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - startTime) < duration) |
| { |
| System.Threading.Thread.Sleep(new System.TimeSpan((System.Int64) 10000 * 100)); |
| } |
| int delCount = 0; |
| int addCount = 0; |
| for (int x = 0; x < indexThreads.Length; x++) |
| { |
| indexThreads[x].run_Renamed_Field = false; |
| Assert.IsTrue(indexThreads[x].ex == null); |
| addCount += indexThreads[x].addCount; |
| delCount += indexThreads[x].delCount; |
| } |
| for (int x = 0; x < indexThreads.Length; x++) |
| { |
| indexThreads[x].Join(); |
| } |
| //System.out.println("addCount:"+addCount); |
| //System.out.println("delCount:"+delCount); |
| writer.Close(); |
| mainDir.Close(); |
| } |
| |
| public class RunThread:ThreadClass |
| { |
| private void InitBlock(TestNRTReaderWithThreads enclosingInstance) |
| { |
| this.enclosingInstance = enclosingInstance; |
| } |
| private TestNRTReaderWithThreads enclosingInstance; |
| public TestNRTReaderWithThreads Enclosing_Instance |
| { |
| get |
| { |
| return enclosingInstance; |
| } |
| |
| } |
| internal IndexWriter writer; |
| internal bool run_Renamed_Field = true; |
| internal System.Exception ex; |
| internal int delCount = 0; |
| internal int addCount = 0; |
| internal int type; |
| |
| public RunThread(TestNRTReaderWithThreads enclosingInstance, int type, IndexWriter writer) |
| { |
| InitBlock(enclosingInstance); |
| this.type = type; |
| this.writer = writer; |
| } |
| |
| override public void Run() |
| { |
| try |
| { |
| while (run_Renamed_Field) |
| { |
| //int n = random.nextInt(2); |
| if (type == 0) |
| { |
| int i = Enclosing_Instance.seq.AddAndGet(1); |
| Document doc = TestIndexWriterReader.CreateDocument(i, "index1", 10); |
| writer.AddDocument(doc); |
| addCount++; |
| } |
| else if (type == 1) |
| { |
| // we may or may not delete because the term may not exist, |
| // however we're opening and closing the reader rapidly |
| IndexReader reader = writer.GetReader(); |
| int id = Enclosing_Instance.random.Next(Enclosing_Instance.seq.IntValue()); |
| Term term = new Term("id", System.Convert.ToString(id)); |
| int count = TestIndexWriterReader.Count(term, reader); |
| writer.DeleteDocuments(term); |
| reader.Close(); |
| delCount += count; |
| } |
| } |
| } |
| catch (System.Exception ex) |
| { |
| System.Console.Out.WriteLine(ex.StackTrace); |
| this.ex = ex; |
| run_Renamed_Field = false; |
| } |
| } |
| } |
| } |
| } |