blob: 97a19c3482c212093db16884cb24ddbacfb34a73 [file] [log] [blame]
/*
* 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;
}
}
}
}
}