Fix: both tenant snapshot and backup require disable tablet gc, but only one can be executed at a time
This commit is contained in:
@ -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;
|
||||||
|
|||||||
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user