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 2020/02/12 17:14:27 UTC

[lucenenet] 01/05: 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)

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 <sh...@shadstorhaug.com>
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