Author: jbellis
Date: Tue May 17 14:53:26 2011
New Revision: 1104305

URL: http://svn.apache.org/viewvc?rev=1104305&view=rev
Log:
mark BRAF buffer invalid post-flush so we don't re-flush partial buffers again
patch by Peter Schuller; reviewed by jbellis for CASSANDRA-2660

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/BufferedRandomAccessFile.java

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1104305&r1=1104304&r2=1104305&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Tue May 17 14:53:26 2011
@@ -1,6 +1,8 @@
 0.7.7
  * adjust hinted handoff page size to avoid OOM with large columns 
    (CASSANDRA-2652)
+ * mark BRAF buffer invalid post-flush so we don't re-flush partial
+   buffers again, especially on CL writes (CASSANDRA-2660)
 
 
 0.7.6

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/BufferedRandomAccessFile.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/BufferedRandomAccessFile.java?rev=1104305&r1=1104304&r2=1104305&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/BufferedRandomAccessFile.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/BufferedRandomAccessFile.java
 Tue May 17 14:53:26 2011
@@ -128,6 +128,9 @@ public class BufferedRandomAccessFile ex
         fd = CLibrary.getfd(this.getFD());
     }
 
+    /**
+     * Flush (flush()) whatever writes are pending, and block until the data 
has been persistently committed (fsync()).
+     */
     public void sync() throws IOException
     {
         if (syncNeeded)
@@ -150,6 +153,11 @@ public class BufferedRandomAccessFile ex
         }
     }
 
+    /**
+     * If we are dirty, flush dirty contents to the operating system. Does not 
imply fsync().
+     *
+     * Currently, for implementation reasons, this also invalidates the buffer.
+     */
     public void flush() throws IOException
     {
         if (isDirty)
@@ -181,20 +189,25 @@ public class BufferedRandomAccessFile ex
 
             }
 
+            // Remember that we wrote, so we don't write it again on next 
flush().
+            resetBuffer();
+
             isDirty = false;
         }
     }
 
+    private void resetBuffer()
+    {
+        bufferOffset = current;
+        validBufferBytes = 0;
+    }
+
     private void reBuffer() throws IOException
     {
         flush(); // synchronizing buffer and file on disk
-
-        bufferOffset = current;
+        resetBuffer();
         if (bufferOffset >= channel.size())
-        {
-            validBufferBytes = 0;
             return;
-        }
 
         if (bufferOffset < minBufferOffset)
             minBufferOffset = bufferOffset;


Reply via email to