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 <[email protected]> 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;
