You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2021/10/17 15:55:50 UTC
[lucenenet] 05/08: SWEEP: Lucene.Net.TestFramework: Changed all
lock statements to UninterruptableMonitor.Enter and
UninterruptableMonitor.Exit to prevent ThreadInterruptedException from
occurring when entering a lock.
This is an automated email from the ASF dual-hosted git repository.
nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit 152ffe658559f613afa3037467eea1165c261dee
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Thu Oct 14 20:42:02 2021 +0700
SWEEP: Lucene.Net.TestFramework: Changed all lock statements to UninterruptableMonitor.Enter and UninterruptableMonitor.Exit to prevent ThreadInterruptedException from occurring when entering a lock.
---
.../Analysis/BaseTokenStreamTestCase.cs | 1 +
.../Analysis/MockAnalyzer.cs | 8 +-
.../Codecs/RAMOnly/RAMOnlyPostingsFormat.cs | 17 +-
.../Index/BaseMergePolicyTestCase.cs | 8 +-
.../Index/BasePostingsFormatTestCase.cs | 7 +-
.../Search/RandomSimilarityProvider.cs | 15 +-
.../Search/SearchEquivalenceTestBase.cs | 7 +-
.../Store/MockDirectoryWrapper.cs | 211 ++++++++++++++++++---
.../Store/SlowClosingMockIndexInputWrapper.cs | 3 +-
.../Store/SlowOpeningMockIndexInputWrapper.cs | 3 +-
src/Lucene.Net.TestFramework/Util/LineFileDocs.cs | 36 +++-
.../Util/LuceneTestCase.cs | 28 ++-
src/Lucene.Net.TestFramework/Util/TestUtil.cs | 1 +
.../Util/ThrottledIndexOutput.cs | 1 +
14 files changed, 296 insertions(+), 50 deletions(-)
diff --git a/src/Lucene.Net.TestFramework/Analysis/BaseTokenStreamTestCase.cs b/src/Lucene.Net.TestFramework/Analysis/BaseTokenStreamTestCase.cs
index b26c20a..4e069df 100644
--- a/src/Lucene.Net.TestFramework/Analysis/BaseTokenStreamTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/BaseTokenStreamTestCase.cs
@@ -4,6 +4,7 @@ using Lucene.Net.Analysis.TokenAttributes;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Support;
+using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using RandomizedTesting.Generators;
using System;
diff --git a/src/Lucene.Net.TestFramework/Analysis/MockAnalyzer.cs b/src/Lucene.Net.TestFramework/Analysis/MockAnalyzer.cs
index a172ee0..cae547a 100644
--- a/src/Lucene.Net.TestFramework/Analysis/MockAnalyzer.cs
+++ b/src/Lucene.Net.TestFramework/Analysis/MockAnalyzer.cs
@@ -1,3 +1,4 @@
+using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using Lucene.Net.Util.Automaton;
using System;
@@ -105,7 +106,8 @@ namespace Lucene.Net.Analysis
private TokenFilter MaybePayload(TokenFilter stream, string fieldName)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
previousMappings.TryGetValue(fieldName, out int? val);
if (val == null)
@@ -155,6 +157,10 @@ namespace Lucene.Net.Analysis
return new MockFixedLengthPayloadFilter(random, stream, (int)val);
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public void SetPositionIncrementGap(int positionIncrementGap)
diff --git a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
index 990f566..c5dc4f5 100644
--- a/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
+++ b/src/Lucene.Net.TestFramework/Codecs/RAMOnly/RAMOnlyPostingsFormat.cs
@@ -1,8 +1,9 @@
-using J2N.Text;
+using J2N.Text;
using J2N.Threading.Atomic;
using Lucene.Net.Diagnostics;
using Lucene.Net.Index;
using Lucene.Net.Store;
+using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using System;
using System.Collections.Generic;
@@ -609,10 +610,15 @@ namespace Lucene.Net.Codecs.RAMOnly
RAMPostings postings = new RAMPostings();
RAMFieldsConsumer consumer = new RAMFieldsConsumer(postings);
- lock (state)
+ UninterruptableMonitor.Enter(state);
+ try
{
state[id] = postings;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(state);
+ }
return consumer;
}
@@ -641,10 +647,15 @@ namespace Lucene.Net.Codecs.RAMOnly
}
}
- lock (state)
+ UninterruptableMonitor.Enter(state);
+ try
{
return state[id];
}
+ finally
+ {
+ UninterruptableMonitor.Exit(state);
+ }
}
}
}
\ No newline at end of file
diff --git a/src/Lucene.Net.TestFramework/Index/BaseMergePolicyTestCase.cs b/src/Lucene.Net.TestFramework/Index/BaseMergePolicyTestCase.cs
index ed3663f..9491259 100644
--- a/src/Lucene.Net.TestFramework/Index/BaseMergePolicyTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/BaseMergePolicyTestCase.cs
@@ -4,6 +4,7 @@ using Lucene.Net.Diagnostics;
using Lucene.Net.Documents;
using Lucene.Net.Index.Extensions;
using Lucene.Net.Store;
+using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using RandomizedTesting.Generators;
using System;
@@ -91,7 +92,8 @@ namespace Lucene.Net.Index
public override void Merge(IndexWriter writer, MergeTrigger trigger, bool newMergesFound)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (!mayMerge.Value && writer.NextMerge() != null)
{
@@ -99,6 +101,10 @@ namespace Lucene.Net.Index
}
base.Merge(writer, trigger, newMergesFound);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
}
}
diff --git a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
index 7af790a..5927d6e 100644
--- a/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Index/BasePostingsFormatTestCase.cs
@@ -371,13 +371,18 @@ namespace Lucene.Net.Index
// //[Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitialize(Microsoft.VisualStudio.TestTools.UnitTesting.InheritanceBehavior.BeforeEachDerivedClass)]
// new public static void BeforeClass(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext context)
// {
-// lock (initalizationLock)
+// UninterruptableMonitor.Enter(initializationLock);
+// try
// {
// if (!initalizationLock.Contains(context.FullyQualifiedTestClassName))
// initalizationLock.Add(context.FullyQualifiedTestClassName);
// else
// return; // Only allow this class to initialize once (MSTest bug)
// }
+// finally
+// {
+// UninterruptableMonitor.Exit(initializationLock);
+// }
//#else
#if TESTFRAMEWORK_NUNIT
[NUnit.Framework.OneTimeSetUp]
diff --git a/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs b/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
index 1d19759..2cf40a2 100644
--- a/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
+++ b/src/Lucene.Net.TestFramework/Search/RandomSimilarityProvider.cs
@@ -1,6 +1,7 @@
using J2N.Collections.Generic.Extensions;
using Lucene.Net.Diagnostics;
using Lucene.Net.Search.Similarities;
+using Lucene.Net.Support.Threading;
using RandomizedTesting.Generators;
using System;
using System.Collections.Generic;
@@ -70,7 +71,8 @@ namespace Lucene.Net.Search
public override Similarity Get(string field)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (Debugging.AssertsEnabled) Debugging.Assert(field != null);
if (!previousMappings.TryGetValue(field, out Similarity sim) || sim == null)
@@ -80,6 +82,10 @@ namespace Lucene.Net.Search
}
return sim;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
// all the similarities that we rotate through
@@ -139,7 +145,8 @@ namespace Lucene.Net.Search
public override string ToString()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
// LUCENENET: Use StringBuilder for better efficiency
var sb = new StringBuilder();
@@ -157,6 +164,10 @@ namespace Lucene.Net.Search
sb.AppendFormat(J2N.Text.StringFormatter.InvariantCulture, "{0}", previousMappings);
return sb.ToString();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
}
}
\ No newline at end of file
diff --git a/src/Lucene.Net.TestFramework/Search/SearchEquivalenceTestBase.cs b/src/Lucene.Net.TestFramework/Search/SearchEquivalenceTestBase.cs
index f2fb843..c846fda 100644
--- a/src/Lucene.Net.TestFramework/Search/SearchEquivalenceTestBase.cs
+++ b/src/Lucene.Net.TestFramework/Search/SearchEquivalenceTestBase.cs
@@ -64,13 +64,18 @@ namespace Lucene.Net.Search
// //[Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitialize(Microsoft.VisualStudio.TestTools.UnitTesting.InheritanceBehavior.BeforeEachDerivedClass)]
// new public static void BeforeClass(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext context)
// {
-// lock (initalizationLock)
+// UninterruptableMonitor.Enter(initializationLock);
+// try
// {
// if (!initalizationLock.Contains(context.FullyQualifiedTestClassName))
// initalizationLock.Add(context.FullyQualifiedTestClassName);
// else
// return; // Only allow this class to initialize once (MSTest bug)
// }
+// finally
+// {
+// UninterruptableMonitor.Exit(initializationLock);
+// }
//#else
#if TESTFRAMEWORK_NUNIT
[NUnit.Framework.OneTimeSetUp]
diff --git a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
index dd4be0a..aef6c3b 100644
--- a/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
+++ b/src/Lucene.Net.TestFramework/Store/MockDirectoryWrapper.cs
@@ -4,6 +4,7 @@ using Lucene.Net.Diagnostics;
using Lucene.Net.Index;
using Lucene.Net.Index.Extensions;
using Lucene.Net.Support;
+using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using RandomizedTesting.Generators;
using System;
@@ -135,7 +136,8 @@ namespace Lucene.Net.Store
private void Init()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (openFiles == null)
{
@@ -152,6 +154,10 @@ namespace Lucene.Net.Store
unSyncedFiles = new JCG.HashSet<string>(StringComparer.Ordinal);
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public MockDirectoryWrapper(Random random, Directory @delegate)
@@ -234,7 +240,8 @@ namespace Lucene.Net.Store
[MethodImpl(MethodImplOptions.NoInlining)]
public override void Sync(ICollection<string> names)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
MaybeThrowDeterministicException();
@@ -258,11 +265,16 @@ namespace Lucene.Net.Store
unSyncedFiles.ExceptWith(names);
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public long GetSizeInBytes()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (m_input is RAMDirectory ramDirectory)
{
@@ -279,6 +291,10 @@ namespace Lucene.Net.Store
return size;
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
/// <summary>
@@ -287,7 +303,8 @@ namespace Lucene.Net.Store
/// </summary>
public virtual void Crash()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
crashed = true;
openFiles = new Dictionary<string, int>(StringComparer.Ordinal);
@@ -387,15 +404,24 @@ namespace Lucene.Net.Store
}
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public virtual void ClearCrash()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
crashed = false;
openLocks.Clear();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public virtual long MaxSizeInBytes
@@ -494,18 +520,24 @@ namespace Lucene.Net.Store
[MethodImpl(MethodImplOptions.NoInlining)]
public override void DeleteFile(string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
DeleteFile(name, false);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
// if there are any exceptions in OpenFileHandles
// capture those as inner exceptions
private Exception WithAdditionalErrorInformation(Exception t, string name, bool input)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
foreach (var ent in openFileHandles)
{
@@ -522,6 +554,10 @@ namespace Lucene.Net.Store
}
return t;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -541,7 +577,8 @@ namespace Lucene.Net.Store
[MethodImpl(MethodImplOptions.NoInlining)]
private void DeleteFile(string name, bool forced)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
@@ -578,14 +615,23 @@ namespace Lucene.Net.Store
}
m_input.DeleteFile(name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public virtual ICollection<string> GetOpenDeletedFiles()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
return new JCG.HashSet<string>(openFilesDeleted, StringComparer.Ordinal);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
private bool failOnCreateOutput = true;
@@ -598,7 +644,8 @@ namespace Lucene.Net.Store
public override IndexOutput CreateOutput(string name, IOContext context)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeThrowDeterministicException();
MaybeThrowIOExceptionOnOpen(name);
@@ -612,13 +659,18 @@ namespace Lucene.Net.Store
throw new IOException("cannot createOutput after crash");
}
Init();
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (preventDoubleWrite && createdFiles.Contains(name) && !name.Equals("segments.gen", StringComparison.Ordinal))
{
throw new IOException("file \"" + name + "\" was already written to");
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
if ((noDeleteOpenFile || assertNoDeleteOpenFile) && openFiles.ContainsKey(name))
{
if (!assertNoDeleteOpenFile)
@@ -683,6 +735,10 @@ namespace Lucene.Net.Store
return io;
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
internal enum Handle
@@ -696,7 +752,8 @@ namespace Lucene.Net.Store
{
//Trace.TraceInformation("Add {0} {1}", c, name);
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (openFiles.TryGetValue(name, out int v))
{
@@ -712,6 +769,10 @@ namespace Lucene.Net.Store
openFileHandles[c] = RuntimeException.Create("unclosed Index" + handle.ToString() + ": " + name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
private bool failOnOpenInput = true;
@@ -724,7 +785,8 @@ namespace Lucene.Net.Store
public override IndexInput OpenInput(string name, IOContext context)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeThrowDeterministicException();
MaybeThrowIOExceptionOnOpen(name);
@@ -772,13 +834,18 @@ namespace Lucene.Net.Store
AddFileHandle(ii, name, Handle.Input);
return ii;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
/// <summary>
/// Provided for testing purposes. Use <see cref="GetSizeInBytes()"/> instead. </summary>
public long GetRecomputedSizeInBytes()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (!(m_input is RAMDirectory))
{
@@ -791,6 +858,10 @@ namespace Lucene.Net.Store
}
return size;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
/// <summary>
@@ -802,7 +873,8 @@ namespace Lucene.Net.Store
public long GetRecomputedActualSizeInBytes()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (!(m_input is RAMDirectory))
{
@@ -815,6 +887,10 @@ namespace Lucene.Net.Store
}
return size;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
// NOTE: this is off by default; see LUCENE-5574
@@ -843,7 +919,8 @@ namespace Lucene.Net.Store
protected override void Dispose(bool disposing)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (disposing)
{
@@ -1024,13 +1101,18 @@ namespace Lucene.Net.Store
throttledOutput.Dispose(); // LUCENENET specific
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
internal virtual void RemoveOpenFile(IDisposable c, string name)
{
//Trace.TraceInformation("Rem {0} {1}", c, name);
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (openFiles.TryGetValue(name, out int v))
{
@@ -1049,23 +1131,37 @@ namespace Lucene.Net.Store
openFileHandles.TryRemove(c, out Exception _);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public virtual void RemoveIndexOutput(IndexOutput @out, string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
openFilesForWrite.Remove(name);
RemoveOpenFile(@out, name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public virtual void RemoveIndexInput(IndexInput @in, string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
RemoveOpenFile(@in, name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
// LUCENENET specific - de-nested Failure
@@ -1078,7 +1174,8 @@ namespace Lucene.Net.Store
/// </summary>
public virtual void FailOn(Failure fail)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (failures == null)
{
@@ -1086,6 +1183,10 @@ namespace Lucene.Net.Store
}
failures.Add(fail);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
/// <summary>
@@ -1094,7 +1195,8 @@ namespace Lucene.Net.Store
/// </summary>
internal virtual void MaybeThrowDeterministicException()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
if (failures != null)
{
@@ -1104,57 +1206,87 @@ namespace Lucene.Net.Store
}
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override string[] ListAll()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
return m_input.ListAll();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
[Obsolete("this method will be removed in 5.0")]
public override bool FileExists(string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
return m_input.FileExists(name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override long FileLength(string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
return m_input.FileLength(name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override Lock MakeLock(string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
return LockFactory.MakeLock(name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override void ClearLock(string name)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
LockFactory.ClearLock(name);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override void SetLockFactory(LockFactory lockFactory)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
// sneaky: we must pass the original this way to the dir, because
@@ -1163,13 +1295,18 @@ namespace Lucene.Net.Store
// now set our wrapped factory here
this.m_lockFactory = new MockLockFactoryWrapper(this, lockFactory);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override LockFactory LockFactory
{
get
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
if (wrapLockFactory)
@@ -1181,26 +1318,40 @@ namespace Lucene.Net.Store
return m_input.LockFactory;
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
}
public override string GetLockID()
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
return m_input.GetLockID();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override void Copy(Directory to, string src, string dest, IOContext context)
{
- lock (this)
+ UninterruptableMonitor.Enter(this);
+ try
{
MaybeYield();
// randomize the IOContext here?
m_input.Copy(to, src, dest, context);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(this);
+ }
}
public override IndexInputSlicer CreateSlicer(string name, IOContext context)
diff --git a/src/Lucene.Net.TestFramework/Store/SlowClosingMockIndexInputWrapper.cs b/src/Lucene.Net.TestFramework/Store/SlowClosingMockIndexInputWrapper.cs
index c65685d..5af0dbe 100644
--- a/src/Lucene.Net.TestFramework/Store/SlowClosingMockIndexInputWrapper.cs
+++ b/src/Lucene.Net.TestFramework/Store/SlowClosingMockIndexInputWrapper.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support.Threading;
+using System;
using System.Threading;
namespace Lucene.Net.Store
diff --git a/src/Lucene.Net.TestFramework/Store/SlowOpeningMockIndexInputWrapper.cs b/src/Lucene.Net.TestFramework/Store/SlowOpeningMockIndexInputWrapper.cs
index 684e118..113c76c 100644
--- a/src/Lucene.Net.TestFramework/Store/SlowOpeningMockIndexInputWrapper.cs
+++ b/src/Lucene.Net.TestFramework/Store/SlowOpeningMockIndexInputWrapper.cs
@@ -1,4 +1,5 @@
-using System;
+using Lucene.Net.Support.Threading;
+using System;
using System.Threading;
namespace Lucene.Net.Store
diff --git a/src/Lucene.Net.TestFramework/Util/LineFileDocs.cs b/src/Lucene.Net.TestFramework/Util/LineFileDocs.cs
index f81fe3e..79057d3 100644
--- a/src/Lucene.Net.TestFramework/Util/LineFileDocs.cs
+++ b/src/Lucene.Net.TestFramework/Util/LineFileDocs.cs
@@ -2,6 +2,7 @@
using J2N.Threading.Atomic;
using Lucene.Net.Documents;
using Lucene.Net.Support.IO;
+using Lucene.Net.Support.Threading;
using RandomizedTesting.Generators;
using System;
using System.Globalization;
@@ -70,7 +71,8 @@ namespace Lucene.Net.Util
private void Close()
{
- lock (syncLock)
+ UninterruptableMonitor.Enter(syncLock);
+ try
{
if (reader != null)
{
@@ -83,6 +85,10 @@ namespace Lucene.Net.Util
tempFilePath = null;
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(syncLock);
+ }
}
private static Task DeleteAsync(string path)
@@ -111,11 +117,16 @@ namespace Lucene.Net.Util
{
if (disposing)
{
- lock (syncLock)
+ UninterruptableMonitor.Enter(syncLock);
+ try
{
Close();
threadDocs?.Dispose();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(syncLock);
+ }
}
}
@@ -145,7 +156,8 @@ namespace Lucene.Net.Util
private void Open(Random random)
{
- lock (syncLock)
+ UninterruptableMonitor.Enter(syncLock);
+ try
{
Stream @is = null;
bool needSkip = true, isExternal = false;
@@ -232,16 +244,25 @@ namespace Lucene.Net.Util
reader.ReadLine();
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(syncLock);
+ }
}
public virtual void Reset(Random random)
{
- lock (syncLock)
+ UninterruptableMonitor.Enter(syncLock);
+ try
{
Close();
Open(random);
id.Value = 0;
}
+ finally
+ {
+ UninterruptableMonitor.Exit(syncLock);
+ }
}
private const char SEP = '\t';
@@ -301,7 +322,8 @@ namespace Lucene.Net.Util
public virtual Document NextDoc()
{
string line;
- lock (syncLock)
+ UninterruptableMonitor.Enter(syncLock);
+ try
{
line = reader.ReadLine();
if (line == null)
@@ -316,6 +338,10 @@ namespace Lucene.Net.Util
line = reader.ReadLine();
}
}
+ finally
+ {
+ UninterruptableMonitor.Exit(syncLock);
+ }
DocState docState = threadDocs.Value;
if (docState == null)
diff --git a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
index fb9a072..f803a3a 100644
--- a/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
+++ b/src/Lucene.Net.TestFramework/Util/LuceneTestCase.cs
@@ -183,7 +183,8 @@ namespace Lucene.Net.Util
public LuceneTestCase()
{
- lock (initalizationLock)
+ UninterruptableMonitor.Enter(initializationLock);
+ try
{
var thisType = this.GetType();
if (!initalizationLock.Contains(thisType.FullName))
@@ -201,6 +202,10 @@ namespace Lucene.Net.Util
BeforeClass();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(initializationLock);
+ }
}
#else
{
@@ -1050,7 +1055,8 @@ namespace Lucene.Net.Util
if (context == null)
throw new ArgumentNullException(nameof(context));
- lock (initalizationLock)
+ UninterruptableMonitor.Enter(initializationLock);
+ try
{
if (!initalizationLock.Contains(context.FullyQualifiedTestClassName))
initalizationLock.Add(context.FullyQualifiedTestClassName);
@@ -1067,6 +1073,10 @@ namespace Lucene.Net.Util
_testClassType = Type.GetType(_testClassName);
#endif
}
+ finally
+ {
+ UninterruptableMonitor.Exit(initializationLock);
+ }
try
{
@@ -3495,10 +3505,15 @@ namespace Lucene.Net.Util
Console.Error.WriteLine("INFO: Will leave temporary file: " + f.FullName);
return;
}
- lock (cleanupQueueLock)
+ UninterruptableMonitor.Enter(cleanupQueueLock);
+ try
{
cleanupQueue.Push(f);
}
+ finally
+ {
+ UninterruptableMonitor.Exit(cleanupQueueLock);
+ }
}
[MethodImpl(MethodImplOptions.NoInlining)]
@@ -3513,7 +3528,8 @@ namespace Lucene.Net.Util
FileSystemInfo[] everything;
string tempDirBasePath;
- lock (cleanupQueueLock)
+ UninterruptableMonitor.Enter(cleanupQueueLock);
+ try
{
tempDirBasePath = tempDirBase?.FullName;
tempDirBase = null;
@@ -3522,6 +3538,10 @@ namespace Lucene.Net.Util
everything = cleanupQueue.ToArray();
cleanupQueue.Clear();
}
+ finally
+ {
+ UninterruptableMonitor.Exit(cleanupQueueLock);
+ }
// LUCENENET specific - If the everything array is empty, there is no reason
// to continue.
diff --git a/src/Lucene.Net.TestFramework/Util/TestUtil.cs b/src/Lucene.Net.TestFramework/Util/TestUtil.cs
index 2d880b9..9a774b6 100644
--- a/src/Lucene.Net.TestFramework/Util/TestUtil.cs
+++ b/src/Lucene.Net.TestFramework/Util/TestUtil.cs
@@ -864,6 +864,7 @@ namespace Lucene.Net.Util
// {
// try
// {
+ // UninterruptableMonitor.RestoreInterrupt();
// ex.shutdown();
// ex.awaitTermination(1, TimeUnit.SECONDS);
// }
diff --git a/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs b/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
index 4892032..cf205f3 100644
--- a/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
+++ b/src/Lucene.Net.TestFramework/Util/ThrottledIndexOutput.cs
@@ -1,6 +1,7 @@
using Lucene.Net.Diagnostics;
using Lucene.Net.Store;
using Lucene.Net.Support;
+using Lucene.Net.Support.Threading;
using System;
using System.Threading;