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 2a1b6d16afa7eff8513109749907fd99ca3a1d21
Author: Shad Storhaug <[email protected]>
AuthorDate: Tue Sep 3 08:36:30 2019 +0700

    BUG: 
Lucene.Net.Benchmark.ByTask.Tasks.WriteLineDocTaskTest.TestMultiThreaded(): 
Added lock to synchronize file writes. Also refactored test to utilize the 
ThreadClass error handling and added extra asserts for help future debugging 
efforts.
---
 .../ByTask/Tasks/WriteLineDocTask.cs               | 18 ++++++++---
 .../ByTask/Tasks/WriteLineDocTaskTest.cs           | 36 ++++++++--------------
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/Lucene.Net.Benchmark/ByTask/Tasks/WriteLineDocTask.cs 
b/src/Lucene.Net.Benchmark/ByTask/Tasks/WriteLineDocTask.cs
index 8e3fccf..5b5885c 100644
--- a/src/Lucene.Net.Benchmark/ByTask/Tasks/WriteLineDocTask.cs
+++ b/src/Lucene.Net.Benchmark/ByTask/Tasks/WriteLineDocTask.cs
@@ -88,6 +88,8 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
         private readonly bool[] sufficientFields;
         private readonly bool checkSufficientFields;
 
+        private readonly object lineFileLock = new object(); // LUCENENET 
specific - lock to ensure writes don't collide for this instance
+
 
         public WriteLineDocTask(PerfRunData runData)
             : base(runData)
@@ -157,7 +159,10 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
             {
                 sb.Append(SEP).Append(f);
             }
-            @out.WriteLine(sb.ToString());
+            lock (lineFileLock) // LUCENENET specific - lock to ensure writes 
don't collide for this instance
+            {
+                @out.WriteLine(sb.ToString());
+            }
         }
 
         protected override string GetLogMessage(int recsCount)
@@ -194,9 +199,12 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
             }
             if (sufficient)
             {
-                sb.Length = sb.Length - 1; // remove redundant last separator
-                                           // lineFileOut is a PrintWriter, 
which synchronizes internally in println.
-                LineFileOut(doc).WriteLine(sb.ToString());
+                sb.Length--; // remove redundant last separator
+                // lineFileOut is a PrintWriter, which synchronizes internally 
in println.
+                lock (lineFileLock) // LUCENENET specific - lock to ensure 
writes don't collide for this instance
+                {
+                    LineFileOut(doc).WriteLine(sb.ToString());
+                }
             }
 
             return 1;
@@ -215,6 +223,8 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
         {
             if (disposing)
             {
+                threadBuffer.Dispose(); // LUCENENET specific: ThreadLocal is 
disposable
+                threadNormalizer.Dispose(); // LUCENENET specific: ThreadLocal 
is disposable
                 lineFileOut.Dispose();
             }
             base.Dispose(disposing);
diff --git 
a/src/Lucene.Net.Tests.Benchmark/ByTask/Tasks/WriteLineDocTaskTest.cs 
b/src/Lucene.Net.Tests.Benchmark/ByTask/Tasks/WriteLineDocTaskTest.cs
index d97dbbb..c6e626c 100644
--- a/src/Lucene.Net.Tests.Benchmark/ByTask/Tasks/WriteLineDocTaskTest.cs
+++ b/src/Lucene.Net.Tests.Benchmark/ByTask/Tasks/WriteLineDocTaskTest.cs
@@ -203,7 +203,7 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
 
         internal static void assertHeaderLine(String line)
         {
-            assertTrue("First line should be a header line", 
line.StartsWith(WriteLineDocTask.FIELDS_HEADER_INDICATOR, 
StringComparison.Ordinal));
+            assertTrue("First line should be a header line", line != null && 
line.StartsWith(WriteLineDocTask.FIELDS_HEADER_INDICATOR, 
StringComparison.Ordinal));
         }
 
         /* Tests WriteLineDocTask with a bzip2 format. */
@@ -370,10 +370,10 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
         private class ThreadAnonymousHelper : ThreadClass
         {
             private readonly WriteLineDocTask wldt;
-            internal Exception Exception { get; private set; }
             public ThreadAnonymousHelper(string name, WriteLineDocTask wldt)
                 : base(name)
             {
+                this.IsDebug = true;
                 this.wldt = wldt;
             }
 
@@ -385,8 +385,7 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
                 }
                 catch (Exception e)
                 {
-                    //throw new Exception(e.ToString(), e);
-                    this.Exception = e;
+                    throw new Exception(e.ToString(), e);
                 }
             }
         }
@@ -396,31 +395,21 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
         {
             FileInfo file = new FileInfo(Path.Combine(getWorkDir().FullName, 
"one-line"));
             PerfRunData runData = createPerfRunData(file, false, 
typeof(ThreadingDocMaker).AssemblyQualifiedName);
-            WriteLineDocTask wldt = new WriteLineDocTask(runData);
             ThreadClass[] threads = new ThreadClass[10];
-            for (int i = 0; i < threads.Length; i++)
-            {
-                threads[i] = new ThreadAnonymousHelper("t" + i, wldt);
-            }
-
-            foreach (ThreadClass t in threads) t.Start();
-            foreach (ThreadClass t in threads) t.Join();
-
-            wldt.Dispose();
-
-            // LUCENENET specific - need to transfer any exception that 
occurred back to this thread
-            foreach (ThreadClass t in threads)
+            using (WriteLineDocTask wldt = new WriteLineDocTask(runData))
             {
-                var thread = t as ThreadAnonymousHelper;
-
-                if (thread?.Exception != null)
+                for (int i = 0; i < threads.Length; i++)
                 {
-                    throw thread.Exception;
+                    threads[i] = new ThreadAnonymousHelper("t" + i, wldt);
                 }
-            }
+
+                foreach (ThreadClass t in threads) t.Start();
+                foreach (ThreadClass t in threads) t.Join();
+
+            } // wldt.Dispose();
 
             ISet<String> ids = new HashSet<string>();
-            TextReader br = new StreamReader(new FileStream(file.FullName, 
FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
+            TextReader br = new StreamReader(new FileStream(file.FullName, 
FileMode.Open, FileAccess.Read, FileShare.None), Encoding.UTF8);
             try
             {
                 String line = br.ReadLine();
@@ -428,6 +417,7 @@ namespace Lucene.Net.Benchmarks.ByTask.Tasks
                 for (int i = 0; i < threads.Length; i++)
                 {
                     line = br.ReadLine();
+                    assertNotNull($"line for index {i.ToString()} is missing", 
line); // LUCENENET specific - ensure the line is there before splitting
                     String[] parts = 
line.Split(WriteLineDocTask.SEP).TrimEnd();
                     assertEquals(line, 3, parts.Length);
                     // check that all thread names written are the same in the 
same line

Reply via email to