Avoid get_tablet in get_rec_scn after ddl commit success
This commit is contained in:
@ -160,6 +160,11 @@ int ObTabletDDLKvMgr::ddl_start(ObTablet &tablet,
|
|||||||
saved_start_scn = start_scn_;
|
saved_start_scn = start_scn_;
|
||||||
saved_snapshot_version = table_key_.get_snapshot_version();
|
saved_snapshot_version = table_key_.get_snapshot_version();
|
||||||
commit_scn_ = get_commit_scn_nolock(tablet.get_tablet_meta());
|
commit_scn_ = get_commit_scn_nolock(tablet.get_tablet_meta());
|
||||||
|
if (checkpoint_scn.is_valid_and_not_min()) {
|
||||||
|
if (tablet.get_tablet_meta().table_store_flag_.with_major_sstable() && tablet.get_tablet_meta().ddl_commit_scn_.is_valid_and_not_min()) {
|
||||||
|
success_start_scn_ = tablet.get_tablet_meta().ddl_start_scn_;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OB_SUCC(ret) && !checkpoint_scn.is_valid_and_not_min()) {
|
if (OB_SUCC(ret) && !checkpoint_scn.is_valid_and_not_min()) {
|
||||||
@ -349,39 +354,43 @@ int ObTabletDDLKvMgr::get_rec_scn(SCN &rec_scn)
|
|||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObLSHandle ls_handle;
|
ObLSHandle ls_handle;
|
||||||
ObTabletHandle tablet_handle;
|
ObTabletHandle tablet_handle;
|
||||||
|
const bool is_commit_succ = is_commit_success();
|
||||||
if (OB_UNLIKELY(!is_inited_)) {
|
if (OB_UNLIKELY(!is_inited_)) {
|
||||||
ret = OB_NOT_INIT;
|
ret = OB_NOT_INIT;
|
||||||
LOG_WARN("not init", K(ret), K(is_inited_));
|
LOG_WARN("not init", K(ret), K(is_inited_));
|
||||||
} else if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id_, ls_handle, ObLSGetMod::DDL_MOD))) {
|
|
||||||
LOG_WARN("failed to get log stream", K(ret), K(ls_id_));
|
|
||||||
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet(tablet_id_,
|
|
||||||
tablet_handle,
|
|
||||||
ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) {
|
|
||||||
LOG_WARN("get tablet handle failed", K(ret), K(ls_id_), K(tablet_id_));
|
|
||||||
}
|
}
|
||||||
|
if (OB_SUCC(ret) && !is_commit_succ) {
|
||||||
// rec scn of ddl start log
|
if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id_, ls_handle, ObLSGetMod::DDL_MOD))) {
|
||||||
if (OB_SUCC(ret)) {
|
LOG_WARN("failed to get log stream", K(ret), K(ls_id_));
|
||||||
const ObTabletMeta &tablet_meta = tablet_handle.get_obj()->get_tablet_meta();
|
} else if (OB_FAIL(ls_handle.get_ls()->get_tablet(tablet_id_,
|
||||||
ObLatchRGuard guard(lock_, ObLatchIds::TABLET_DDL_KV_MGR_LOCK);
|
tablet_handle,
|
||||||
if (start_scn_.is_valid_and_not_min() && start_scn_ != tablet_meta.ddl_start_scn_) {
|
ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) {
|
||||||
// has a latest start log and not flushed to tablet meta, keep it
|
LOG_WARN("get tablet handle failed", K(ret), K(ls_id_), K(tablet_id_));
|
||||||
rec_scn = SCN::min(rec_scn, start_scn_);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// rec scn of ddl commit log
|
// rec scn of ddl start log
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
const ObTabletMeta &tablet_meta = tablet_handle.get_obj()->get_tablet_meta();
|
const ObTabletMeta &tablet_meta = tablet_handle.get_obj()->get_tablet_meta();
|
||||||
if (tablet_meta.ddl_commit_scn_.is_valid_and_not_min()) {
|
ObLatchRGuard guard(lock_, ObLatchIds::TABLET_DDL_KV_MGR_LOCK);
|
||||||
// has commit log and already dumped to tablet meta, skip
|
if (start_scn_.is_valid_and_not_min() && start_scn_ != tablet_meta.ddl_start_scn_) {
|
||||||
} else {
|
// has a latest start log and not flushed to tablet meta, keep it
|
||||||
const SCN commit_scn = get_commit_scn(tablet_meta);
|
rec_scn = SCN::min(rec_scn, start_scn_);
|
||||||
if (commit_scn.is_valid_and_not_min()) {
|
}
|
||||||
// has commit log and not yet dumped to tablet meta
|
}
|
||||||
rec_scn = SCN::min(rec_scn, commit_scn);
|
|
||||||
|
// rec scn of ddl commit log
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
const ObTabletMeta &tablet_meta = tablet_handle.get_obj()->get_tablet_meta();
|
||||||
|
if (tablet_meta.ddl_commit_scn_.is_valid_and_not_min()) {
|
||||||
|
// has commit log and already dumped to tablet meta, skip
|
||||||
} else {
|
} else {
|
||||||
// no commit log
|
const SCN commit_scn = get_commit_scn(tablet_meta);
|
||||||
|
if (commit_scn.is_valid_and_not_min()) {
|
||||||
|
// has commit log and not yet dumped to tablet meta
|
||||||
|
rec_scn = SCN::min(rec_scn, commit_scn);
|
||||||
|
} else {
|
||||||
|
// no commit log
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user