blob: 5dfadbfe0a7d0adee5be938d44ba61396a72b5e5 [file] [log] [blame]
using Lucene.Net.Diagnostics;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Assert = Lucene.Net.TestFramework.Assert;
using Console = Lucene.Net.Util.SystemConsole;
namespace Lucene.Net.Index
{
/*
* 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 Directory = Lucene.Net.Store.Directory;
using IndexSearcher = Lucene.Net.Search.IndexSearcher;
using MockDirectoryWrapper = Lucene.Net.Store.MockDirectoryWrapper;
// TODO
// - mix in forceMerge, addIndexes
// - randomoly mix in non-congruent docs
[SuppressCodecs("SimpleText", "Memory", "Direct")]
[TestFixture]
public class TestNRTThreads : ThreadedIndexingAndSearchingTestCase
{
private bool useNonNrtReaders = true;
[SetUp]
public override void SetUp()
{
base.SetUp();
useNonNrtReaders = Random.NextBoolean();
}
protected override void DoSearching(TaskScheduler es, long stopTime)
{
bool anyOpenDelFiles = false;
DirectoryReader r = DirectoryReader.Open(m_writer, true);
while (Environment.TickCount < stopTime && !m_failed)
{
if (Random.NextBoolean())
{
if (Verbose)
{
Console.WriteLine("TEST: now reopen r=" + r);
}
DirectoryReader r2 = DirectoryReader.OpenIfChanged(r);
if (r2 != null)
{
r.Dispose();
r = r2;
}
}
else
{
if (Verbose)
{
Console.WriteLine("TEST: now close reader=" + r);
}
r.Dispose();
m_writer.Commit();
ICollection<string> openDeletedFiles = ((MockDirectoryWrapper)m_dir).GetOpenDeletedFiles();
if (openDeletedFiles.Count > 0)
{
Console.WriteLine("OBD files: " + openDeletedFiles);
}
anyOpenDelFiles |= openDeletedFiles.Count > 0;
//Assert.AreEqual("open but deleted: " + openDeletedFiles, 0, openDeletedFiles.Size());
if (Verbose)
{
Console.WriteLine("TEST: now open");
}
r = DirectoryReader.Open(m_writer, true);
}
if (Verbose)
{
Console.WriteLine("TEST: got new reader=" + r);
}
//System.out.println("numDocs=" + r.NumDocs + "
//openDelFileCount=" + dir.openDeleteFileCount());
if (r.NumDocs > 0)
{
fixedSearcher = new IndexSearcher(r, es);
SmokeTestSearcher(fixedSearcher);
RunSearchThreads(Environment.TickCount + 500);
}
}
r.Dispose();
//System.out.println("numDocs=" + r.NumDocs + " openDelFileCount=" + dir.openDeleteFileCount());
ICollection<string> openDeletedFiles_ = ((MockDirectoryWrapper)m_dir).GetOpenDeletedFiles();
if (openDeletedFiles_.Count > 0)
{
Console.WriteLine("OBD files: " + openDeletedFiles_);
}
anyOpenDelFiles |= openDeletedFiles_.Count > 0;
Assert.IsFalse(anyOpenDelFiles, "saw non-zero open-but-deleted count");
}
protected override Directory GetDirectory(Directory @in)
{
if (Debugging.AssertsEnabled) Debugging.Assert(() => @in is MockDirectoryWrapper);
if (!useNonNrtReaders)
{
((MockDirectoryWrapper)@in).AssertNoDeleteOpenFile = true;
}
return @in;
}
protected override void DoAfterWriter(TaskScheduler es)
{
// Force writer to do reader pooling, always, so that
// all merged segments, even for merges before
// doSearching is called, are warmed:
m_writer.GetReader().Dispose();
}
private IndexSearcher fixedSearcher;
protected override IndexSearcher GetCurrentSearcher()
{
return fixedSearcher;
}
protected override void ReleaseSearcher(IndexSearcher s)
{
if (s != fixedSearcher)
{
// Final searcher:
s.IndexReader.Dispose();
}
}
protected override IndexSearcher GetFinalSearcher()
{
IndexReader r2;
if (useNonNrtReaders)
{
if (Random.NextBoolean())
{
r2 = m_writer.GetReader();
}
else
{
m_writer.Commit();
r2 = DirectoryReader.Open(m_dir);
}
}
else
{
r2 = m_writer.GetReader();
}
return NewSearcher(r2);
}
[Test]
[Slow] // (occasionally)
public virtual void TestNRTThreads_Mem()
{
RunTest("TestNRTThreads");
}
}
}