From 06264f4e7b0f67e3070d11859f4fe689698d9353 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 26 Oct 2022 11:52:01 +0000 Subject: [PATCH] fix deadlock between memtable_mgr and lock_memtable --- src/storage/tablelock/ob_lock_memtable.cpp | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/storage/tablelock/ob_lock_memtable.cpp b/src/storage/tablelock/ob_lock_memtable.cpp index 0b9a5c31b1..9acd3674e5 100644 --- a/src/storage/tablelock/ob_lock_memtable.cpp +++ b/src/storage/tablelock/ob_lock_memtable.cpp @@ -795,27 +795,31 @@ int ObLockMemtable::flush(int64_t recycle_log_ts, bool need_freeze) { int ret = OB_SUCCESS; UNUSED(need_freeze); - WLockGuard guard(flush_lock_); - int64_t rec_log_ts = get_rec_log_ts(); - if (rec_log_ts >= recycle_log_ts) { - LOG_INFO("lock memtable no need to flush", K(rec_log_ts), K(recycle_log_ts), - K(is_frozen_), K(ls_id_)); - } else if (is_active_memtable()) { - if (OB_FAIL(freezer_->get_max_consequent_callbacked_log_ts(freeze_log_ts_))) { - LOG_WARN("get_max_consequent_callbacked_log_ts failed", K(ret), K(ls_id_)); - } else if (flushed_log_ts_ >= freeze_log_ts_) { - LOG_INFO("skip freeze because of flushed", K_(ls_id), K_(flushed_log_ts), K_(freeze_log_ts)); - } else { - ObLogTsRange log_ts_range; - log_ts_range.start_log_ts_ = 1; - log_ts_range.end_log_ts_ = freeze_log_ts_; - set_log_ts_range(log_ts_range); - set_snapshot_version(freeze_log_ts_); - ATOMIC_STORE(&is_frozen_, true); + { + WLockGuard guard(flush_lock_); + int64_t rec_log_ts = get_rec_log_ts(); + if (rec_log_ts >= recycle_log_ts) { + LOG_INFO("lock memtable no need to flush", K(rec_log_ts), K(recycle_log_ts), + K(is_frozen_), K(ls_id_)); + } else if (is_active_memtable()) { + if (OB_FAIL(freezer_->get_max_consequent_callbacked_log_ts(freeze_log_ts_))) { + LOG_WARN("get_max_consequent_callbacked_log_ts failed", K(ret), K(ls_id_)); + } else if (flushed_log_ts_ >= freeze_log_ts_) { + LOG_INFO("skip freeze because of flushed", K_(ls_id), K_(flushed_log_ts), K_(freeze_log_ts)); + } else { + ObLogTsRange log_ts_range; + log_ts_range.start_log_ts_ = 1; + log_ts_range.end_log_ts_ = freeze_log_ts_; + set_log_ts_range(log_ts_range); + set_snapshot_version(freeze_log_ts_); + ATOMIC_STORE(&is_frozen_, true); + } } } if (is_frozen_memtable()) { + // dependent to judging is_active_memtable() in dag + // otherwise maybe merge active memtable compaction::ObTabletMergeDagParam param; param.ls_id_ = ls_id_; param.tablet_id_ = LS_LOCK_TABLET; -- GitLab