Fix: both tenant snapshot and backup require disable tablet gc, but only one can be executed at a time

This commit is contained in:
obdev
2024-01-11 10:48:31 +00:00
committed by ob-robot
parent e7dad62eca
commit cecb5f9c16
2 changed files with 15 additions and 12 deletions

View File

@ -306,13 +306,15 @@ uint8_t ObTabletGCHandler::get_tablet_persist_trigger_and_reset()
int ObTabletGCHandler::disable_gc() int ObTabletGCHandler::disable_gc()
{ {
int ret = OB_SUCCESS; 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; 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()) { } else if (check_stop()) {
gc_lock_.unlock(); gc_rwlock_.rdunlock();
ret = OB_NOT_RUNNING; ret = OB_NOT_RUNNING;
LOG_WARN("gc handler has already been offline", K(ret)); LOG_WARN("gc handler has already been offline", K(ret));
} else {
FLOG_INFO("disable tablet gc success", KPC(ls_), K(lbt()));
} }
return ret; return ret;
@ -320,22 +322,23 @@ int ObTabletGCHandler::disable_gc()
void ObTabletGCHandler::enable_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 ObTabletGCHandler::set_tablet_change_checkpoint_scn(const share::SCN &scn)
{ {
int ret = OB_SUCCESS; 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; 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 { } else {
if (OB_FAIL(ls_->set_tablet_change_checkpoint_scn(scn))) { if (OB_FAIL(ls_->set_tablet_change_checkpoint_scn(scn))) {
LOG_WARN("fail to set tablet_change_checkpoint_scn", K(ret), K(scn)); LOG_WARN("fail to set tablet_change_checkpoint_scn", K(ret), K(scn));
} else { } else {
// do nothing // do nothing
} }
gc_lock_.unlock(); gc_rwlock_.wrunlock();
} }
return ret; return ret;
} }
@ -740,12 +743,12 @@ int ObTabletGCHandler::offline()
if (!is_finish()) { if (!is_finish()) {
ret = OB_EAGAIN; ret = OB_EAGAIN;
STORAGE_LOG(INFO, "tablet gc handler not finish, retry", KR(ret), KPC(this), KPC(ls_), K(ls_->get_ls_meta())); 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))) { } else if (OB_FAIL(gc_rwlock_.wrlock(GC_LOCK_TIMEOUT))) {
// make sure 'gc_lock_' is not using. // make sure 'gc_rwlock_' is not using.
ret = OB_TABLET_GC_LOCK_CONFLICT; 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 { } else {
gc_lock_.unlock(); gc_rwlock_.wrunlock();
STORAGE_LOG(INFO, "tablet gc handler offline", KPC(this), KPC(ls_), K(ls_->get_ls_meta())); STORAGE_LOG(INFO, "tablet gc handler offline", KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
} }
return ret; return ret;

View File

@ -115,12 +115,12 @@ private:
public: public:
static const int64_t GC_LOCK_TIMEOUT = 100_ms; // 100ms static const int64_t GC_LOCK_TIMEOUT = 100_ms; // 100ms
obsys::ObRWLock wait_lock_; obsys::ObRWLock wait_lock_;
lib::ObMutex gc_lock_;
private: private:
storage::ObLS *ls_; storage::ObLS *ls_;
uint8_t tablet_persist_trigger_; uint8_t tablet_persist_trigger_;
bool update_enabled_; bool update_enabled_;
mutable common::RWLock gc_rwlock_;
bool is_inited_; bool is_inited_;
}; };