fix minor dag hold tablet_handle causing memtable release late

This commit is contained in:
obdev
2023-02-09 18:06:03 +00:00
committed by ob-robot
parent 9d841eb626
commit 1cc67400fc
3 changed files with 16 additions and 9 deletions

View File

@ -556,8 +556,7 @@ int ObTabletMergeExecuteDag::direct_init_ctx(
const ObTabletMergeDagParam &param,
const lib::Worker::CompatMode compat_mode,
const ObGetMergeTablesResult &result,
ObLSHandle &ls_handle,
ObTabletHandle &tablet_handle)
ObLSHandle &ls_handle)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY((!is_minor_merge_type(result.suggest_merge_type_)
@ -573,7 +572,6 @@ int ObTabletMergeExecuteDag::direct_init_ctx(
merge_scn_range_ = result.scn_range_;
if (OB_FAIL(alloc_merge_ctx())) {
LOG_WARN("failed to alloc merge ctx", K(ret));
} else if (FALSE_IT(ctx_->tablet_handle_ = tablet_handle)) { // assign tablet_handle
} else if (FALSE_IT(ctx_->ls_handle_ = ls_handle)) { // assign ls_handle
} else if (FALSE_IT(ctx_->rebuild_seq_ = ls_handle.get_ls()->get_rebuild_seq())) {
} else if (OB_FAIL(create_first_task(result))) {
@ -642,6 +640,11 @@ int ObTabletMergeExecutePrepareTask::process()
} else if (OB_ISNULL(ctx_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ctx is unexpected null", K(ret), K(ctx_));
} else if (OB_FAIL(ctx_->ls_handle_.get_ls()->get_tablet(
ctx_->param_.tablet_id_,
ctx_->tablet_handle_,
storage::ObTabletCommon::NO_CHECK_GET_TABLET_TIMEOUT_US))) {
LOG_WARN("failed to get tablet", K(ret), K(ctx_->param_));
} else if (OB_FAIL(ctx_->try_swap_tablet_handle(result_.handle_))) { // swap tablet before get schema ptr from tablet
LOG_WARN("failed to try swap tablet handle", K(ret));
} else if (OB_FAIL(ctx_->get_schema_and_gene_from_result(result_))) {

View File

@ -306,8 +306,7 @@ public:
const ObTabletMergeDagParam &param,
const lib::Worker::CompatMode compat_mode,
const ObGetMergeTablesResult &result,
storage::ObLSHandle &ls_handle,
ObTabletHandle &tablet_handle);
storage::ObLSHandle &ls_handle);
template<class T>
int create_first_task(const ObGetMergeTablesResult &result);
virtual bool operator == (const ObIDag &other) const override;

View File

@ -776,6 +776,7 @@ int ObTenantTabletScheduler::schedule_tablet_ddl_major_merge(ObTabletHandle &tab
return ret;
}
// for minor dag, only hold tables_handle(sstable + ref), should not hold tablet(memtable)
template <class T>
int ObTenantTabletScheduler::schedule_merge_execute_dag(
const ObTabletMergeDagParam &param,
@ -800,8 +801,7 @@ int ObTenantTabletScheduler::schedule_merge_execute_dag(
param,
tablet_handle.get_obj()->get_tablet_meta().compat_mode_,
result,
ls_handle,
tablet_handle))) {
ls_handle))) {
LOG_WARN("failed to init dag", K(ret), K(result));
} else if (OB_FAIL(MTL(share::ObTenantDagScheduler *)->add_dag(merge_exe_dag, emergency))) {
LOG_WARN("failed to add dag", K(ret), KPC(merge_exe_dag));
@ -1197,7 +1197,12 @@ int ObTenantTabletScheduler::update_report_scn_as_ls_leader(ObLS &ls)
int ret = OB_SUCCESS;
ObRole role = INVALID_ROLE;
const int64_t major_merged_scn = get_inner_table_merged_scn();
if (OB_FAIL(ls.get_ls_role(role))) {
bool need_merge = false;
if (OB_FAIL(check_ls_state(ls, need_merge))) {
LOG_WARN("failed to check ls state", K(ret), K(ls_id));
} else if (!need_merge) {
// do nothing
} else if (OB_FAIL(ls.get_ls_role(role))) {
LOG_WARN("failed to get ls role", K(ret), K(ls));
} else if (LEADER == role) {
const ObLSID &ls_id = ls.get_ls_id();
@ -1206,7 +1211,7 @@ int ObTenantTabletScheduler::update_report_scn_as_ls_leader(ObLS &ls)
LOG_WARN("failed to get tablet id", K(ret), K(ls_id));
} else if (major_merged_scn > INIT_COMPACTION_SCN
&& OB_FAIL(ObTabletMetaTableCompactionOperator::batch_update_unequal_report_scn_tablet(
MTL_ID(), ls_id, major_merged_scn, tablet_id_array))) {
MTL_ID(), ls_id, major_merged_scn, tablet_id_array))) {
LOG_WARN("failed to get unequal report scn", K(ret), K(ls_id), K(major_merged_scn));
}
}