fix minor dag hold tablet_handle causing memtable release late
This commit is contained in:
@ -556,8 +556,7 @@ int ObTabletMergeExecuteDag::direct_init_ctx(
|
|||||||
const ObTabletMergeDagParam ¶m,
|
const ObTabletMergeDagParam ¶m,
|
||||||
const lib::Worker::CompatMode compat_mode,
|
const lib::Worker::CompatMode compat_mode,
|
||||||
const ObGetMergeTablesResult &result,
|
const ObGetMergeTablesResult &result,
|
||||||
ObLSHandle &ls_handle,
|
ObLSHandle &ls_handle)
|
||||||
ObTabletHandle &tablet_handle)
|
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (OB_UNLIKELY((!is_minor_merge_type(result.suggest_merge_type_)
|
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_;
|
merge_scn_range_ = result.scn_range_;
|
||||||
if (OB_FAIL(alloc_merge_ctx())) {
|
if (OB_FAIL(alloc_merge_ctx())) {
|
||||||
LOG_WARN("failed to alloc merge ctx", K(ret));
|
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_->ls_handle_ = ls_handle)) { // assign ls_handle
|
||||||
} else if (FALSE_IT(ctx_->rebuild_seq_ = ls_handle.get_ls()->get_rebuild_seq())) {
|
} else if (FALSE_IT(ctx_->rebuild_seq_ = ls_handle.get_ls()->get_rebuild_seq())) {
|
||||||
} else if (OB_FAIL(create_first_task(result))) {
|
} else if (OB_FAIL(create_first_task(result))) {
|
||||||
@ -642,6 +640,11 @@ int ObTabletMergeExecutePrepareTask::process()
|
|||||||
} else if (OB_ISNULL(ctx_)) {
|
} else if (OB_ISNULL(ctx_)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("ctx is unexpected null", K(ret), K(ctx_));
|
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
|
} 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));
|
LOG_WARN("failed to try swap tablet handle", K(ret));
|
||||||
} else if (OB_FAIL(ctx_->get_schema_and_gene_from_result(result_))) {
|
} else if (OB_FAIL(ctx_->get_schema_and_gene_from_result(result_))) {
|
||||||
|
|||||||
@ -306,8 +306,7 @@ public:
|
|||||||
const ObTabletMergeDagParam ¶m,
|
const ObTabletMergeDagParam ¶m,
|
||||||
const lib::Worker::CompatMode compat_mode,
|
const lib::Worker::CompatMode compat_mode,
|
||||||
const ObGetMergeTablesResult &result,
|
const ObGetMergeTablesResult &result,
|
||||||
storage::ObLSHandle &ls_handle,
|
storage::ObLSHandle &ls_handle);
|
||||||
ObTabletHandle &tablet_handle);
|
|
||||||
template<class T>
|
template<class T>
|
||||||
int create_first_task(const ObGetMergeTablesResult &result);
|
int create_first_task(const ObGetMergeTablesResult &result);
|
||||||
virtual bool operator == (const ObIDag &other) const override;
|
virtual bool operator == (const ObIDag &other) const override;
|
||||||
|
|||||||
@ -776,6 +776,7 @@ int ObTenantTabletScheduler::schedule_tablet_ddl_major_merge(ObTabletHandle &tab
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for minor dag, only hold tables_handle(sstable + ref), should not hold tablet(memtable)
|
||||||
template <class T>
|
template <class T>
|
||||||
int ObTenantTabletScheduler::schedule_merge_execute_dag(
|
int ObTenantTabletScheduler::schedule_merge_execute_dag(
|
||||||
const ObTabletMergeDagParam ¶m,
|
const ObTabletMergeDagParam ¶m,
|
||||||
@ -800,8 +801,7 @@ int ObTenantTabletScheduler::schedule_merge_execute_dag(
|
|||||||
param,
|
param,
|
||||||
tablet_handle.get_obj()->get_tablet_meta().compat_mode_,
|
tablet_handle.get_obj()->get_tablet_meta().compat_mode_,
|
||||||
result,
|
result,
|
||||||
ls_handle,
|
ls_handle))) {
|
||||||
tablet_handle))) {
|
|
||||||
LOG_WARN("failed to init dag", K(ret), K(result));
|
LOG_WARN("failed to init dag", K(ret), K(result));
|
||||||
} else if (OB_FAIL(MTL(share::ObTenantDagScheduler *)->add_dag(merge_exe_dag, emergency))) {
|
} 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));
|
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;
|
int ret = OB_SUCCESS;
|
||||||
ObRole role = INVALID_ROLE;
|
ObRole role = INVALID_ROLE;
|
||||||
const int64_t major_merged_scn = get_inner_table_merged_scn();
|
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));
|
LOG_WARN("failed to get ls role", K(ret), K(ls));
|
||||||
} else if (LEADER == role) {
|
} else if (LEADER == role) {
|
||||||
const ObLSID &ls_id = ls.get_ls_id();
|
const ObLSID &ls_id = ls.get_ls_id();
|
||||||
|
|||||||
Reference in New Issue
Block a user