[4.0] add online/offline in tablet_gc_handler

This commit is contained in:
obdev
2022-11-21 08:07:22 +00:00
committed by wangzelin.wzl
parent a63e7d37dd
commit d0f2d000b5
3 changed files with 48 additions and 5 deletions

View File

@ -698,6 +698,7 @@ int ObLS::offline_()
LOG_WARN("lock table offline failed", K(ret), K(ls_meta_)); LOG_WARN("lock table offline failed", K(ret), K(ls_meta_));
} else if (OB_FAIL(ls_tablet_svr_.offline())) { } else if (OB_FAIL(ls_tablet_svr_.offline())) {
LOG_WARN("tablet service offline failed", K(ret), K(ls_meta_)); LOG_WARN("tablet service offline failed", K(ret), K(ls_meta_));
} else if (FALSE_IT(tablet_gc_handler_.offline())) {
} else { } else {
// do nothing // do nothing
} }
@ -766,7 +767,7 @@ int ObLS::online()
} else if (OB_FAIL(online_compaction_())) { } else if (OB_FAIL(online_compaction_())) {
LOG_WARN("compaction online failed", K(ret), K(ls_meta_)); LOG_WARN("compaction online failed", K(ret), K(ls_meta_));
} else if (FALSE_IT(checkpoint_executor_.online())) { } else if (FALSE_IT(checkpoint_executor_.online())) {
LOG_WARN("checkpoint executor online failed", K(ret), K(ls_meta_)); } else if (FALSE_IT(tablet_gc_handler_.online())) {
} else { } else {
is_offlined_ = false; is_offlined_ = false;
// do nothing // do nothing

View File

@ -124,16 +124,19 @@ void ObTabletGCService::ObTabletGCTask::runTimerTask()
ObLS *ls = NULL; ObLS *ls = NULL;
int ls_cnt = 0; int ls_cnt = 0;
for (; OB_SUCC(ret) && OB_SUCC(iter->get_next(ls)); ++ls_cnt) { for (; OB_SUCC(ret) && OB_SUCC(iter->get_next(ls)); ++ls_cnt) {
ObTabletGCHandler *tablet_gc_handler = ls->get_tablet_gc_handler(); ObTabletGCHandler *tablet_gc_handler = NULL;
if (OB_ISNULL(ls)) { if (OB_ISNULL(ls)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "ls is NULL", KR(ret)); STORAGE_LOG(WARN, "ls is NULL", KR(ret));
} else if (FALSE_IT(tablet_gc_handler = ls->get_tablet_gc_handler())) {
} else if (tablet_gc_handler->check_stop()) {
} else { } else {
uint8_t tablet_persist_trigger = tablet_gc_handler->get_tablet_persist_trigger_and_reset(); uint8_t tablet_persist_trigger = tablet_gc_handler->get_tablet_persist_trigger_and_reset();
STORAGE_LOG(INFO, "[tabletgc] task check ls", K(ls->get_ls_id()), K(tablet_persist_trigger)); STORAGE_LOG(INFO, "[tabletgc] task check ls", K(ls->get_ls_id()), K(tablet_persist_trigger));
if (times == 0 if (times == 0
|| ObTabletGCHandler::is_set_tablet_persist_trigger(tablet_persist_trigger) || ObTabletGCHandler::is_set_tablet_persist_trigger(tablet_persist_trigger)
|| ObTabletGCHandler::is_tablet_gc_trigger(tablet_persist_trigger)) { || ObTabletGCHandler::is_tablet_gc_trigger(tablet_persist_trigger)) {
obsys::ObWLockGuard lock(tablet_gc_handler->wait_lock_);
bool need_retry = false; bool need_retry = false;
int64_t checkpoint_ts = INT64_MAX; int64_t checkpoint_ts = INT64_MAX;
ObFreezer *freezer = ls->get_freezer(); ObFreezer *freezer = ls->get_freezer();
@ -141,6 +144,7 @@ void ObTabletGCService::ObTabletGCTask::runTimerTask()
common::ObTabletIDArray deleted_tablet_ids; common::ObTabletIDArray deleted_tablet_ids;
const bool is_deleted = true; const bool is_deleted = true;
const bool only_deleted = true; const bool only_deleted = true;
if (OB_ISNULL(freezer)) { if (OB_ISNULL(freezer)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "freezer should not null", K(ls->get_ls_id()), KR(ret)); STORAGE_LOG(WARN, "freezer should not null", K(ls->get_ls_id()), KR(ret));
@ -278,7 +282,10 @@ int ObTabletGCHandler::get_unpersist_tablet_ids(common::ObTabletIDArray &unpersi
ObTabletHandle tablet_handle; ObTabletHandle tablet_handle;
while (OB_SUCC(ret)) { while (OB_SUCC(ret)) {
tx_data.reset(); tx_data.reset();
if (OB_FAIL(tablet_iter.get_next_tablet(tablet_handle))) { if (check_stop()) {
ret = OB_EAGAIN;
STORAGE_LOG(INFO, "tablet gc handler stop", KR(ret), KPC(this), K(tablet_handle), KPC(ls_), K(ls_->get_ls_meta()));
} else if (OB_FAIL(tablet_iter.get_next_tablet(tablet_handle))) {
if (OB_ITER_END == ret) { if (OB_ITER_END == ret) {
ret = OB_SUCCESS; ret = OB_SUCCESS;
break; break;
@ -365,6 +372,9 @@ int ObTabletGCHandler::wait_unpersist_tablet_ids_flushed(const common::ObTabletI
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "tablet gc handle is not inited", KR(ret)); STORAGE_LOG(WARN, "tablet gc handle is not inited", KR(ret));
} else if (check_stop()) {
ret = OB_EAGAIN;
STORAGE_LOG(INFO, "tablet gc handler stop", KR(ret), KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
} }
// wait all tablet flushed // wait all tablet flushed
while (unpersist_tablet_ids.count() > i && retry_times > 0 && OB_SUCC(ret)) { while (unpersist_tablet_ids.count() > i && retry_times > 0 && OB_SUCC(ret)) {
@ -373,7 +383,10 @@ int ObTabletGCHandler::wait_unpersist_tablet_ids_flushed(const common::ObTabletI
ObTabletHandle handle; ObTabletHandle handle;
ObTablet *tablet = nullptr; ObTablet *tablet = nullptr;
int64_t rec_log_ts = 0; int64_t rec_log_ts = 0;
if (OB_FAIL(ls_->get_tablet_svr()->get_tablet(unpersist_tablet_ids.at(i), handle, ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) { if (check_stop()) {
ret = OB_EAGAIN;
STORAGE_LOG(INFO, "tablet gc handler stop", KR(ret), KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
} else if (OB_FAIL(ls_->get_tablet_svr()->get_tablet(unpersist_tablet_ids.at(i), handle, ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) {
STORAGE_LOG(WARN, "fail to get tablet", KR(ret), K(i), KPC(this->ls_), K(unpersist_tablet_ids)); STORAGE_LOG(WARN, "fail to get tablet", KR(ret), K(i), KPC(this->ls_), K(unpersist_tablet_ids));
} else if (OB_ISNULL(tablet = handle.get_obj())) { } else if (OB_ISNULL(tablet = handle.get_obj())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
@ -411,6 +424,9 @@ int ObTabletGCHandler::gc_tablets(const common::ObTabletIDArray &tablet_ids)
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "tablet gc handler is not inited", KR(ret)); STORAGE_LOG(WARN, "tablet gc handler is not inited", KR(ret));
} else if (check_stop()) {
ret = OB_EAGAIN;
STORAGE_LOG(INFO, "tablet gc handler stop", KR(ret), KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
} else if (OB_FAIL(ls_->get_tablet_svr()->remove_tablets(tablet_ids))) { } else if (OB_FAIL(ls_->get_tablet_svr()->remove_tablets(tablet_ids))) {
STORAGE_LOG(WARN, "[tabletgc] failed to remove tablets", K(ret), K(tablet_ids)); STORAGE_LOG(WARN, "[tabletgc] failed to remove tablets", K(ret), K(tablet_ids));
} else { } else {
@ -419,6 +435,21 @@ int ObTabletGCHandler::gc_tablets(const common::ObTabletIDArray &tablet_ids)
return ret; return ret;
} }
void ObTabletGCHandler::offline()
{
set_stop();
wait_stop();
STORAGE_LOG(INFO, "tablet gc handler offline", KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
}
void ObTabletGCHandler::online()
{
set_tablet_persist_trigger();
set_tablet_gc_trigger();
set_start();
STORAGE_LOG(INFO, "tablet gc handler online", KPC(this), KPC(ls_), K(ls_->get_ls_meta()));
}
} // checkpoint } // checkpoint
} // storage } // storage
} // oceanbase } // oceanbase

View File

@ -13,8 +13,8 @@
#ifndef OCEABASE_STORAGE_OB_TABLET_GC_SERVICE_ #ifndef OCEABASE_STORAGE_OB_TABLET_GC_SERVICE_
#define OCEABASE_STORAGE_OB_TABLET_GC_SERVICE_ #define OCEABASE_STORAGE_OB_TABLET_GC_SERVICE_
#include "storage/tx_storage/ob_ls_freeze_thread.h" #include "storage/tx_storage/ob_ls_freeze_thread.h"
#include "lib/lock/ob_spin_lock.h"
#include "lib/task/ob_timer.h" #include "lib/task/ob_timer.h"
#include "lib/lock/ob_rwlock.h"
#include "common/ob_tablet_id.h" #include "common/ob_tablet_id.h"
namespace oceanbase namespace oceanbase
@ -31,6 +31,7 @@ public:
ObTabletGCHandler() ObTabletGCHandler()
: ls_(NULL), : ls_(NULL),
tablet_persist_trigger_(0), tablet_persist_trigger_(0),
update_enabled_(true),
is_inited_(false) is_inited_(false)
{} {}
~ObTabletGCHandler() { reset(); } ~ObTabletGCHandler() { reset(); }
@ -56,6 +57,9 @@ public:
int flush_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids, int flush_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids,
const int64_t checkpoint_ts); const int64_t checkpoint_ts);
int gc_tablets(const common::ObTabletIDArray &tablet_ids); int gc_tablets(const common::ObTabletIDArray &tablet_ids);
bool check_stop() { return ATOMIC_LOAD(&update_enabled_) == false; }
void offline();
void online();
TO_STRING_KV(K_(tablet_persist_trigger), K_(is_inited)); TO_STRING_KV(K_(tablet_persist_trigger), K_(is_inited));
private: private:
@ -64,10 +68,17 @@ private:
int freeze_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids); int freeze_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids);
int wait_unpersist_tablet_ids_flushed(const common::ObTabletIDArray &unpersist_tablet_ids, int wait_unpersist_tablet_ids_flushed(const common::ObTabletIDArray &unpersist_tablet_ids,
const int64_t checkpoint_ts); const int64_t checkpoint_ts);
void wait_stop() { obsys::ObWLockGuard lock(wait_lock_); }
void set_stop() { ATOMIC_STORE(&update_enabled_, false); }
void set_start() { ATOMIC_STORE(&update_enabled_, true); }
public:
obsys::ObRWLock wait_lock_;
private: private:
storage::ObLS *ls_; storage::ObLS *ls_;
uint8_t tablet_persist_trigger_; uint8_t tablet_persist_trigger_;
bool update_enabled_;
bool is_inited_; bool is_inited_;
}; };