diff --git a/src/storage/tx_storage/ob_tablet_gc_service.cpp b/src/storage/tx_storage/ob_tablet_gc_service.cpp index 1b838989b2..32b902b374 100644 --- a/src/storage/tx_storage/ob_tablet_gc_service.cpp +++ b/src/storage/tx_storage/ob_tablet_gc_service.cpp @@ -306,13 +306,15 @@ uint8_t ObTabletGCHandler::get_tablet_persist_trigger_and_reset() int ObTabletGCHandler::disable_gc() { int ret = OB_SUCCESS; - if (OB_FAIL(gc_lock_.lock(GC_LOCK_TIMEOUT))) { + if (OB_FAIL(gc_rwlock_.rdlock(GC_LOCK_TIMEOUT))) { ret = OB_TABLET_GC_LOCK_CONFLICT; - LOG_WARN("try lock failed, please retry later", K(ret)); + LOG_WARN("try lock failed, please retry later", KPC(ls_), K(ret)); } else if (check_stop()) { - gc_lock_.unlock(); + gc_rwlock_.rdunlock(); ret = OB_NOT_RUNNING; LOG_WARN("gc handler has already been offline", K(ret)); + } else { + FLOG_INFO("disable tablet gc success", KPC(ls_), K(lbt())); } return ret; @@ -320,22 +322,23 @@ int ObTabletGCHandler::disable_gc() void ObTabletGCHandler::enable_gc() { - gc_lock_.unlock(); + gc_rwlock_.rdunlock(); + FLOG_INFO("enable tablet gc success", KPC(ls_), K(lbt())); } int ObTabletGCHandler::set_tablet_change_checkpoint_scn(const share::SCN &scn) { int ret = OB_SUCCESS; - if (OB_FAIL(gc_lock_.lock(GC_LOCK_TIMEOUT))) { + if (OB_FAIL(gc_rwlock_.wrlock(GC_LOCK_TIMEOUT))) { ret = OB_TABLET_GC_LOCK_CONFLICT; - LOG_WARN("try lock failed, please retry later", K(ret)); + LOG_WARN("try lock failed, please retry later", KPC(ls_), K(ret)); } else { if (OB_FAIL(ls_->set_tablet_change_checkpoint_scn(scn))) { LOG_WARN("fail to set tablet_change_checkpoint_scn", K(ret), K(scn)); } else { // do nothing } - gc_lock_.unlock(); + gc_rwlock_.wrunlock(); } return ret; } @@ -740,12 +743,12 @@ int ObTabletGCHandler::offline() if (!is_finish()) { ret = OB_EAGAIN; STORAGE_LOG(INFO, "tablet gc handler not finish, retry", KR(ret), KPC(this), KPC(ls_), K(ls_->get_ls_meta())); - } else if (OB_FAIL(gc_lock_.lock(GC_LOCK_TIMEOUT))) { - // make sure 'gc_lock_' is not using. + } else if (OB_FAIL(gc_rwlock_.wrlock(GC_LOCK_TIMEOUT))) { + // make sure 'gc_rwlock_' is not using. ret = OB_TABLET_GC_LOCK_CONFLICT; - LOG_WARN("tablet gc handler not finish, retry", K(ret)); + LOG_WARN("tablet gc handler not finish, retry", KPC(ls_), K(ret)); } else { - gc_lock_.unlock(); + gc_rwlock_.wrunlock(); STORAGE_LOG(INFO, "tablet gc handler offline", KPC(this), KPC(ls_), K(ls_->get_ls_meta())); } return ret; diff --git a/src/storage/tx_storage/ob_tablet_gc_service.h b/src/storage/tx_storage/ob_tablet_gc_service.h index 9c8bb2cd9d..0cfdf9caf5 100644 --- a/src/storage/tx_storage/ob_tablet_gc_service.h +++ b/src/storage/tx_storage/ob_tablet_gc_service.h @@ -115,12 +115,12 @@ private: public: static const int64_t GC_LOCK_TIMEOUT = 100_ms; // 100ms obsys::ObRWLock wait_lock_; - lib::ObMutex gc_lock_; private: storage::ObLS *ls_; uint8_t tablet_persist_trigger_; bool update_enabled_; + mutable common::RWLock gc_rwlock_; bool is_inited_; };