This is an automated email from the ASF dual-hosted git repository.

brandonwilliams pushed a commit to branch cassandra-5.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-5.0 by this push:
     new 389479c9a2 Align buffer with commitlog segment size
389479c9a2 is described below

commit 389479c9a22baf8914d4ba63896ce464e7e9ef62
Author: Brandon Williams <brandonwilli...@apache.org>
AuthorDate: Wed Mar 20 11:21:05 2024 -0500

    Align buffer with commitlog segment size
    
    Patch by brandonwilliams and blambov; reviewed by bereng for
    CASSANDRA-19471
---
 CHANGES.txt                                         |  1 +
 .../cassandra/db/commitlog/DirectIOSegment.java     | 21 ++++++++++++---------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index c056c2785f..0954529c82 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.0-beta2
+ * Align buffer with commitlog segment size (CASSANDRA-19471)
  * Ensure SAI indexes empty byte buffers for types that allow them as a valid 
input (CASSANDRA-19461)
  * Deprecate Python 3.7 and earlier, but allow cqlsh to run with Python 
3.6-3.11 (CASSANDRA-19467)
  * Set uuid_sstable_identifiers_enabled to true in cassandra-latest.yaml 
(CASSANDRA-19460)
diff --git a/src/java/org/apache/cassandra/db/commitlog/DirectIOSegment.java 
b/src/java/org/apache/cassandra/db/commitlog/DirectIOSegment.java
index 2f350f71fb..b4819aa201 100644
--- a/src/java/org/apache/cassandra/db/commitlog/DirectIOSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/DirectIOSegment.java
@@ -184,11 +184,16 @@ public class DirectIOSegment extends CommitLogSegment
         @Override
         public SimpleCachedBufferPool createBufferPool()
         {
-            // The direct buffer must be aligned with the file system block 
size. We cannot enforce that during
-            // allocation, but we can get an aligned slice from the allocated 
buffer. The buffer must be oversized by the
-            // alignment unit to make it possible.
+            // Since the allocated buffer may be offset by up to fsBlockSize -
+            // 1 bytes, the buffer must be oversized by that amount. Alignment
+            // will make sure both the start and end of the buffer are aligned,
+            // cutting off any remaining bytes from both sides. Note that if we
+            // oversize by fsBlockSize bytes and the buffer happens to be
+            // already aligned, neither the start nor the end of the buffer
+            // will be adjusted and the resulting buffer will be bigger than
+            // expected.
             return new 
SimpleCachedBufferPool(DatabaseDescriptor.getCommitLogMaxCompressionBuffersInPool(),
-                                              
DatabaseDescriptor.getCommitLogSegmentSize() + fsBlockSize,
+                                              
DatabaseDescriptor.getCommitLogSegmentSize() + fsBlockSize - 1,
                                               BufferType.OFF_HEAP) {
                 @Override
                 public ByteBuffer createBuffer()
@@ -202,12 +207,10 @@ public class DirectIOSegment extends CommitLogSegment
                     ByteBufferUtil.writeZeroes(original.duplicate(), 
original.limit());
 
                     ByteBuffer alignedBuffer;
-                    if (original.alignmentOffset(0, fsBlockSize) > 0)
-                        alignedBuffer = original.alignedSlice(fsBlockSize);
-                    else
-                        alignedBuffer = original.slice().limit(segmentSize);
+                    alignedBuffer = original.alignedSlice(fsBlockSize);
 
-                    assert alignedBuffer.limit() >= segmentSize : 
String.format("Bytebuffer slicing failed to get required buffer size 
(required=%d, current size=%d", segmentSize, alignedBuffer.limit());
+                    assert alignedBuffer.limit() == segmentSize : 
String.format("Bytebuffer slicing failed to get required buffer size 
(required=%d, current size=%d", segmentSize, alignedBuffer.limit());
+                    assert alignedBuffer.limit() == alignedBuffer.capacity() : 
String.format("Bytebuffer limit and capacity do not match (limit=%d, 
capacity=%d", alignedBuffer.limit(), alignedBuffer.capacity());
 
                     assert alignedBuffer.alignmentOffset(0, fsBlockSize) == 0 
: String.format("Index 0 should be aligned to %d page size.", fsBlockSize);
                     assert 
alignedBuffer.alignmentOffset(alignedBuffer.limit(), fsBlockSize) == 0 : 
String.format("Limit should be aligned to %d page size", fsBlockSize);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to