Updated Branches:
  refs/heads/trunk ca216f771 -> 48f5d5716

fix commitlog segment overflow
patch by rbranson; reviewed by jbellis for CASSANDRA-3615


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/48f5d571
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/48f5d571
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/48f5d571

Branch: refs/heads/trunk
Commit: 48f5d571641e534bb633f1e4e71a308a0bcba1d1
Parents: ca216f7
Author: Jonathan Ellis <[email protected]>
Authored: Wed Dec 28 12:27:04 2011 -0600
Committer: Jonathan Ellis <[email protected]>
Committed: Wed Dec 28 12:27:04 2011 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    2 +-
 .../cassandra/db/commitlog/CommitLogSegment.java   |    9 ++++++---
 .../org/apache/cassandra/db/CommitLogTest.java     |   11 +++++++++++
 3 files changed, 18 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/48f5d571/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 6baaa20..5e370ed 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -8,7 +8,7 @@
  * removed in-tree redhat spec (CASSANDRA-3567)
  * "defragment" rows for name-based queries under STCS, again (CASSANDRA-2503)
  * Recycle commitlog segments for improved performance 
-   (CASSANDRA-3411, 3543, 3557)
+   (CASSANDRA-3411, 3543, 3557, 3615)
  * update size-tiered compaction to prioritize small tiers (CASSANDRA-2407)
  * add message expiration logic to OutboundTcpConnection (CASSANDRA-3005)
  * off-heap cache to use sun.misc.Unsafe instead of JNA (CASSANDRA-3271)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48f5d571/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java 
b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
index 9537e6b..d979a48 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
@@ -255,9 +255,12 @@ public class CommitLogSegment
         checksum.update(serializedRow);
         buffer.putLong(checksum.getValue());
 
-        // writes end of segment marker and rewinds back to position where it 
starts
-        buffer.putInt(CommitLog.END_OF_SEGMENT_MARKER);
-        buffer.position(buffer.position() - 
CommitLog.END_OF_SEGMENT_MARKER_SIZE);
+        if (buffer.remaining() >= 4)
+        {
+            // writes end of segment marker and rewinds back to position where 
it starts
+            buffer.putInt(CommitLog.END_OF_SEGMENT_MARKER);
+            buffer.position(buffer.position() - 
CommitLog.END_OF_SEGMENT_MARKER_SIZE);
+        }
 
         needsSync = true;
         return repPos;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48f5d571/test/unit/org/apache/cassandra/db/CommitLogTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java 
b/test/unit/org/apache/cassandra/db/CommitLogTest.java
index 27cabbe..83f780c 100644
--- a/test/unit/org/apache/cassandra/db/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java
@@ -159,6 +159,17 @@ public class CommitLogTest extends CleanupHelper
         assert CommitLog.instance.activeSegments() == 1 : "Expecting 1 
segment, got " + CommitLog.instance.activeSegments();
     }
 
+    // CASSANDRA-3615
+    @Test
+    public void testExceedSegmentSizeWithOverhead() throws Exception
+    {
+        CommitLog.instance.resetUnsafe();
+        
+        RowMutation rm = new RowMutation("Keyspace1", bytes("k"));
+        rm.add(new QueryPath("Standard1", null, bytes("c1")), 
ByteBuffer.allocate((128 * 1024 * 1024) - 83), 0);
+        CommitLog.instance.add(rm);
+    }
+
     protected void testRecoveryWithBadSizeArgument(int size, int dataSize) 
throws Exception
     {
         Checksum checksum = new CRC32();

Reply via email to