diff --git a/src/storage/compaction/ob_tablet_merge_ctx.cpp b/src/storage/compaction/ob_tablet_merge_ctx.cpp index 0103cb05bb..9366e108f6 100755 --- a/src/storage/compaction/ob_tablet_merge_ctx.cpp +++ b/src/storage/compaction/ob_tablet_merge_ctx.cpp @@ -883,6 +883,8 @@ int ObTabletMergeCtx::update_tablet_directly(const ObGetMergeTablesResult &get_m get_merge_table_result.version_range_.multi_version_start_, schema_ctx_.storage_schema_, rebuild_seq_, + true/*need_check_transfer_seq*/, + tablet_handle_.get_obj()->get_tablet_meta().transfer_info_.transfer_seq_, is_major_merge_type(param_.merge_type_), SCN::min_scn()/*clog_checkpoint_scn*/); ObTabletHandle new_tablet_handle; diff --git a/src/storage/compaction/ob_tablet_merge_task.cpp b/src/storage/compaction/ob_tablet_merge_task.cpp index 22c2cfcc70..04a2b430cb 100755 --- a/src/storage/compaction/ob_tablet_merge_task.cpp +++ b/src/storage/compaction/ob_tablet_merge_task.cpp @@ -1266,6 +1266,8 @@ int ObTabletMergeFinishTask::add_sstable_for_merge(ObTabletMergeCtx &ctx) ctx.sstable_version_range_.multi_version_start_, ctx.schema_ctx_.storage_schema_, ctx.rebuild_seq_, + true/*need_check_transfer_seq*/, + ctx.tablet_handle_.get_obj()->get_tablet_meta().transfer_info_.transfer_seq_, is_major_merge_type(merge_type)/*need_report*/, clog_checkpoint_scn, is_minor_merge(ctx.param_.merge_type_)/*need_check_sstable*/, diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp index 14875f6106..d2f4f012b6 100755 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp @@ -2281,6 +2281,7 @@ int ObStorageHATabletBuilderUtil::build_tablet_with_major_tables( ObTablet *tablet = nullptr; ObSEArray major_table_array; int64_t multi_version_start = 0; + int64_t transfer_seq = 0; if (OB_ISNULL(ls) || !tablet_id.is_valid()) { ret = OB_INVALID_ARGUMENT; @@ -2288,6 +2289,7 @@ int ObStorageHATabletBuilderUtil::build_tablet_with_major_tables( } else if (OB_FAIL(get_tablet_(tablet_id, ls, tablet_handle))) { LOG_WARN("failed to get tablet", K(ret), K(tablet_id), KPC(ls)); } else if (FALSE_IT(tablet = tablet_handle.get_obj())) { + } else if (FALSE_IT(transfer_seq = tablet->get_tablet_meta().transfer_info_.transfer_seq_)) { } else if (OB_FAIL(calc_multi_version_start_with_major_(major_tables, tablet, multi_version_start))) { LOG_WARN("failed to calc multi version start with major", K(ret), KPC(tablet)); } else if (OB_FAIL(major_tables.get_tables(major_table_array))) { @@ -2308,7 +2310,7 @@ int ObStorageHATabletBuilderUtil::build_tablet_with_major_tables( } else if (OB_FAIL(major_tables.get_table(table_ptr->get_key(), major_table_handle))) { LOG_WARN("fail to get table handle from array by table key", K(ret), KPC(table_ptr), K(major_tables)); } else if (OB_FAIL(inner_update_tablet_table_store_with_major_(multi_version_start, major_table_handle, - ls, tablet, storage_schema))) { + ls, tablet, storage_schema, transfer_seq))) { LOG_WARN("failed to update tablet table store", K(ret), K(tablet_id), KPC(table_ptr)); } } @@ -2368,7 +2370,8 @@ int ObStorageHATabletBuilderUtil::inner_update_tablet_table_store_with_major_( const ObTableHandleV2 &table_handle, ObLS *ls, ObTablet *tablet, - const ObStorageSchema &storage_schema) + const ObStorageSchema &storage_schema, + const int64_t transfer_seq) { int ret = OB_SUCCESS; ObTabletHandle tablet_handle; @@ -2396,6 +2399,8 @@ int ObStorageHATabletBuilderUtil::inner_update_tablet_table_store_with_major_( update_multi_version_start, &storage_schema, ls->get_rebuild_seq(), + true/*need_check_transfer_seq*/, + transfer_seq, true/*need_report*/, SCN::min_scn()/*clog_checkpoint_scn*/, true/*need_check_sstable*/, diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.h b/src/storage/high_availability/ob_storage_ha_tablet_builder.h index 16e3620f7e..147fa06194 100644 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.h +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.h @@ -336,7 +336,8 @@ private: const ObTableHandleV2 &table_handle, ObLS *ls, ObTablet *tablet, - const ObStorageSchema &storage_schema); + const ObStorageSchema &storage_schema, + const int64_t transfer_seq); static int inner_update_tablet_table_store_with_minor_( ObLS *ls, ObTablet *tablet, diff --git a/src/storage/high_availability/ob_tablet_backfill_tx.cpp b/src/storage/high_availability/ob_tablet_backfill_tx.cpp index 189c298e96..931f8b3610 100644 --- a/src/storage/high_availability/ob_tablet_backfill_tx.cpp +++ b/src/storage/high_availability/ob_tablet_backfill_tx.cpp @@ -757,7 +757,8 @@ ObTabletTableBackfillTXTask::ObTabletTableBackfillTXTask() param_(), allocator_("TableBackfillTX"), tablet_merge_ctx_(param_, allocator_), - merger_(nullptr) + merger_(nullptr), + transfer_seq_() { } @@ -793,6 +794,7 @@ int ObTabletTableBackfillTXTask::init( tablet_id_ = tablet_id; tablet_handle_ = tablet_handle; table_handle_ = table_handle; + transfer_seq_ = tablet_handle.get_obj()->get_tablet_meta().transfer_info_.transfer_seq_; is_inited_ = true; } return ret; @@ -967,6 +969,8 @@ int ObTabletTableBackfillTXTask::update_merge_sstable_() tablet_merge_ctx_.sstable_version_range_.multi_version_start_, tablet_merge_ctx_.schema_ctx_.storage_schema_, rebuild_seq, + true/*need_check_transfer_seq*/, + transfer_seq_, is_major_merge_type(tablet_merge_ctx_.param_.merge_type_), tablet_merge_ctx_.merged_sstable_.get_end_scn()); diff --git a/src/storage/high_availability/ob_tablet_backfill_tx.h b/src/storage/high_availability/ob_tablet_backfill_tx.h index b03cc81ce6..4d1a43d9c7 100644 --- a/src/storage/high_availability/ob_tablet_backfill_tx.h +++ b/src/storage/high_availability/ob_tablet_backfill_tx.h @@ -166,6 +166,7 @@ private: common::ObArenaAllocator allocator_; compaction::ObTabletMergeCtx tablet_merge_ctx_; compaction::ObPartitionMerger *merger_; + int64_t transfer_seq_; DISALLOW_COPY_AND_ASSIGN(ObTabletTableBackfillTXTask); }; diff --git a/src/storage/ob_storage_struct.cpp b/src/storage/ob_storage_struct.cpp index db54cf6538..964473de05 100644 --- a/src/storage/ob_storage_struct.cpp +++ b/src/storage/ob_storage_struct.cpp @@ -238,6 +238,8 @@ ObUpdateTableStoreParam::ObUpdateTableStoreParam( need_check_sstable_(false), ddl_info_(), allow_duplicate_sstable_(false), + need_check_transfer_seq_(false), + transfer_seq_(-1), tx_data_(), binding_info_(), autoinc_seq_(), @@ -252,6 +254,8 @@ ObUpdateTableStoreParam::ObUpdateTableStoreParam( const int64_t multi_version_start, const ObStorageSchema *storage_schema, const int64_t rebuild_seq, + const bool need_check_transfer_seq, + const int64_t transfer_seq, const bool need_report, const SCN clog_checkpoint_scn, const bool need_check_sstable, @@ -268,6 +272,8 @@ ObUpdateTableStoreParam::ObUpdateTableStoreParam( need_check_sstable_(need_check_sstable), ddl_info_(), allow_duplicate_sstable_(allow_duplicate_sstable), + need_check_transfer_seq_(need_check_transfer_seq), + transfer_seq_(transfer_seq), tx_data_(), binding_info_(), autoinc_seq_(), @@ -296,6 +302,8 @@ ObUpdateTableStoreParam::ObUpdateTableStoreParam( need_check_sstable_(false), ddl_info_(), allow_duplicate_sstable_(false), + need_check_transfer_seq_(false), + transfer_seq_(-1), tx_data_(), binding_info_(), autoinc_seq_(), @@ -306,12 +314,17 @@ ObUpdateTableStoreParam::ObUpdateTableStoreParam( bool ObUpdateTableStoreParam::is_valid() const { - return multi_version_start_ >= ObVersionRange::MIN_VERSION + bool bret = false; + bret = multi_version_start_ >= ObVersionRange::MIN_VERSION && snapshot_version_ >= ObVersionRange::MIN_VERSION && clog_checkpoint_scn_.is_valid() && nullptr != storage_schema_ && storage_schema_->is_valid() && rebuild_seq_ >= 0; + if (need_check_transfer_seq_) { + bret = bret && transfer_seq_ >= 0; + } + return bret; } diff --git a/src/storage/ob_storage_struct.h b/src/storage/ob_storage_struct.h index f24414ca70..74b5005801 100755 --- a/src/storage/ob_storage_struct.h +++ b/src/storage/ob_storage_struct.h @@ -310,6 +310,8 @@ struct ObUpdateTableStoreParam const int64_t multi_version_start, const ObStorageSchema *storage_schema, const int64_t rebuild_seq, + const bool need_check_transfer_seq, + const int64_t transfer_seq, const bool need_report = false, const share::SCN clog_checkpoint_scn = share::SCN::min_scn(), const bool need_check_sstable = false, @@ -330,7 +332,8 @@ struct ObUpdateTableStoreParam TO_STRING_KV(KP_(sstable), K_(snapshot_version), K_(clog_checkpoint_scn), K_(multi_version_start), K_(need_report), KPC_(storage_schema), K_(rebuild_seq), K_(update_with_major_flag), K_(need_check_sstable), K_(ddl_info), K_(allow_duplicate_sstable), - K_(tx_data), K_(binding_info), K_(autoinc_seq), "merge_type", merge_type_to_str(merge_type_)); + K_(tx_data), K_(binding_info), K_(autoinc_seq), "merge_type", merge_type_to_str(merge_type_), + K_(need_check_transfer_seq), K_(transfer_seq)); const blocksstable::ObSSTable *sstable_; int64_t snapshot_version_; @@ -343,6 +346,8 @@ struct ObUpdateTableStoreParam bool need_check_sstable_; ObDDLTableStoreParam ddl_info_; bool allow_duplicate_sstable_; + bool need_check_transfer_seq_; + int64_t transfer_seq_; // msd ObTabletTxMultiSourceDataUnit tx_data_; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 1246e2e09c..e63b273c37 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -294,6 +294,8 @@ int ObTablet::init( || OB_ISNULL(log_handler_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet pointer handle is invalid", K(ret), K_(pointer_hdl), K_(memtable_mgr), K_(log_handler)); + } else if (param.need_check_transfer_seq_ && OB_FAIL(check_transfer_seq_equal(old_tablet, param.transfer_seq_))) { + LOG_WARN("failed to check transfer seq eq", K(ret), K(old_tablet), K(param)); } else if (OB_FAIL(old_tablet.get_max_sync_storage_schema_version(max_sync_schema_version))) { LOG_WARN("failed to get max sync storage schema version", K(ret)); } else if (OB_FAIL(old_tablet.load_storage_schema(tmp_arena_allocator, old_storage_schema))) { @@ -6070,6 +6072,17 @@ int ObTablet::check_snapshot_readable(int64_t snapshot_version) return ret; } +int ObTablet::check_transfer_seq_equal(const ObTablet &old_tablet, const int64_t transfer_seq) +{ + int ret = OB_SUCCESS; + if (old_tablet.get_tablet_meta().transfer_info_.transfer_seq_ != transfer_seq) { + ret = OB_TABLET_TRANSFER_SEQ_NOT_MATCH; + LOG_WARN("old tablet transfer seq not eq with new transfer seq", + "old_tablet_meta", old_tablet.get_tablet_meta(), K(transfer_seq)); + } + return ret; +} + int ObTablet::set_ddl_info( const ObTabletBindingMdsUserData &ddl_info, mds::MdsCtx &ctx, diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index 6578a29cbe..86106487f3 100755 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -529,6 +529,7 @@ private: int get_tablet_memtable_mgr(ObTabletMemtableMgr *&memtable_mgr) const; int check_schema_version(const int64_t schema_version); int check_snapshot_readable(const int64_t snapshot_version); + int check_transfer_seq_equal(const ObTablet &old_tablet, const int64_t transfer_seq); logservice::ObLogHandler *get_log_handler() const { return log_handler_; } // TODO(bowen.gbw): get log handler from tablet pointer handle