From 05432e67dd50d3c62f09dfa2ea0ac1d5881230c9 Mon Sep 17 00:00:00 2001 From: eldenmoon <15605149486@163.com> Date: Tue, 9 Jul 2024 15:31:06 +0800 Subject: [PATCH] [Fix](Variant) Schema should be updated when update_tmp_rowset in cloud mode 1. In cloud mode the updated rowset meta after `rowset->merge_rowset_meta` in `BaseTablet::update_delete_bitmap` will be lost in `update_tmp_rowset`.So in order to keep the latest schema we should keep schema in update_tmp_rowset 2. cloud tablet should also do copy_without_variant_extracted_columns --- be/src/cloud/cloud_meta_mgr.cpp | 7 ++++++- be/src/cloud/cloud_tablet.cpp | 7 +++++-- cloud/src/meta-service/meta_service.cpp | 5 ++++- regression-test/suites/variant_p0/delete_update.groovy | 4 +--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp index 732f3023e91982..ce40f7ed5391af 100644 --- a/be/src/cloud/cloud_meta_mgr.cpp +++ b/be/src/cloud/cloud_meta_mgr.cpp @@ -747,7 +747,12 @@ Status CloudMetaMgr::update_tmp_rowset(const RowsetMeta& rs_meta) { CreateRowsetResponse resp; req.set_cloud_unique_id(config::cloud_unique_id); - RowsetMetaPB rs_meta_pb = rs_meta.get_rowset_pb(true); + // Variant schema maybe updated, so we need to update the schema as well. + // The updated rowset meta after `rowset->merge_rowset_meta` in `BaseTablet::update_delete_bitmap` + // will be lost in `update_tmp_rowset` if skip_schema.So in order to keep the latest schema we should keep schema in update_tmp_rowset + // for variant type + bool skip_schema = rs_meta.tablet_schema()->num_variant_columns() == 0; + RowsetMetaPB rs_meta_pb = rs_meta.get_rowset_pb(skip_schema); doris_rowset_meta_to_cloud(req.mutable_rowset_meta(), std::move(rs_meta_pb)); Status st = retry_rpc("update committed rowset", req, &resp, &MetaService_Stub::update_tmp_rowset); diff --git a/be/src/cloud/cloud_tablet.cpp b/be/src/cloud/cloud_tablet.cpp index 5f77c7f44c1fcb..d2596d8a7d2d0c 100644 --- a/be/src/cloud/cloud_tablet.cpp +++ b/be/src/cloud/cloud_tablet.cpp @@ -427,8 +427,11 @@ Result> CloudTablet::create_transient_rowset_write RowsetWriterContext context; context.rowset_state = PREPARED; context.segments_overlap = OVERLAPPING; - context.tablet_schema = std::make_shared(); - context.tablet_schema->copy_from(*(rowset.tablet_schema())); + // During a partial update, the extracted columns of a variant should not be included in the tablet schema. + // This is because the partial update for a variant needs to ignore the extracted columns. + // Otherwise, the schema types in different rowsets might be inconsistent. When performing a partial update, + // the complete variant is constructed by reading all the sub-columns of the variant. + context.tablet_schema = rowset.tablet_schema()->copy_without_variant_extracted_columns(); context.newest_write_timestamp = UnixSeconds(); context.tablet_id = table_id(); context.enable_segcompaction = false; diff --git a/cloud/src/meta-service/meta_service.cpp b/cloud/src/meta-service/meta_service.cpp index 0bb1fb5f277c42..700ef57d3ac5eb 100644 --- a/cloud/src/meta-service/meta_service.cpp +++ b/cloud/src/meta-service/meta_service.cpp @@ -1216,7 +1216,10 @@ void MetaServiceImpl::update_tmp_rowset(::google::protobuf::RpcController* contr msg = fmt::format("failed to check whether rowset exists, err={}", err); return; } - + if (rowset_meta.has_variant_type_in_schema()) { + write_schema_dict(code, msg, instance_id, txn.get(), &rowset_meta); + if (code != MetaServiceCode::OK) return; + } DCHECK_GT(rowset_meta.txn_expiration(), 0); if (!rowset_meta.SerializeToString(&update_val)) { code = MetaServiceCode::PROTOBUF_SERIALIZE_ERR; diff --git a/regression-test/suites/variant_p0/delete_update.groovy b/regression-test/suites/variant_p0/delete_update.groovy index 2b126b4c3a6616..ae09fbc8878243 100644 --- a/regression-test/suites/variant_p0/delete_update.groovy +++ b/regression-test/suites/variant_p0/delete_update.groovy @@ -166,7 +166,5 @@ suite("regression_test_variant_delete_and_update", "variant_type"){ sql "sync" - if (!isCloudMode()) { - qt_sql """ select * from ${tableName} order by id;""" - } + qt_sql """ select * from ${tableName} order by id;""" } \ No newline at end of file