[CP] Bugfix: clustered index micro block re-wrote in different format

This commit is contained in:
ND501 2024-11-28 05:14:57 +00:00 committed by ob-robot
parent e4c2dcd570
commit d325ae35f9

View File

@ -461,13 +461,23 @@ int ObClusteredIndexBlockWriter::make_clustered_index_micro_block_with_rewrite(
} else if (OB_FAIL(idx_row_parser.init(rowkey_column_count, row))) {
LOG_WARN("fail to init idx row parser", K(ret), K(rowkey_column_count));
} else {
// TODO(baichangmin): data_store_desc or other ObDataStoreDesc?
ObIndexBlockRowDesc clustered_row_desc(*data_store_desc_);
// Actually, we only need `row_store_type` and `static_desc` from data store desc.
ObStaticDataStoreDesc rewrite_static_desc;
ObDataStoreDesc rewrite_data_store_desc;
if (OB_FAIL(rewrite_static_desc.assign(*(data_store_desc_->static_desc_)))) {
LOG_WARN("fail to assign static desc for rewrite desc", K(ret), KPC(data_store_desc_->static_desc_));
} else if (OB_FAIL(rewrite_data_store_desc.shallow_copy(*data_store_desc_))) {
LOG_WARN("fail to shallow copy for rewrite desc", K(ret), KPC(data_store_desc_));
} else {
rewrite_data_store_desc.static_desc_ = &rewrite_static_desc;
}
ObIndexBlockRowDesc clustered_row_desc(rewrite_data_store_desc);
// The following code needs to consider compatibility.
int64_t agg_row_size = 0;
const ObIndexBlockRowHeader *idx_row_header = nullptr;
if (OB_FAIL(idx_row_parser.get_header(idx_row_header))) {
if (OB_FAIL(ret)) {
} else if (OB_FAIL(idx_row_parser.get_header(idx_row_header))) {
LOG_WARN("fail to get idx row header", K(ret));
} else if (!idx_row_header->is_major_node() || !idx_row_header->is_pre_aggregated()) {
clustered_row_desc.serialized_agg_row_buf_ = nullptr;
@ -480,6 +490,20 @@ int ObClusteredIndexBlockWriter::make_clustered_index_micro_block_with_rewrite(
} else if (OB_FAIL(clustered_row_desc.row_key_.assign(row.storage_datums_, rowkey_column_count))) {
LOG_WARN("fail to assign rowkey to row_desc", K(ret), K(row), K(rowkey_column_count));
} else {
// The following items need to remain consistent with meta_to_row_desc.
rewrite_data_store_desc.row_store_type_ = idx_row_header->get_row_store_type();
rewrite_data_store_desc.static_desc_->compressor_type_ = idx_row_header->get_compressor_type();
rewrite_data_store_desc.static_desc_->master_key_id_ = idx_row_header->get_master_key_id();
rewrite_data_store_desc.static_desc_->encrypt_id_ = idx_row_header->get_encrypt_id();
MEMCPY(rewrite_data_store_desc.static_desc_->encrypt_key_,
idx_row_header->get_encrypt_key(),
sizeof(rewrite_data_store_desc.static_desc_->encrypt_key_));
rewrite_data_store_desc.static_desc_->schema_version_ = idx_row_header->get_schema_version();
if (idx_row_header->is_data_index() && !idx_row_header->is_major_node()) {
// Snapshot version should use data's value.
rewrite_data_store_desc.static_desc_->end_scn_.convert_for_tx(idx_row_parser.get_snapshot_version());
}
clustered_row_desc.is_serialized_agg_row_ = true;
clustered_row_desc.row_offset_ = idx_row_parser.get_row_offset();
clustered_row_desc.is_secondary_meta_ = false;
@ -575,11 +599,22 @@ int ObClusteredIndexBlockWriter::make_clustered_index_micro_block_with_reuse(
ObArenaAllocator row_key_allocator("MakeClustRK", MTL_ID());
while (OB_SUCC(ret)) {
row_key_allocator.reuse();
ObIndexBlockRowDesc clustered_row_desc(*data_store_desc_);
if (OB_FAIL(index_block_row_scanner.get_next(
index_info,
false /* is_multi_check */,
false /* is_sorted_multi_get */))) {
// Actually, we only need `row_store_type` and `static_desc` from data store desc.
ObStaticDataStoreDesc reuse_static_desc;
ObDataStoreDesc reuse_data_store_desc;
if (OB_FAIL(reuse_static_desc.assign(*(data_store_desc_->static_desc_)))) {
LOG_WARN("fail to assign static desc for rewrite desc", K(ret), KPC(data_store_desc_->static_desc_));
} else if (OB_FAIL(reuse_data_store_desc.shallow_copy(*data_store_desc_))) {
LOG_WARN("fail to shallow copy for rewrite desc", K(ret), KPC(data_store_desc_));
} else {
reuse_data_store_desc.static_desc_ = &reuse_static_desc;
}
ObIndexBlockRowDesc clustered_row_desc(reuse_data_store_desc);
if (OB_FAIL(ret)) {
} else if (OB_FAIL(index_block_row_scanner.get_next(index_info,
false /* is_multi_check */,
false /* is_sorted_multi_get */))) {
if (OB_ITER_END == ret) {
ret = OB_SUCCESS;
break;
@ -597,6 +632,20 @@ int ObClusteredIndexBlockWriter::make_clustered_index_micro_block_with_reuse(
clustered_row_desc.serialized_agg_row_buf_ = index_info.agg_row_buf_;
}
// The following items need to remain consistent with meta_to_row_desc.
reuse_data_store_desc.row_store_type_ = idx_row_header->get_row_store_type();
reuse_data_store_desc.static_desc_->compressor_type_ = idx_row_header->get_compressor_type();
reuse_data_store_desc.static_desc_->master_key_id_ = idx_row_header->get_master_key_id();
reuse_data_store_desc.static_desc_->encrypt_id_ = idx_row_header->get_encrypt_id();
MEMCPY(reuse_data_store_desc.static_desc_->encrypt_key_,
idx_row_header->get_encrypt_key(),
sizeof(reuse_data_store_desc.static_desc_->encrypt_key_));
reuse_data_store_desc.static_desc_->schema_version_ = idx_row_header->get_schema_version();
if (idx_row_header->is_data_index() && !idx_row_header->is_major_node()) {
// Snapshot version should use data's value.
reuse_data_store_desc.static_desc_->end_scn_.convert_for_tx(index_info.minor_meta_info_->snapshot_version_);
}
// Reuse, no need to change macro_id.
clustered_row_desc.macro_id_ = idx_row_header->get_macro_id();