check start scn of macro redo matched when alloc kv.

This commit is contained in:
obdev
2024-02-09 06:08:07 +00:00
committed by ob-robot
parent 22ada2e123
commit 8d2fb70557
5 changed files with 26 additions and 11 deletions

View File

@ -308,8 +308,14 @@ int ObDDLRedoReplayExecutor::do_replay_(ObTabletHandle &tablet_handle)
if (OB_SUCC(ret) && need_replay) { if (OB_SUCC(ret) && need_replay) {
if (OB_FAIL(ObDDLKVPendingGuard::set_macro_block(tablet_handle.get_obj(), macro_block, if (OB_FAIL(ObDDLKVPendingGuard::set_macro_block(tablet_handle.get_obj(), macro_block,
snapshot_version, data_format_version, direct_load_mgr_handle))) { snapshot_version, data_format_version, direct_load_mgr_handle))) {
LOG_WARN("set macro block into ddl kv failed", K(ret), K(tablet_handle), K(macro_block), if (OB_TASK_EXPIRED == ret) {
K(snapshot_version), K(data_format_version)); need_replay = false;
LOG_INFO("task expired, skip replay the redo", K(ret), K(macro_block), KPC(direct_load_mgr_handle.get_obj()));
ret = OB_SUCCESS;
} else {
LOG_WARN("set macro block into ddl kv failed", K(ret), K(tablet_handle), K(macro_block),
K(snapshot_version), K(data_format_version));
}
} }
} }
} }

View File

@ -162,7 +162,7 @@ void ObDDLKVHandle::reset()
} }
} }
ObDDLKVPendingGuard::ObDDLKVPendingGuard(ObTablet *tablet, const SCN &scn, ObDDLKVPendingGuard::ObDDLKVPendingGuard(ObTablet *tablet, const SCN &scn, const SCN &start_scn,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle) ObTabletDirectLoadMgrHandle &direct_load_mgr_handle)
: tablet_(tablet), scn_(scn), kv_handle_(), ret_(OB_SUCCESS) : tablet_(tablet), scn_(scn), kv_handle_(), ret_(OB_SUCCESS)
{ {
@ -175,7 +175,7 @@ ObDDLKVPendingGuard::ObDDLKVPendingGuard(ObTablet *tablet, const SCN &scn,
} else if (OB_FAIL(tablet->get_ddl_kv_mgr(ddl_kv_mgr_handle))) { } else if (OB_FAIL(tablet->get_ddl_kv_mgr(ddl_kv_mgr_handle))) {
LOG_WARN("get ddl kv mgr failed", K(ret)); LOG_WARN("get ddl kv mgr failed", K(ret));
} else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->get_or_create_ddl_kv( } else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->get_or_create_ddl_kv(
scn, direct_load_mgr_handle, kv_handle_))) { scn, start_scn, direct_load_mgr_handle, kv_handle_))) {
LOG_WARN("acquire ddl kv failed", K(ret)); LOG_WARN("acquire ddl kv failed", K(ret));
} else if (OB_ISNULL(curr_kv = kv_handle_.get_obj())) { } else if (OB_ISNULL(curr_kv = kv_handle_.get_obj())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
@ -231,7 +231,7 @@ int ObDDLKVPendingGuard::set_macro_block(
int64_t try_count = 0; int64_t try_count = 0;
while ((OB_SUCCESS == ret || OB_EAGAIN == ret) && try_count < MAX_RETRY_COUNT) { while ((OB_SUCCESS == ret || OB_EAGAIN == ret) && try_count < MAX_RETRY_COUNT) {
ObDDLKV *ddl_kv = nullptr; ObDDLKV *ddl_kv = nullptr;
ObDDLKVPendingGuard guard(tablet, macro_block.scn_, direct_load_mgr_handle); ObDDLKVPendingGuard guard(tablet, macro_block.scn_, macro_block.ddl_start_scn_, direct_load_mgr_handle);
if (OB_FAIL(guard.get_ddl_kv(ddl_kv))) { if (OB_FAIL(guard.get_ddl_kv(ddl_kv))) {
LOG_WARN("get ddl kv failed", K(ret)); LOG_WARN("get ddl kv failed", K(ret));
} else if (OB_ISNULL(ddl_kv)) { } else if (OB_ISNULL(ddl_kv)) {

View File

@ -96,6 +96,7 @@ public:
ObDDLKVPendingGuard( ObDDLKVPendingGuard(
ObTablet *tablet, ObTablet *tablet,
const share::SCN &scn, const share::SCN &scn,
const share::SCN &start_scn,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle); ObTabletDirectLoadMgrHandle &direct_load_mgr_handle);
~ObDDLKVPendingGuard(); ~ObDDLKVPendingGuard();
int get_ret() const { return ret_; } int get_ret() const { return ret_; }

View File

@ -336,7 +336,8 @@ int ObTabletDDLKvMgr::get_active_ddl_kv_impl(ObDDLKVHandle &kv_handle)
} }
int ObTabletDDLKvMgr::get_or_create_ddl_kv( int ObTabletDDLKvMgr::get_or_create_ddl_kv(
const share::SCN &scn, const share::SCN &macro_redo_scn,
const share::SCN &macro_redo_start_scn,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle, ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObDDLKVHandle &kv_handle) ObDDLKVHandle &kv_handle)
{ {
@ -346,18 +347,24 @@ int ObTabletDDLKvMgr::get_or_create_ddl_kv(
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
LOG_WARN("ObTabletDDLKvMgr is not inited", K(ret)); LOG_WARN("ObTabletDDLKvMgr is not inited", K(ret));
} else if (!scn.is_valid_and_not_min()) { } else if (OB_UNLIKELY(!macro_redo_scn.is_valid_and_not_min() || !macro_redo_start_scn.is_valid_and_not_min())) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid argument", K(ret), K(scn)); LOG_WARN("invalid argument", K(ret), K(macro_redo_scn), K(macro_redo_start_scn));
} else if (OB_FAIL(direct_load_mgr_handle.get_obj()->rdlock(TRY_LOCK_TIMEOUT/*10s*/, direct_load_lock_tid))) { } else if (OB_FAIL(direct_load_mgr_handle.get_obj()->rdlock(TRY_LOCK_TIMEOUT/*10s*/, direct_load_lock_tid))) {
// usually use the latest start scn to allocate kv. // usually use the latest start scn to allocate kv.
LOG_WARN("lock failed", K(ret)); LOG_WARN("lock failed", K(ret));
} else if (OB_UNLIKELY(macro_redo_start_scn < direct_load_mgr_handle.get_obj()->get_start_scn())) {
ret = OB_TASK_EXPIRED;
LOG_WARN("ddl task expired", K(ret), K(macro_redo_start_scn), "start_scn", direct_load_mgr_handle.get_obj()->get_start_scn());
} else if (OB_UNLIKELY(macro_redo_start_scn > direct_load_mgr_handle.get_obj()->get_start_scn())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected start scn in memory", K(ret), K(macro_redo_start_scn), "start_scn", direct_load_mgr_handle.get_obj()->get_start_scn());
} else { } else {
uint32_t lock_tid = 0; // try lock to avoid hang in clog callback uint32_t lock_tid = 0; // try lock to avoid hang in clog callback
if (OB_FAIL(rdlock(TRY_LOCK_TIMEOUT, lock_tid))) { if (OB_FAIL(rdlock(TRY_LOCK_TIMEOUT, lock_tid))) {
LOG_WARN("failed to rdlock", K(ret), KPC(this)); LOG_WARN("failed to rdlock", K(ret), KPC(this));
} else { } else {
try_get_ddl_kv_unlock(scn, kv_handle); try_get_ddl_kv_unlock(macro_redo_scn, kv_handle);
} }
if (lock_tid != 0) { if (lock_tid != 0) {
unlock(lock_tid); unlock(lock_tid);
@ -368,7 +375,7 @@ int ObTabletDDLKvMgr::get_or_create_ddl_kv(
if (OB_FAIL(wrlock(TRY_LOCK_TIMEOUT, lock_tid))) { if (OB_FAIL(wrlock(TRY_LOCK_TIMEOUT, lock_tid))) {
LOG_WARN("failed to wrlock", K(ret), KPC(this)); LOG_WARN("failed to wrlock", K(ret), KPC(this));
} else { } else {
try_get_ddl_kv_unlock(scn, kv_handle); try_get_ddl_kv_unlock(macro_redo_scn, kv_handle);
if (kv_handle.is_valid()) { if (kv_handle.is_valid()) {
// do nothing // do nothing
} else if (OB_FAIL(alloc_ddl_kv(direct_load_mgr_handle.get_obj()->get_start_scn(), } else if (OB_FAIL(alloc_ddl_kv(direct_load_mgr_handle.get_obj()->get_start_scn(),

View File

@ -40,7 +40,8 @@ public:
int init(const share::ObLSID &ls_id, const common::ObTabletID &tablet_id); // init before memtable mgr int init(const share::ObLSID &ls_id, const common::ObTabletID &tablet_id); // init before memtable mgr
int set_max_freeze_scn(const share::SCN &checkpoint_scn); int set_max_freeze_scn(const share::SCN &checkpoint_scn);
int get_or_create_ddl_kv( int get_or_create_ddl_kv(
const share::SCN &scn, const share::SCN &macro_redo_scn,
const share::SCN &macro_redo_start_scn,
ObTabletDirectLoadMgrHandle &direct_load_mgr_handle, ObTabletDirectLoadMgrHandle &direct_load_mgr_handle,
ObDDLKVHandle &kv_handle); // used in active ddl kv guard ObDDLKVHandle &kv_handle); // used in active ddl kv guard
int get_freezed_ddl_kv(const share::SCN &freeze_scn, ObDDLKVHandle &kv_handle); // locate ddl kv with exeact freeze log ts int get_freezed_ddl_kv(const share::SCN &freeze_scn, ObDDLKVHandle &kv_handle); // locate ddl kv with exeact freeze log ts