diff --git a/src/storage/blocksstable/ob_index_block_builder.cpp b/src/storage/blocksstable/ob_index_block_builder.cpp index 8ce0e988ca..23667c98e4 100644 --- a/src/storage/blocksstable/ob_index_block_builder.cpp +++ b/src/storage/blocksstable/ob_index_block_builder.cpp @@ -670,6 +670,7 @@ int ObSSTableIndexBuilder::merge_index_tree(ObSSTableMergeRes &res) } else { const int64_t curr_logical_version = index_store_desc_.get_logical_version(); ObIndexBlockRowDesc row_desc(data_desc); + ObLogicMacroBlockId prev_logic_id; for (int64_t i = 0; OB_SUCC(ret) && i < roots_.count(); ++i) { ObMacroMetasArray *macro_metas = roots_[i]->macro_metas_; for (int64_t j = 0; OB_SUCC(ret) && j < macro_metas->count(); ++j) { @@ -677,8 +678,15 @@ int ObSSTableIndexBuilder::merge_index_tree(ObSSTableMergeRes &res) if (OB_ISNULL(macro_meta)) { ret = OB_ERR_UNEXPECTED; STORAGE_LOG(WARN, "unexpected null macro meta", K(ret), K(j), KPC(roots_.at(i))); + } else if (OB_UNLIKELY(macro_meta->get_logic_id() == prev_logic_id)) { + // Since we rely on upper stream of sstable writing process to ensure the uniqueness of logic id + // and we don't want more additional memory/time consumption, we only check continuous ids here + ret = OB_ERR_UNEXPECTED; + STORAGE_LOG(ERROR, "unexpected duplicate logic macro id", K(ret), KPC(macro_meta), K(prev_logic_id)); } else if (OB_FAIL(index_builder_.append_row(*macro_meta, row_desc))) { STORAGE_LOG(WARN, "fail to append row", K(ret), KPC(macro_meta), K(j), KPC(roots_.at(i))); + } else { + prev_logic_id = macro_meta->get_logic_id(); } } }