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

ayegorov pushed a commit to branch branch-4.11
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/branch-4.11 by this push:
     new 50e1654  ISSUE #2563: Fix SST file corruption.
50e1654 is described below

commit 50e16542fc773941f9d4127054dae949bb8c197a
Author: Surinder Singh <[email protected]>
AuthorDate: Fri Jan 29 12:03:29 2021 -0800

    ISSUE #2563: Fix SST file corruption.
    
    Fix SST File corruption during checkpointing
    
    ### Motivation
    
    Since the SST files are shared among checkpoints, this will not be resolved 
by future checkpoints. We will fail to restore all future checkpoints that 
depend on this file.
    
    ### Changes
    
    The record is sent asynchronously. We need to use a copy of the passed 
buffer
    in the record. The ownership is retained by the caller and will be 
potentially
    changed by the caller. In case of corruption the later blocks were
    overwriting the previous blocks resulting in corruption
    
    
    Master Issue: #2563
    
    
    
    Reviewers: Andrey Yegorov <None>, Enrico Olivelli <[email protected]>, 
Matteo Merli <[email protected]>
    
    This closes #2564 from sursingh/fix-sst-corruption, closes #2563
---
 .../statelib/impl/rocksdb/checkpoint/dlog/DLOutputStream.java           | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git 
a/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/rocksdb/checkpoint/dlog/DLOutputStream.java
 
b/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/rocksdb/checkpoint/dlog/DLOutputStream.java
index 834dd62..8b229df 100644
--- 
a/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/rocksdb/checkpoint/dlog/DLOutputStream.java
+++ 
b/stream/statelib/src/main/java/org/apache/bookkeeper/statelib/impl/rocksdb/checkpoint/dlog/DLOutputStream.java
@@ -95,7 +95,7 @@ class DLOutputStream extends OutputStream {
         }
 
         writePos += buf.readableBytes();
-        LogRecord record = new LogRecord(writePos, buf);
+        LogRecord record = new LogRecord(writePos, buf.copy());
         writer.write(record).whenComplete(new FutureEventListener<DLSN>() {
             @Override
             public void onSuccess(DLSN value) {

Reply via email to