From 4853e9104134ca673ada4c2ab1ec01732bb7b47c Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 28 Dec 2022 10:12:03 +0000 Subject: [PATCH] adjust clog_checkpoint lock read_prefer --- deps/oblib/src/lib/stat/ob_latch_define.h | 2 ++ deps/oblib/src/lib/wait_event/ob_wait_event.h | 1 + src/storage/checkpoint/ob_checkpoint_executor.cpp | 2 +- src/storage/ls/ob_ls_tx_service.cpp | 14 +++++++------- src/storage/ls/ob_ls_tx_service.h | 9 ++++++--- src/storage/tablelock/ob_lock_memtable.cpp | 2 ++ src/storage/tablelock/ob_obj_lock.cpp | 4 ++-- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/deps/oblib/src/lib/stat/ob_latch_define.h b/deps/oblib/src/lib/stat/ob_latch_define.h index 3c2076009..4eba924a3 100644 --- a/deps/oblib/src/lib/stat/ob_latch_define.h +++ b/deps/oblib/src/lib/stat/ob_latch_define.h @@ -298,6 +298,8 @@ LATCH_DEF(MEMTABLE_STAT_LOCK, 287, "metmable stat lock", LATCH_FIFO, 2000, 0, ME LATCH_DEF(DEADLOCK_DETECT_LOCK, 288, "deadlock detect lock", LATCH_FIFO, 2000, 0, DEADLOCK_DETECT_LOCK_WAIT, "deadlock detect lock") LATCH_DEF(FREEZE_THREAD_POOL_LOCK, 289, "freeze thread pool lock", LATCH_FIFO, 2000, 0, FREEZE_THREAD_POOL_WAIT, "freeze thread pool lock") LATCH_DEF(DAS_ASYNC_RPC_LOCK, 290, "das wait remote response lock", LATCH_FIFO, 2000, 0, DAS_ASYNC_RPC_LOCK_WAIT, "das wait remote response lock") +LATCH_DEF(CLOG_CKPT_RWLOCK, 291, "clog checkpoint rwlock", LATCH_READ_PREFER, 2000, 0, CLOG_CKPT_RWLOCK_WAIT, "clog checkpoint rwlock") + // LATCH_DEF(TENANT_MGR_TENANT_BUCKET_LOCK, 290, "tenant mgr tenant bucket lock", LATCH_READ_PREFER, INT64_MAX, 0, TENANT_MGR_TENANT_BUCKET_LOCK_WAIT, "tenant mgr tenant bucket lock") LATCH_DEF(SRS_LOCK, 292, "srs lock", LATCH_READ_PREFER, 2000, 0, SRS_LOCK_WAIT, "srs lock") LATCH_DEF(LATCH_END, 99999, "latch end", LATCH_FIFO, 2000, 0, WAIT_EVENT_END, "latch end") diff --git a/deps/oblib/src/lib/wait_event/ob_wait_event.h b/deps/oblib/src/lib/wait_event/ob_wait_event.h index c45036a5e..37476e8ca 100644 --- a/deps/oblib/src/lib/wait_event/ob_wait_event.h +++ b/deps/oblib/src/lib/wait_event/ob_wait_event.h @@ -288,6 +288,7 @@ WAIT_EVENT_DEF(TENANT_MEM_USAGE_LOCK_WAIT, 15244, "latch: tenant memory usage lo WAIT_EVENT_DEF(TX_TABLE_LOCK_WAIT, 15245, "rwlock: tx table lock wait", "address", "number", "tries", CONCURRENCY, "rwlock: tx table lock wait", true) WAIT_EVENT_DEF(MEMTABLE_STAT_LOCK_WAIT, 15246, "spinlock: memtable stat lock wait", "address", "number", "tries", CONCURRENCY, "spinlock: memtable stat lock wait", true) WAIT_EVENT_DEF(DEADLOCK_DETECT_LOCK_WAIT, 15247, "spinlock: deadlock detect lock wait", "address", "number", "tries", CONCURRENCY, "spinlock: deadlock detect lock wait", true) +WAIT_EVENT_DEF(CLOG_CKPT_RWLOCK_WAIT, 15248, "rwlock: clog checkpoint rwlock wait", "address", "number", "tries", CONCURRENCY, "rwlock: clog checkpoint rwlock wait", true) //WAIT_EVENT_DEF(BACKUP_DATA_SERVICE_COND_WAIT, 15248, "backup data service condition wait", "address", "", "", CONCURRENCY, "backup data service condition wait", true) used by backup //WAIT_EVENT_DEF(BACKUP_CLEAN_SERVICE_COND_WAIT, 15249, "backup clean service condition wait", "address", "", "", CONCURRENCY, "backup clean service condition wait", true) //WAIT_EVENT_DEF(BACKUP_ARCHIVE_SERVICE_COND_WAIT, 15250, "backup archive service condition wait", "address", "", "", CONCURRENCY, "backup archive service condition wait", true) diff --git a/src/storage/checkpoint/ob_checkpoint_executor.cpp b/src/storage/checkpoint/ob_checkpoint_executor.cpp index 594482d99..7b49088ff 100644 --- a/src/storage/checkpoint/ob_checkpoint_executor.cpp +++ b/src/storage/checkpoint/ob_checkpoint_executor.cpp @@ -29,7 +29,7 @@ namespace checkpoint { ObCheckpointExecutor::ObCheckpointExecutor() - : rwlock_(common::ObLatchIds::CLOG_CKPT_LOCK), + : rwlock_(common::ObLatchIds::CLOG_CKPT_RWLOCK), update_checkpoint_enabled_(false) { reset(); diff --git a/src/storage/ls/ob_ls_tx_service.cpp b/src/storage/ls/ob_ls_tx_service.cpp index 62c4c20d1..6f7852d6f 100644 --- a/src/storage/ls/ob_ls_tx_service.cpp +++ b/src/storage/ls/ob_ls_tx_service.cpp @@ -421,7 +421,7 @@ SCN ObLSTxService::get_rec_scn() SCN min_rec_scn = SCN::max_scn(); int min_rec_scn_common_checkpoint_type_index = 0; char common_checkpoint_type[common::MAX_CHECKPOINT_TYPE_BUF_LENGTH]; - ObSpinLockGuard guard(lock_); + RLockGuard guard(rwlock_); for (int i = 1; i < ObCommonCheckpointType::MAX_BASE_TYPE; i++) { if (OB_NOT_NULL(common_checkpoints_[i])) { SCN rec_scn = common_checkpoints_[i]->get_rec_scn(); @@ -446,7 +446,7 @@ int ObLSTxService::flush(SCN &recycle_scn) { int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; - ObSpinLockGuard guard(lock_); + RLockGuard guard(rwlock_); for (int i = 1; i < ObCommonCheckpointType::MAX_BASE_TYPE; i++) { // only flush the common_checkpoint that whose clog need recycle if (OB_NOT_NULL(common_checkpoints_[i]) && recycle_scn >= common_checkpoints_[i]->get_rec_scn()) { @@ -480,7 +480,7 @@ int ObLSTxService::get_common_checkpoint_info( { int ret = OB_SUCCESS; common_checkpoint_array.reset(); - ObSpinLockGuard guard(lock_); + RLockGuard guard(rwlock_); for (int i = 1; i < ObCommonCheckpointType::MAX_BASE_TYPE; i++) { ObCommonCheckpoint *common_checkpoint = common_checkpoints_[i]; if (OB_ISNULL(common_checkpoint)) { @@ -507,7 +507,7 @@ int ObLSTxService::register_common_checkpoint(const ObCommonCheckpointType &type ret = OB_INVALID_ARGUMENT; STORAGE_LOG(WARN, "invalid arguments", K(ret), K(type), K(common_checkpoint)); } else { - ObSpinLockGuard guard(lock_); + WLockGuard guard(rwlock_); if (OB_NOT_NULL(common_checkpoints_[type])) { STORAGE_LOG(WARN, "repeat register common_checkpoint", K(ret), K(type), K(common_checkpoint)); } else { @@ -527,7 +527,7 @@ int ObLSTxService::unregister_common_checkpoint(const ObCommonCheckpointType &ty ret = OB_INVALID_ARGUMENT; STORAGE_LOG(WARN, "invalid arguments", K(ret), K(type), K(common_checkpoint)); } else { - ObSpinLockGuard guard(lock_); + WLockGuard guard(rwlock_); if (OB_ISNULL(common_checkpoints_[type])) { STORAGE_LOG(WARN, "common_checkpoint is null, no need unregister", K(type), K(common_checkpoint)); @@ -559,7 +559,7 @@ int ObLSTxService::traversal_flush() { int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; - ObSpinLockGuard guard(lock_); + RLockGuard guard(rwlock_); for (int i = 1; i < ObCommonCheckpointType::MAX_BASE_TYPE; i++) { if (OB_NOT_NULL(common_checkpoints_[i]) && OB_SUCCESS != (tmp_ret = common_checkpoints_[i]->flush(SCN::max_scn(), false))) { @@ -570,7 +570,7 @@ int ObLSTxService::traversal_flush() } void ObLSTxService::reset_() { - ObSpinLockGuard guard(lock_); + WLockGuard guard(rwlock_); for (int i = 0; i < ObCommonCheckpointType::MAX_BASE_TYPE; i++) { common_checkpoints_[i] = NULL; } diff --git a/src/storage/ls/ob_ls_tx_service.h b/src/storage/ls/ob_ls_tx_service.h index 8d89b22f1..459bec351 100644 --- a/src/storage/ls/ob_ls_tx_service.h +++ b/src/storage/ls/ob_ls_tx_service.h @@ -14,7 +14,7 @@ #define OCEANBASE_TRANSACTION_OB_LS_TX_SERVICE #include "lib/ob_errno.h" -#include "lib/lock/ob_spin_lock.h" +#include "lib/lock/ob_spin_rwlock.h" // SpinRWLock #include "share/ob_ls_id.h" #include "storage/checkpoint/ob_common_checkpoint.h" #include "storage/ob_i_store.h" @@ -62,7 +62,7 @@ public: ls_id_(), mgr_(NULL), trans_service_(NULL), - lock_(common::ObLatchIds::CLOG_CKPT_LOCK) { + rwlock_(common::ObLatchIds::CLOG_CKPT_RWLOCK) { reset_(); } ~ObLSTxService() {} @@ -177,7 +177,10 @@ private: // responsible for maintenance checkpoint unit that write TRANS_SERVICE_LOG_BASE_TYPE clog checkpoint::ObCommonCheckpoint *common_checkpoints_[checkpoint::ObCommonCheckpointType::MAX_BASE_TYPE]; - common::ObSpinLock lock_; + typedef common::SpinRWLock RWLock; + typedef common::SpinRLockGuard RLockGuard; + typedef common::SpinWLockGuard WLockGuard; + RWLock rwlock_; }; } diff --git a/src/storage/tablelock/ob_lock_memtable.cpp b/src/storage/tablelock/ob_lock_memtable.cpp index 6379a8396..85d97468f 100644 --- a/src/storage/tablelock/ob_lock_memtable.cpp +++ b/src/storage/tablelock/ob_lock_memtable.cpp @@ -826,6 +826,8 @@ int ObLockMemtable::flush(SCN recycle_scn, if (OB_EAGAIN != ret && OB_SIZE_OVERFLOW != ret) { LOG_WARN("failed to schedule lock_memtable merge dag", K(ret), K(this)); } + } else { + LOG_INFO("schedule lock_memtable merge_dag successfully", K(ls_id_), K(freeze_scn_)); } } } diff --git a/src/storage/tablelock/ob_obj_lock.cpp b/src/storage/tablelock/ob_obj_lock.cpp index 72b519125..325257ccb 100644 --- a/src/storage/tablelock/ob_obj_lock.cpp +++ b/src/storage/tablelock/ob_obj_lock.cpp @@ -648,8 +648,8 @@ int ObOBJLock::get_table_lock_store_info( ObTableLockOpList *op_list = map_[i]; if (op_list != NULL) { DLIST_FOREACH(curr, *op_list) { - if (curr->lock_op_.commit_scn_ <= freeze_scn - && curr->is_complete_outtrans_lock()) { + if (curr->lock_op_.commit_scn_ <= freeze_scn && + (curr->is_complete_outtrans_lock() || curr->is_complete_outtrans_unlock())) { ObTableLockOp store_info; if(OB_FAIL(curr->get_table_lock_store_info(store_info))) { LOG_WARN("get_table_lock_store_info failed", K(ret));