[4.1] tablet gc and tablet persist disassociation

This commit is contained in:
obdev
2023-01-04 08:41:50 +00:00
committed by ob-robot
parent 4453ef5eee
commit ad415b4359
4 changed files with 45 additions and 39 deletions

View File

@ -1175,42 +1175,52 @@ int ObLS::replay_get_tablet(const common::ObTabletID &tablet_id,
ObTabletHandle &handle) const ObTabletHandle &handle) const
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
const ObTabletMapKey key(ls_meta_.ls_id_, tablet_id); const ObTabletMapKey key(ls_meta_.ls_id_, tablet_id);
const SCN tablet_change_checkpoint_scn = ls_meta_.get_tablet_change_checkpoint_scn(); const SCN tablet_change_checkpoint_scn = ls_meta_.get_tablet_change_checkpoint_scn();
ObTabletHandle tablet_handle; ObTabletHandle tablet_handle;
SCN min_scn;
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
LOG_WARN("ls is not inited", K(ret)); LOG_WARN("ls is not inited", KR(ret));
} else if (OB_UNLIKELY(!tablet_id.is_valid() || !scn.is_valid())) { } else if (OB_UNLIKELY(!tablet_id.is_valid() || !scn.is_valid())) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", K(ret), K(tablet_id), K(scn)); LOG_WARN("invalid args", KR(ret), K(tablet_id), K(scn));
} else if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) { } else if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) {
if (OB_TABLET_NOT_EXIST != ret) { if (OB_TABLET_NOT_EXIST != ret) {
LOG_WARN("failed to get tablet", K(ret), K(key)); LOG_WARN("failed to get tablet", K(ret), K(key));
} else if (scn <= tablet_change_checkpoint_scn) { } else if (scn <= tablet_change_checkpoint_scn) {
LOG_WARN("tablet already deleted", K(ret), K(key), K(scn), K(tablet_change_checkpoint_scn)); LOG_WARN("tablet already gc", K(ret), K(key), K(scn), K(tablet_change_checkpoint_scn));
} else { } else if (OB_TMP_FAIL(MTL(ObLogService*)->get_log_replay_service()->get_min_unreplayed_scn(ls_meta_.ls_id_, min_scn))) {
ret = tmp_ret;
LOG_WARN("failed to get_min_unreplayed_scn", KR(ret), K_(ls_meta), K(scn), K(tablet_id));
} else if (!min_scn.is_valid()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("min_scn is invalid", KR(ret), K(key), K(scn), K(tablet_change_checkpoint_scn));
} else if (scn > min_scn) {
ret = OB_EAGAIN; ret = OB_EAGAIN;
LOG_INFO("tablet does not exist, but need retry", K(ret), K(key), K(scn), K(tablet_change_checkpoint_scn)); LOG_INFO("tablet does not exist, but need retry", KR(ret), K(key), K(scn), K(tablet_change_checkpoint_scn), K(min_scn));
} else {
LOG_INFO("tablet already gc, but scn is more than min scn", KR(ret), K(key), K(scn), K(tablet_change_checkpoint_scn), K(min_scn));
} }
} else { } else {
ObTabletTxMultiSourceDataUnit tx_data; ObTabletTxMultiSourceDataUnit tx_data;
if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) { if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) {
LOG_WARN("failed to get tablet tx data", K(ret), K(tablet_handle)); LOG_WARN("failed to get tablet tx data", KR(ret), K(tablet_handle));
} else if (ObTabletStatus::CREATING == tx_data.tablet_status_) { } else if (ObTabletStatus::CREATING == tx_data.tablet_status_) {
ret = OB_EAGAIN; ret = OB_EAGAIN;
LOG_INFO("tablet is CREATING, need retry", K(ret), K(key), K(tx_data), K(scn)); LOG_INFO("tablet is CREATING, need retry", KR(ret), K(key), K(tx_data), K(scn));
} else if (ObTabletStatus::NORMAL == tx_data.tablet_status_) { } else if (ObTabletStatus::NORMAL == tx_data.tablet_status_) {
// do nothing // do nothing
} else if (ObTabletStatus::DELETING == tx_data.tablet_status_) { } else if (ObTabletStatus::DELETING == tx_data.tablet_status_) {
LOG_INFO("tablet is DELETING, just continue", K(ret), K(key), K(tx_data), K(scn)); LOG_INFO("tablet is DELETING, just continue", KR(ret), K(key), K(tx_data), K(scn));
} else if (ObTabletStatus::DELETED == tx_data.tablet_status_) { } else if (ObTabletStatus::DELETED == tx_data.tablet_status_) {
ret = OB_TABLET_NOT_EXIST; ret = OB_TABLET_NOT_EXIST;
LOG_INFO("tablet is already deleted", K(ret), K(key), K(tx_data), K(scn)); LOG_INFO("tablet is already deleted", KR(ret), K(key), K(tx_data), K(scn));
} else { } else {
ret = OB_EAGAIN; ret = OB_EAGAIN;
LOG_INFO("tablet may be in creating procedure", K(ret), K(key), K(tx_data), K(scn)); LOG_INFO("tablet may be in creating procedure", KR(ret), K(key), K(tx_data), K(scn));
} }
} }

View File

@ -779,20 +779,20 @@ int ObTabletBindingHelper::replay_get_tablet(const ObTabletMapKey &key, ObTablet
if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) { if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) {
if (OB_TABLET_NOT_EXIST != ret) { if (OB_TABLET_NOT_EXIST != ret) {
LOG_WARN("failed to get tablet", K(ret), K(key)); LOG_WARN("failed to get tablet", KR(ret), K(key));
} else if (trans_flags_.scn_ <= tablet_change_checkpoint_scn) { } else if (trans_flags_.scn_ <= tablet_change_checkpoint_scn) {
LOG_WARN("tablet already deleted", K(ret), K(key), K(trans_flags_), K(tablet_change_checkpoint_scn)); LOG_WARN("tablet already gc", KR(ret), K(key), K(trans_flags_), K(tablet_change_checkpoint_scn));
} else { } else {
ret = OB_EAGAIN; LOG_INFO("tablet already gc, trans_flags_.scn_ is not less than tablet_change_checkpoint_scn",
LOG_INFO("tablet does not exist, but need retry", K(ret), K(key), K(trans_flags_)); KR(ret), K(key), K(trans_flags_), K(tablet_change_checkpoint_scn));
} }
} else { } else {
ObTabletTxMultiSourceDataUnit tx_data; ObTabletTxMultiSourceDataUnit tx_data;
if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) { if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) {
LOG_WARN("failed to get tablet tx data", K(ret), K(tablet_handle)); LOG_WARN("failed to get tablet tx data", KR(ret), K(tablet_handle));
} else if (ObTabletStatus::DELETED == tx_data.tablet_status_) { } else if (ObTabletStatus::DELETED == tx_data.tablet_status_) {
ret = OB_TABLET_NOT_EXIST; ret = OB_TABLET_NOT_EXIST;
LOG_INFO("tablet is already deleted", K(ret), K(key), K(tx_data)); LOG_INFO("tablet is already deleted", KR(ret), K(key), K(tx_data));
} }
} }

View File

@ -159,35 +159,34 @@ void ObTabletGCService::ObTabletGCTask::runTimerTask()
STORAGE_LOG(INFO, "no any log callback and no need to update clog checkpoint", STORAGE_LOG(INFO, "no any log callback and no need to update clog checkpoint",
K(freezer->get_ls_id()), K(checkpoint_scn), KPC(ls), K(ls->get_ls_meta())); K(freezer->get_ls_id()), K(checkpoint_scn), KPC(ls), K(ls->get_ls_meta()));
} }
// 2. get gc tablet // 2. get gc tablet. persist tablet must gc tablet
else if ((times == 0 || ObTabletGCHandler::is_tablet_gc_trigger(tablet_persist_trigger)) else if (OB_FAIL(tablet_gc_handler->get_unpersist_tablet_ids(deleted_tablet_ids, only_deleted))) {
&& OB_FAIL(tablet_gc_handler->get_unpersist_tablet_ids(deleted_tablet_ids, checkpoint_scn, only_deleted))) {
need_retry = true; need_retry = true;
STORAGE_LOG(WARN, "failed to get_unpersist_tablet_ids", KPC(ls), KR(ret)); STORAGE_LOG(WARN, "failed to get_unpersist_tablet_ids", KPC(ls), KR(ret));
} }
// 3. get unpersist_tablet_ids // 3. check and gc deleted_tablet_ids. tablet_change_ts cannot update when gc tablet failed.
else if (OB_FAIL(tablet_gc_handler->get_unpersist_tablet_ids(unpersist_tablet_ids, checkpoint_scn, !only_deleted))) { else if (!deleted_tablet_ids.empty() && OB_FAIL(tablet_gc_handler->gc_tablets(deleted_tablet_ids))) {
need_retry = true;
STORAGE_LOG(WARN, "failed to gc tablet", KR(ret), K(deleted_tablet_ids));
}
// 4. get unpersist_tablet_ids
else if ((times == 0 || ObTabletGCHandler::is_set_tablet_persist_trigger(tablet_persist_trigger))
&& OB_FAIL(tablet_gc_handler->get_unpersist_tablet_ids(unpersist_tablet_ids, !only_deleted))) {
need_retry = true; need_retry = true;
STORAGE_LOG(WARN, "failed to get_unpersist_tablet_ids", KPC(ls), KR(ret)); STORAGE_LOG(WARN, "failed to get_unpersist_tablet_ids", KPC(ls), KR(ret));
} }
// 4. flush unpersit_tablet_ids // 5. flush unpersit_tablet_ids
else if (OB_FAIL(tablet_gc_handler->flush_unpersist_tablet_ids(unpersist_tablet_ids, checkpoint_scn))) { else if ((times == 0 || ObTabletGCHandler::is_set_tablet_persist_trigger(tablet_persist_trigger))
&& OB_FAIL(tablet_gc_handler->flush_unpersist_tablet_ids(unpersist_tablet_ids, checkpoint_scn))) {
need_retry = true; need_retry = true;
STORAGE_LOG(WARN, "failed to flush_unpersist_tablet_ids", KPC(ls), KR(ret), K(unpersist_tablet_ids)); STORAGE_LOG(WARN, "failed to flush_unpersist_tablet_ids", KPC(ls), KR(ret), K(unpersist_tablet_ids));
} }
// 5. update tablet_change_checkpoint in log meta // 6. update tablet_change_checkpoint in log meta
else if (OB_FAIL(ls->set_tablet_change_checkpoint_scn(checkpoint_scn))) { else if ((times == 0 || ObTabletGCHandler::is_set_tablet_persist_trigger(tablet_persist_trigger))
&& OB_FAIL(ls->set_tablet_change_checkpoint_scn(checkpoint_scn))) {
need_retry = true; need_retry = true;
STORAGE_LOG(WARN, "failed to set_tablet_change_checkpoint_scn", KPC(ls), KR(ret), K(checkpoint_scn)); STORAGE_LOG(WARN, "failed to set_tablet_change_checkpoint_scn", KPC(ls), KR(ret), K(checkpoint_scn));
} }
// 6. check and gc deleted_tablet_ids
else if (times == 0 || ObTabletGCHandler::is_tablet_gc_trigger(tablet_persist_trigger)) {
// to do check gc and gc tablets
if (!deleted_tablet_ids.empty() && OB_FAIL(tablet_gc_handler->gc_tablets(deleted_tablet_ids))) {
need_retry = true;
STORAGE_LOG(WARN, "failed to gc tablet", KR(ret), K(deleted_tablet_ids));
}
}
STORAGE_LOG(INFO, "[tabletgc] tablet in a ls persist and gc process end", KR(ret), KPC(ls), K(checkpoint_scn), K(deleted_tablet_ids), K(unpersist_tablet_ids)); STORAGE_LOG(INFO, "[tabletgc] tablet in a ls persist and gc process end", KR(ret), KPC(ls), K(checkpoint_scn), K(deleted_tablet_ids), K(unpersist_tablet_ids));
if (need_retry) { if (need_retry) {
STORAGE_LOG(INFO, "[tabletgc] persist or gc error, need try", KR(ret), KPC(ls), K(checkpoint_scn), K(tablet_persist_trigger)); STORAGE_LOG(INFO, "[tabletgc] persist or gc error, need try", KR(ret), KPC(ls), K(checkpoint_scn), K(tablet_persist_trigger));
@ -268,7 +267,6 @@ uint8_t ObTabletGCHandler::get_tablet_persist_trigger_and_reset()
} }
int ObTabletGCHandler::get_unpersist_tablet_ids(common::ObTabletIDArray &unpersist_tablet_ids, int ObTabletGCHandler::get_unpersist_tablet_ids(common::ObTabletIDArray &unpersist_tablet_ids,
const SCN checkpoint_scn,
bool only_deleted /* = false */) bool only_deleted /* = false */)
{ {
int64_t ret = OB_SUCCESS; int64_t ret = OB_SUCCESS;
@ -305,15 +303,14 @@ int ObTabletGCHandler::get_unpersist_tablet_ids(common::ObTabletIDArray &unpersi
if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) { if (OB_FAIL(tablet_handle.get_obj()->get_tx_data(tx_data))) {
LOG_WARN("failed to get tx data", K(ret), K(tablet_id)); LOG_WARN("failed to get tx data", K(ret), K(tablet_id));
} else if (only_deleted) { } else if (only_deleted) {
if (ObTabletStatus::DELETED == tx_data.tablet_status_ if (ObTabletStatus::DELETED == tx_data.tablet_status_) {
&& tx_data.tx_scn_ <= checkpoint_scn) { STORAGE_LOG(INFO, "[tabletgc] get tx_data for gc", K(tx_data), K(tablet_meta));
STORAGE_LOG(INFO, "[tabletgc] get tx_data for gc", K(tx_data), K(tablet_meta), K(checkpoint_scn));
if (OB_FAIL(unpersist_tablet_ids.push_back(tablet_id))) { if (OB_FAIL(unpersist_tablet_ids.push_back(tablet_id))) {
STORAGE_LOG(WARN, "failed to push_back deleted tablet", KR(ret)); STORAGE_LOG(WARN, "failed to push_back deleted tablet", KR(ret));
} }
} }
} else if (tx_data.tx_scn_ > tablet_meta.clog_checkpoint_scn_) { } else if (tx_data.tx_scn_ > tablet_meta.clog_checkpoint_scn_) {
STORAGE_LOG(INFO, "[tabletgc] get tx_data for persist", K(tx_data), K(tablet_meta), K(checkpoint_scn)); STORAGE_LOG(INFO, "[tabletgc] get tx_data for persist", K(tx_data), K(tablet_meta));
if (OB_FAIL(unpersist_tablet_ids.push_back(tablet_id))) { if (OB_FAIL(unpersist_tablet_ids.push_back(tablet_id))) {
STORAGE_LOG(WARN, "failed to push_back", KR(ret)); STORAGE_LOG(WARN, "failed to push_back", KR(ret));
} }

View File

@ -53,7 +53,6 @@ public:
void set_tablet_gc_trigger(); void set_tablet_gc_trigger();
uint8_t get_tablet_persist_trigger_and_reset(); uint8_t get_tablet_persist_trigger_and_reset();
int get_unpersist_tablet_ids(common::ObTabletIDArray &unpersist_create_tablet_ids, int get_unpersist_tablet_ids(common::ObTabletIDArray &unpersist_create_tablet_ids,
const share::SCN checkpoint_scn,
bool only_deleted = false); bool only_deleted = false);
int flush_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids, int flush_unpersist_tablet_ids(const common::ObTabletIDArray &unpersist_tablet_ids,
const share::SCN checkpoint_scn); const share::SCN checkpoint_scn);