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 d359f83eb11b1d793f516f7fb24820ee2773eae5
Author: Shad Storhaug <[email protected]>
AuthorDate: Tue Feb 11 17:07:11 2020 +0700

    BUG: Added missing call to FileStream::Flush() in FSIndexOutput::Flush() 
that was preventing persistence to disk from occuring at the necessary phase 
(fixes LUCENENET-645)
---
 src/Lucene.Net/Store/FSDirectory.cs | 33 ++++++++++++---------------------
 1 file changed, 12 insertions(+), 21 deletions(-)

diff --git a/src/Lucene.Net/Store/FSDirectory.cs 
b/src/Lucene.Net/Store/FSDirectory.cs
index ff99dac..a07021e 100644
--- a/src/Lucene.Net/Store/FSDirectory.cs
+++ b/src/Lucene.Net/Store/FSDirectory.cs
@@ -468,11 +468,6 @@ namespace Lucene.Net.Store
         protected class FSIndexOutput : BufferedIndexOutput
         {
             // LUCENENET specific: chunk size not needed
-            ///// <summary>
-            ///// The maximum chunk size is 8192 bytes, because <seealso 
cref="RandomAccessFile"/> mallocs
-            ///// a native buffer outside of stack if the write buffer size is 
larger.
-            ///// </summary>
-            //private const int CHUNK_SIZE = 8192;
 
             private readonly FSDirectory parent;
             internal readonly string name;
@@ -490,14 +485,7 @@ namespace Lucene.Net.Store
 
             protected internal override void FlushBuffer(byte[] b, int offset, 
int size)
             {
-                //Debug.Assert(isOpen);
-                //while (size > 0)
-                //{
-                //    int toWrite = Math.Min(CHUNK_SIZE, size);
-                //    file.Write(b, offset, toWrite);
-                //    offset += toWrite;
-                //    size -= toWrite;
-                //}
+                Debug.Assert(isOpen);
 
                 // LUCENENET specific: FileStream is already optimized to 
write natively
                 // if over the buffer size that is passed through its 
constructor. So,
@@ -507,6 +495,14 @@ namespace Lucene.Net.Store
                 //Debug.Assert(size == 0);
             }
 
+            public override void Flush()
+            {
+                base.Flush();
+                // LUCENENET specific - writing bytes into the FileStream (in 
FlushBuffer()) does not immediately
+                // persist them on disk. We need to explicitly call 
FileStream.Flush() to move them there.
+                file.Flush();
+            }
+
             protected override void Dispose(bool disposing)
             {
                 if (disposing)
@@ -518,9 +514,7 @@ namespace Lucene.Net.Store
                         IOException priorE = null;
                         try
                         {
-                            base.Dispose(disposing);
-                            // LUCENENET specific - file.Flush(flushToDisk: 
true) required in .NET for concurrency
-                            // Part of a solution suggested by Vincent Van Den 
Berghe: http://apache.markmail.org/message/hafnuhq2ydhfjmi2
+                            base.Dispose(disposing); // LUCENENET NOTE: This 
handles Flush() for us automatically, but we need to call Flush(true) to ensure 
everything persists
                             file.Flush(flushToDisk: true);
                         }
                         catch (IOException ioe)
@@ -545,10 +539,7 @@ namespace Lucene.Net.Store
                 file.Seek(pos, SeekOrigin.Begin);
             }
 
-            public override long Length
-            {
-                get { return file.Length; }
-            }
+            public override long Length => file.Length;
 
             // LUCENENET NOTE: FileStream doesn't have a way to set length
         }
@@ -558,7 +549,7 @@ namespace Lucene.Net.Store
         // which means we never need it at the point in Java where it is 
called.
         //protected virtual void Fsync(string name)
         //{
-        //    IOUtils.Fsync(Path.Combine(m_directory.FullName, name), false);  
          
+        //    IOUtils.Fsync(Path.Combine(m_directory.FullName, name), false);
         //}
     }
 }
\ No newline at end of file

Reply via email to