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

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 3072e17b39 [Bugfix](primary-key) fix calc delete bitmap bug in 
concurrent memtable flush (#12605)
3072e17b39 is described below

commit 3072e17b39ddb44a901701bb8eaf6e5961e8c1f6
Author: yixiutt <102007456+yixi...@users.noreply.github.com>
AuthorDate: Thu Sep 15 21:50:24 2022 +0800

    [Bugfix](primary-key) fix calc delete bitmap bug in concurrent memtable 
flush (#12605)
    
    Co-authored-by: yixiutt <yi...@selectdb.com>
---
 be/src/olap/delta_writer.cpp            | 7 +++++--
 be/src/olap/delta_writer.h              | 2 +-
 be/src/olap/memtable_flush_executor.cpp | 7 ++++---
 be/src/olap/memtable_flush_executor.h   | 2 +-
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/be/src/olap/delta_writer.cpp b/be/src/olap/delta_writer.cpp
index 7ea8a00966..d89d9e7023 100644
--- a/be/src/olap/delta_writer.cpp
+++ b/be/src/olap/delta_writer.cpp
@@ -141,8 +141,11 @@ Status DeltaWriter::init() {
     _reset_mem_table();
 
     // create flush handler
+    // unique key merge on write should flush serial cause calc delete bitmap 
should load segment serial
+    bool should_serial = (_tablet->keys_type() == KeysType::UNIQUE_KEYS &&
+                          _tablet->enable_unique_key_merge_on_write());
     
RETURN_NOT_OK(_storage_engine->memtable_flush_executor()->create_flush_token(
-            &_flush_token, _rowset_writer->type(), _req.is_high_priority));
+            &_flush_token, _rowset_writer->type(), should_serial, 
_req.is_high_priority));
 
     _is_init = true;
     return Status::OK();
@@ -281,7 +284,7 @@ Status DeltaWriter::wait_flush() {
 }
 
 void DeltaWriter::_reset_mem_table() {
-    if (_tablet->enable_unique_key_merge_on_write()) {
+    if (_tablet->enable_unique_key_merge_on_write() && _delete_bitmap == 
nullptr) {
         _delete_bitmap.reset(new DeleteBitmap(_tablet->tablet_id()));
     }
     _mem_table.reset(new MemTable(_tablet, _schema.get(), 
_tablet_schema.get(), _req.slots,
diff --git a/be/src/olap/delta_writer.h b/be/src/olap/delta_writer.h
index 476a77655b..181f9d5c1e 100644
--- a/be/src/olap/delta_writer.h
+++ b/be/src/olap/delta_writer.h
@@ -168,7 +168,7 @@ private:
     PSuccessSlaveTabletNodeIds _success_slave_node_ids;
     std::shared_mutex _slave_node_lock;
 
-    DeleteBitmapPtr _delete_bitmap;
+    DeleteBitmapPtr _delete_bitmap = nullptr;
     // current rowset_ids, used to do diff in publish_version
     RowsetIdUnorderedSet _rowset_ids;
 };
diff --git a/be/src/olap/memtable_flush_executor.cpp 
b/be/src/olap/memtable_flush_executor.cpp
index 2cf159a963..bf1b6819a5 100644
--- a/be/src/olap/memtable_flush_executor.cpp
+++ b/be/src/olap/memtable_flush_executor.cpp
@@ -133,9 +133,10 @@ void MemTableFlushExecutor::init(const 
std::vector<DataDir*>& data_dirs) {
 
 // NOTE: we use SERIAL mode here to ensure all mem-tables from one tablet are 
flushed in order.
 Status MemTableFlushExecutor::create_flush_token(std::unique_ptr<FlushToken>* 
flush_token,
-                                                 RowsetTypePB rowset_type, 
bool is_high_priority) {
+                                                 RowsetTypePB rowset_type, 
bool should_serial,
+                                                 bool is_high_priority) {
     if (!is_high_priority) {
-        if (rowset_type == BETA_ROWSET) {
+        if (rowset_type == BETA_ROWSET && !should_serial) {
             // beta rowset can be flush in CONCURRENT, because each memtable 
using a new segment writer.
             flush_token->reset(
                     new 
FlushToken(_flush_pool->new_token(ThreadPool::ExecutionMode::CONCURRENT)));
@@ -145,7 +146,7 @@ Status 
MemTableFlushExecutor::create_flush_token(std::unique_ptr<FlushToken>* fl
                     new 
FlushToken(_flush_pool->new_token(ThreadPool::ExecutionMode::SERIAL)));
         }
     } else {
-        if (rowset_type == BETA_ROWSET) {
+        if (rowset_type == BETA_ROWSET && !should_serial) {
             // beta rowset can be flush in CONCURRENT, because each memtable 
using a new segment writer.
             flush_token->reset(new FlushToken(
                     
_high_prio_flush_pool->new_token(ThreadPool::ExecutionMode::CONCURRENT)));
diff --git a/be/src/olap/memtable_flush_executor.h 
b/be/src/olap/memtable_flush_executor.h
index 71a1f3ae62..53e2cfaf98 100644
--- a/be/src/olap/memtable_flush_executor.h
+++ b/be/src/olap/memtable_flush_executor.h
@@ -107,7 +107,7 @@ public:
     void init(const std::vector<DataDir*>& data_dirs);
 
     Status create_flush_token(std::unique_ptr<FlushToken>* flush_token, 
RowsetTypePB rowset_type,
-                              bool is_high_priority);
+                              bool should_serial, bool is_high_priority);
 
 private:
     std::unique_ptr<ThreadPool> _flush_pool;


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

Reply via email to