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;