From e2b8c0004b1985323845cf513bdae3afdfa80aaa Mon Sep 17 00:00:00 2001 From: HHoflittlefish777 <77738092+HHoflittlefish777@users.noreply.github.com> Date: Mon, 15 May 2023 23:18:33 +0800 Subject: [PATCH] [Fix](lazy_open) Fix dead lock in lazy open (#19652) --- be/src/runtime/tablets_channel.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/be/src/runtime/tablets_channel.cpp b/be/src/runtime/tablets_channel.cpp index bcbc956ba3..92f9990b87 100644 --- a/be/src/runtime/tablets_channel.cpp +++ b/be/src/runtime/tablets_channel.cpp @@ -344,7 +344,7 @@ Status TabletsChannel::_open_all_writers_for_partition(const int64_t& tablet_id, } } if (index_slots == nullptr) { - Status::InternalError("unknown index id, key={}", _key.to_string()); + return Status::InternalError("unknown index id, key={}", _key.to_string()); } int64_t partition_id = _tablet_partition_map[tablet_id]; DCHECK(partition_id != 0); @@ -401,7 +401,7 @@ Status TabletsChannel::open_all_writers_for_partition(const OpenPartitionRequest } } if (index_slots == nullptr) { - Status::InternalError("unknown index id, key={}", _key.to_string()); + return Status::InternalError("unknown index id, key={}", _key.to_string()); } for (auto& tablet : request.tablets()) { WriteRequest wrequest; @@ -508,6 +508,7 @@ Status TabletsChannel::add_batch(const PTabletWriterAddBlockRequest& request, std::function write_func) { google::protobuf::RepeatedPtrField* tablet_errors = response->mutable_tablet_errors(); + bool open_partition_flag = false; { std::lock_guard l(_tablet_writers_lock); auto tablet_writer_it = _tablet_writers.find(tablet_id); @@ -516,14 +517,16 @@ Status TabletsChannel::add_batch(const PTabletWriterAddBlockRequest& request, return Status::InternalError("unknown tablet to append data, tablet={}", tablet_id); } else { - RETURN_IF_ERROR(_open_all_writers_for_partition(tablet_id, request)); - tablet_writer_it = _tablet_writers.find(tablet_id); - if (tablet_writer_it == _tablet_writers.end()) { - return Status::InternalError("unknown tablet to append data, tablet={}", - tablet_id); - } + open_partition_flag = true; } } + } + if (open_partition_flag) { + RETURN_IF_ERROR(_open_all_writers_for_partition(tablet_id, request)); + } + { + std::lock_guard l(_tablet_writers_lock); + auto tablet_writer_it = _tablet_writers.find(tablet_id); Status st = write_func(tablet_writer_it->second); if (!st.ok()) { auto err_msg =