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 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_))) {
 | 
			
		||||
 | 
			
		||||
@ -306,8 +306,7 @@ public:
 | 
			
		||||
      const ObTabletMergeDagParam ¶m,
 | 
			
		||||
      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;
 | 
			
		||||
 | 
			
		||||
@ -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 ¶m,
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user