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;