This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 78b9344d97f [opt](meta) Add strict field synchronization checks for 
cloud/non-cloud mode metadata conversions to prevent inconsistent PB bugs 
(#48837)
78b9344d97f is described below

commit 78b9344d97fea017e07068d895ca4dc89e923775
Author: Gavin Chou <ga...@selectdb.com>
AuthorDate: Sat Mar 15 12:14:05 2025 +0800

    [opt](meta) Add strict field synchronization checks for cloud/non-cloud 
mode metadata conversions to prevent inconsistent PB bugs (#48837)
    
    ### What problem does this PR solve?
    
    Before this PR, there were no unit tests for the interconversion between
    cloud and non-cloud modes of rowset meta, tablet schema, and tablet
    meta. Additionally, there was no strict validation mechanism to ensure
    synchronization across Protocol Buffer (PB) definitions, posing risks of
    critical bugs.
    With this PR, the aforementioned issues have been rigorously addressed
    through comprehensive unit test coverage and strict field
    synchronization checks.
    
    * Fix some missing fields for pb_convert
    * Add UT to prevent future missing fields
    * Add mechanism for cloud/non-cloud PB interconversion
---
 be/src/cloud/cloud_meta_mgr.cpp                    |  40 +-
 be/src/cloud/pb_convert.cpp                        | 118 +++---
 be/src/cloud/pb_convert.h                          |  12 +-
 be/src/olap/tablet_meta.cpp                        |   2 +-
 be/src/olap/tablet_schema.cpp                      |   8 +-
 be/src/olap/tablet_schema.h                        |   8 +-
 be/test/olap/pb_convert_test.cpp                   | 443 +++++++++++++++++++++
 cloud/src/meta-service/meta_service.cpp            |   4 -
 .../org/apache/doris/alter/CloudRollupJobV2.java   |   2 +-
 .../apache/doris/alter/CloudSchemaChangeJobV2.java |   1 -
 .../cloud/datasource/CloudInternalCatalog.java     |   4 +-
 gensrc/proto/olap_file.proto                       |  17 +-
 12 files changed, 569 insertions(+), 90 deletions(-)

diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp
index c7a86d19905..c3dba59cfa5 100644
--- a/be/src/cloud/cloud_meta_mgr.cpp
+++ b/be/src/cloud/cloud_meta_mgr.cpp
@@ -413,6 +413,39 @@ Status retry_rpc(std::string_view op_name, const Request& 
req, Response* res,
     return Status::RpcError("failed to {}: rpc timeout, last msg={}", op_name, 
error_msg);
 }
 
+static void fill_schema_with_dict(const RowsetMetaCloudPB& in, RowsetMetaPB* 
out,
+                                  const SchemaCloudDictionary& dict) {
+    std::unordered_map<int32_t, ColumnPB*> unique_id_map;
+    //init map
+    for (ColumnPB& column : *out->mutable_tablet_schema()->mutable_column()) {
+        unique_id_map[column.unique_id()] = &column;
+    }
+    // column info
+    for (int i = 0; i < in.schema_dict_key_list().column_dict_key_list_size(); 
++i) {
+        int dict_key = in.schema_dict_key_list().column_dict_key_list(i);
+        const ColumnPB& dict_val = dict.column_dict().at(dict_key);
+        ColumnPB& to_add = *out->mutable_tablet_schema()->add_column();
+        to_add = dict_val;
+        VLOG_DEBUG << "fill dict column " << dict_val.ShortDebugString();
+    }
+
+    // index info
+    for (int i = 0; i < 
in.schema_dict_key_list().index_info_dict_key_list_size(); ++i) {
+        int dict_key = in.schema_dict_key_list().index_info_dict_key_list(i);
+        const doris::TabletIndexPB& dict_val = dict.index_dict().at(dict_key);
+        *out->mutable_tablet_schema()->add_index() = dict_val;
+        VLOG_DEBUG << "fill dict index " << dict_val.ShortDebugString();
+    }
+
+    // sparse column info
+    for (int i = 0; i < 
in.schema_dict_key_list().sparse_column_dict_key_list_size(); ++i) {
+        int dict_key = 
in.schema_dict_key_list().sparse_column_dict_key_list(i);
+        const ColumnPB& dict_val = dict.column_dict().at(dict_key);
+        *unique_id_map.at(dict_val.parent_unique_id())->add_sparse_columns() = 
dict_val;
+        VLOG_DEBUG << "fill dict sparse column" << dict_val.ShortDebugString();
+    }
+}
+
 } // namespace
 
 Status CloudMetaMgr::get_tablet_meta(int64_t tablet_id, TabletMetaSharedPtr* 
tablet_meta) {
@@ -613,9 +646,10 @@ Status CloudMetaMgr::sync_tablet_rowsets(CloudTablet* 
tablet, bool warmup_delta_
                     meta_pb = 
cloud_rowset_meta_to_doris(copied_cloud_rs_meta_pb);
                 } else {
                     // Otherwise, use the schema dictionary from the response 
(if available).
-                    meta_pb = cloud_rowset_meta_to_doris(
-                            cloud_rs_meta_pb,
-                            resp.has_schema_dict() ? &resp.schema_dict() : 
nullptr);
+                    meta_pb = cloud_rowset_meta_to_doris(cloud_rs_meta_pb);
+                    if (resp.has_schema_dict()) {
+                        fill_schema_with_dict(cloud_rs_meta_pb, &meta_pb, 
resp.schema_dict());
+                    }
                 }
                 auto rs_meta = std::make_shared<RowsetMeta>();
                 rs_meta->init_from_pb(meta_pb);
diff --git a/be/src/cloud/pb_convert.cpp b/be/src/cloud/pb_convert.cpp
index 521729b44f6..17e23b3f2e9 100644
--- a/be/src/cloud/pb_convert.cpp
+++ b/be/src/cloud/pb_convert.cpp
@@ -73,6 +73,9 @@ void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, const 
RowsetMetaPB& in)
     if (in.has_tablet_schema()) {
         doris_tablet_schema_to_cloud(out->mutable_tablet_schema(), 
in.tablet_schema());
     }
+    if (in.has_schema_dict_key_list()) {
+        
out->mutable_schema_dict_key_list()->CopyFrom(in.schema_dict_key_list());
+    }
     out->set_txn_expiration(in.txn_expiration());
     out->set_segments_overlap_pb(in.segments_overlap_pb());
     out->mutable_segments_file_size()->CopyFrom(in.segments_file_size());
@@ -82,7 +85,7 @@ void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, const 
RowsetMetaPB& in)
         out->set_schema_version(in.schema_version());
     }
     out->set_enable_segments_file_size(in.enable_segments_file_size());
-    out->set_has_variant_type_in_schema(in.has_has_variant_type_in_schema());
+    out->set_has_variant_type_in_schema(in.has_variant_type_in_schema());
     
out->set_enable_inverted_index_file_info(in.enable_inverted_index_file_info());
     out->set_compaction_level(in.compaction_level());
     
out->mutable_inverted_index_file_info()->CopyFrom(in.inverted_index_file_info());
@@ -128,6 +131,9 @@ void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, 
RowsetMetaPB&& in) {
         doris_tablet_schema_to_cloud(out->mutable_tablet_schema(),
                                      std::move(*in.mutable_tablet_schema()));
     }
+    if (in.has_schema_dict_key_list()) {
+        
out->mutable_schema_dict_key_list()->Swap(in.mutable_schema_dict_key_list());
+    }
     out->set_txn_expiration(in.txn_expiration());
     out->set_segments_overlap_pb(in.segments_overlap_pb());
     out->mutable_segments_file_size()->Swap(in.mutable_segments_file_size());
@@ -145,54 +151,19 @@ void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, 
RowsetMetaPB&& in) {
     out->set_source_tablet_id(in.source_tablet_id());
 }
 
-static void fill_schema_with_dict(const RowsetMetaCloudPB& in, RowsetMetaPB* 
out,
-                                  const SchemaCloudDictionary& dict) {
-    std::unordered_map<int32_t, ColumnPB*> unique_id_map;
-    //init map
-    for (ColumnPB& column : *out->mutable_tablet_schema()->mutable_column()) {
-        unique_id_map[column.unique_id()] = &column;
-    }
-    // column info
-    for (size_t i = 0; i < 
in.schema_dict_key_list().column_dict_key_list_size(); ++i) {
-        int dict_key = in.schema_dict_key_list().column_dict_key_list(i);
-        const ColumnPB& dict_val = dict.column_dict().at(dict_key);
-        ColumnPB& to_add = *out->mutable_tablet_schema()->add_column();
-        to_add = dict_val;
-        VLOG_DEBUG << "fill dict column " << dict_val.ShortDebugString();
-    }
-
-    // index info
-    for (size_t i = 0; i < 
in.schema_dict_key_list().index_info_dict_key_list_size(); ++i) {
-        int dict_key = in.schema_dict_key_list().index_info_dict_key_list(i);
-        const TabletIndexPB& dict_val = dict.index_dict().at(dict_key);
-        *out->mutable_tablet_schema()->add_index() = dict_val;
-        VLOG_DEBUG << "fill dict index " << dict_val.ShortDebugString();
-    }
-
-    // sparse column info
-    for (size_t i = 0; i < 
in.schema_dict_key_list().sparse_column_dict_key_list_size(); ++i) {
-        int dict_key = 
in.schema_dict_key_list().sparse_column_dict_key_list(i);
-        const ColumnPB& dict_val = dict.column_dict().at(dict_key);
-        *unique_id_map.at(dict_val.parent_unique_id())->add_sparse_columns() = 
dict_val;
-        VLOG_DEBUG << "fill dict sparse column" << dict_val.ShortDebugString();
-    }
-}
-
-RowsetMetaPB cloud_rowset_meta_to_doris(const RowsetMetaCloudPB& in,
-                                        const SchemaCloudDictionary* dict) {
+RowsetMetaPB cloud_rowset_meta_to_doris(const RowsetMetaCloudPB& in) {
     RowsetMetaPB out;
-    cloud_rowset_meta_to_doris(&out, in, dict);
+    cloud_rowset_meta_to_doris(&out, in);
     return out;
 }
 
-RowsetMetaPB cloud_rowset_meta_to_doris(RowsetMetaCloudPB&& in, const 
SchemaCloudDictionary* dict) {
+RowsetMetaPB cloud_rowset_meta_to_doris(RowsetMetaCloudPB&& in) {
     RowsetMetaPB out;
-    cloud_rowset_meta_to_doris(&out, std::move(in), dict);
+    cloud_rowset_meta_to_doris(&out, std::move(in));
     return out;
 }
 
-void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const RowsetMetaCloudPB& in,
-                                const SchemaCloudDictionary* dict) {
+void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const RowsetMetaCloudPB& 
in) {
     // ATTN: please keep the set order aligned with the definition of proto 
`TabletSchemaCloudPB`.
     out->set_rowset_id(in.rowset_id());
     out->set_partition_id(in.partition_id());
@@ -227,8 +198,8 @@ void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const 
RowsetMetaCloudPB& in,
     if (in.has_tablet_schema()) {
         cloud_tablet_schema_to_doris(out->mutable_tablet_schema(), 
in.tablet_schema());
     }
-    if (dict != nullptr) {
-        fill_schema_with_dict(in, out, *dict);
+    if (in.has_schema_dict_key_list()) {
+        
out->mutable_schema_dict_key_list()->CopyFrom(in.schema_dict_key_list());
     }
     out->set_txn_expiration(in.txn_expiration());
     out->set_segments_overlap_pb(in.segments_overlap_pb());
@@ -239,6 +210,7 @@ void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const 
RowsetMetaCloudPB& in,
         out->set_schema_version(in.schema_version());
     }
     out->set_enable_segments_file_size(in.enable_segments_file_size());
+    out->set_has_variant_type_in_schema(in.has_variant_type_in_schema());
     
out->set_enable_inverted_index_file_info(in.enable_inverted_index_file_info());
     out->set_compaction_level(in.compaction_level());
     
out->mutable_inverted_index_file_info()->CopyFrom(in.inverted_index_file_info());
@@ -246,8 +218,7 @@ void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const 
RowsetMetaCloudPB& in,
     out->set_source_tablet_id(in.source_tablet_id());
 }
 
-void cloud_rowset_meta_to_doris(RowsetMetaPB* out, RowsetMetaCloudPB&& in,
-                                const SchemaCloudDictionary* dict) {
+void cloud_rowset_meta_to_doris(RowsetMetaPB* out, RowsetMetaCloudPB&& in) {
     // ATTN: please keep the set order aligned with the definition of proto 
`TabletSchemaCloudPB`.
     out->set_rowset_id(in.rowset_id());
     out->set_partition_id(in.partition_id());
@@ -283,8 +254,8 @@ void cloud_rowset_meta_to_doris(RowsetMetaPB* out, 
RowsetMetaCloudPB&& in,
         cloud_tablet_schema_to_doris(out->mutable_tablet_schema(),
                                      std::move(*in.mutable_tablet_schema()));
     }
-    if (dict != nullptr) {
-        fill_schema_with_dict(in, out, *dict);
+    if (in.has_schema_dict_key_list()) {
+        
out->mutable_schema_dict_key_list()->Swap(in.mutable_schema_dict_key_list());
     }
     out->set_txn_expiration(in.txn_expiration());
     out->set_segments_overlap_pb(in.segments_overlap_pb());
@@ -295,6 +266,7 @@ void cloud_rowset_meta_to_doris(RowsetMetaPB* out, 
RowsetMetaCloudPB&& in,
         out->set_schema_version(in.schema_version());
     }
     out->set_enable_segments_file_size(in.enable_segments_file_size());
+    out->set_has_variant_type_in_schema(in.has_variant_type_in_schema());
     
out->set_enable_inverted_index_file_info(in.enable_inverted_index_file_info());
     out->set_compaction_level(in.compaction_level());
     
out->mutable_inverted_index_file_info()->Swap(in.mutable_inverted_index_file_info());
@@ -340,9 +312,11 @@ void doris_tablet_schema_to_cloud(TabletSchemaCloudPB* 
out, const TabletSchemaPB
     out->set_is_dynamic_schema(in.is_dynamic_schema());
     
out->mutable_row_store_column_unique_ids()->CopyFrom(in.row_store_column_unique_ids());
     out->set_inverted_index_storage_format(in.inverted_index_storage_format());
-    out->set_enable_variant_flatten_nested(in.variant_enable_flatten_nested());
+    out->set_enable_variant_flatten_nested(in.enable_variant_flatten_nested());
     out->set_skip_bitmap_col_idx(in.skip_bitmap_col_idx());
     out->set_storage_page_size(in.storage_page_size());
+    out->set_is_in_memory(in.is_in_memory());
+    out->set_row_store_page_size(in.row_store_page_size());
 }
 
 void doris_tablet_schema_to_cloud(TabletSchemaCloudPB* out, TabletSchemaPB&& 
in) {
@@ -369,9 +343,11 @@ void doris_tablet_schema_to_cloud(TabletSchemaCloudPB* 
out, TabletSchemaPB&& in)
     out->set_is_dynamic_schema(in.is_dynamic_schema());
     
out->mutable_row_store_column_unique_ids()->Swap(in.mutable_row_store_column_unique_ids());
     out->set_inverted_index_storage_format(in.inverted_index_storage_format());
-    out->set_enable_variant_flatten_nested(in.variant_enable_flatten_nested());
+    out->set_enable_variant_flatten_nested(in.enable_variant_flatten_nested());
     out->set_skip_bitmap_col_idx(in.skip_bitmap_col_idx());
     out->set_storage_page_size(in.storage_page_size());
+    out->set_is_in_memory(in.is_in_memory());
+    out->set_row_store_page_size(in.row_store_page_size());
 }
 
 TabletSchemaPB cloud_tablet_schema_to_doris(const TabletSchemaCloudPB& in) {
@@ -411,9 +387,11 @@ void cloud_tablet_schema_to_doris(TabletSchemaPB* out, 
const TabletSchemaCloudPB
     out->set_is_dynamic_schema(in.is_dynamic_schema());
     
out->mutable_row_store_column_unique_ids()->CopyFrom(in.row_store_column_unique_ids());
     out->set_inverted_index_storage_format(in.inverted_index_storage_format());
-    out->set_variant_enable_flatten_nested(in.enable_variant_flatten_nested());
+    out->set_enable_variant_flatten_nested(in.enable_variant_flatten_nested());
     out->set_skip_bitmap_col_idx(in.skip_bitmap_col_idx());
     out->set_storage_page_size(in.storage_page_size());
+    out->set_is_in_memory(in.is_in_memory());
+    out->set_row_store_page_size(in.row_store_page_size());
 }
 
 void cloud_tablet_schema_to_doris(TabletSchemaPB* out, TabletSchemaCloudPB&& 
in) {
@@ -441,9 +419,11 @@ void cloud_tablet_schema_to_doris(TabletSchemaPB* out, 
TabletSchemaCloudPB&& in)
     out->set_is_dynamic_schema(in.is_dynamic_schema());
     
out->mutable_row_store_column_unique_ids()->Swap(in.mutable_row_store_column_unique_ids());
     out->set_inverted_index_storage_format(in.inverted_index_storage_format());
-    out->set_variant_enable_flatten_nested(in.enable_variant_flatten_nested());
+    out->set_enable_variant_flatten_nested(in.enable_variant_flatten_nested());
     out->set_skip_bitmap_col_idx(in.skip_bitmap_col_idx());
     out->set_storage_page_size(in.storage_page_size());
+    out->set_is_in_memory(in.is_in_memory());
+    out->set_row_store_page_size(in.row_store_page_size());
 }
 
 TabletMetaCloudPB doris_tablet_meta_to_cloud(const TabletMetaPB& in) {
@@ -477,7 +457,13 @@ void doris_tablet_meta_to_cloud(TabletMetaCloudPB* out, 
const TabletMetaPB& in)
             doris_rowset_meta_to_cloud(out->add_rs_metas(), rs_meta);
         }
     }
-    // ATTN: inc_rs_metas are deprecated, ignored here.
+    // ATTN: inc_rs_metas are deprecated, here is for conversion check
+    if (in.inc_rs_metas_size()) {
+        out->mutable_inc_rs_metas()->Reserve(in.inc_rs_metas_size());
+        for (const auto& rs_meta : in.inc_rs_metas()) {
+            doris_rowset_meta_to_cloud(out->add_inc_rs_metas(), rs_meta);
+        }
+    }
     if (in.has_alter_task()) {
         out->mutable_alter_task()->CopyFrom(in.alter_task());
     }
@@ -541,7 +527,15 @@ void doris_tablet_meta_to_cloud(TabletMetaCloudPB* out, 
TabletMetaPB&& in) {
             doris_rowset_meta_to_cloud(out->add_rs_metas(), 
std::move(*in.mutable_rs_metas(i)));
         }
     }
-    // ATTN: inc_rs_metas are deprecated, ignored here.
+    // ATTN: inc_rs_metas are deprecated, here is for conversion check
+    if (in.inc_rs_metas_size()) {
+        size_t rs_metas_size = in.inc_rs_metas_size();
+        out->mutable_inc_rs_metas()->Reserve(rs_metas_size);
+        for (size_t i = 0; i < rs_metas_size; ++i) {
+            doris_rowset_meta_to_cloud(out->add_inc_rs_metas(),
+                                       std::move(*in.mutable_inc_rs_metas(i)));
+        }
+    }
     if (in.has_alter_task()) {
         out->mutable_alter_task()->Swap(in.mutable_alter_task());
     }
@@ -618,7 +612,13 @@ void cloud_tablet_meta_to_doris(TabletMetaPB* out, const 
TabletMetaCloudPB& in)
             cloud_rowset_meta_to_doris(out->add_rs_metas(), rs_meta);
         }
     }
-    // ATTN: inc_rs_metas are deprecated, ignored here.
+    // ATTN: inc_rs_metas are deprecated, here is for conversion check
+    if (in.inc_rs_metas_size()) {
+        out->mutable_inc_rs_metas()->Reserve(in.inc_rs_metas_size());
+        for (const auto& rs_meta : in.inc_rs_metas()) {
+            cloud_rowset_meta_to_doris(out->add_inc_rs_metas(), rs_meta);
+        }
+    }
     if (in.has_alter_task()) {
         out->mutable_alter_task()->CopyFrom(in.alter_task());
     }
@@ -682,7 +682,15 @@ void cloud_tablet_meta_to_doris(TabletMetaPB* out, 
TabletMetaCloudPB&& in) {
             cloud_rowset_meta_to_doris(out->add_rs_metas(), 
std::move(*in.mutable_rs_metas(i)));
         }
     }
-    // ATTN: inc_rs_metas are deprecated, ignored here.
+    // ATTN: inc_rs_metas are deprecated, here is for conversion check
+    if (in.inc_rs_metas_size()) {
+        size_t rs_metas_size = in.inc_rs_metas_size();
+        out->mutable_inc_rs_metas()->Reserve(rs_metas_size);
+        for (size_t i = 0; i < rs_metas_size; i++) {
+            cloud_rowset_meta_to_doris(out->add_inc_rs_metas(),
+                                       std::move(*in.mutable_inc_rs_metas(i)));
+        }
+    }
     if (in.has_alter_task()) {
         out->mutable_alter_task()->Swap(in.mutable_alter_task());
     }
diff --git a/be/src/cloud/pb_convert.h b/be/src/cloud/pb_convert.h
index 31fe43adb11..0cfa033f293 100644
--- a/be/src/cloud/pb_convert.h
+++ b/be/src/cloud/pb_convert.h
@@ -24,14 +24,10 @@ RowsetMetaCloudPB doris_rowset_meta_to_cloud(const 
RowsetMetaPB&);
 RowsetMetaCloudPB doris_rowset_meta_to_cloud(RowsetMetaPB&&);
 void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, const RowsetMetaPB& 
in);
 void doris_rowset_meta_to_cloud(RowsetMetaCloudPB* out, RowsetMetaPB&& in);
-RowsetMetaPB cloud_rowset_meta_to_doris(const RowsetMetaCloudPB&,
-                                        const SchemaCloudDictionary* dict = 
nullptr);
-RowsetMetaPB cloud_rowset_meta_to_doris(RowsetMetaCloudPB&&,
-                                        const SchemaCloudDictionary* dict = 
nullptr);
-void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const RowsetMetaCloudPB& in,
-                                const SchemaCloudDictionary* dict = nullptr);
-void cloud_rowset_meta_to_doris(RowsetMetaPB* out, RowsetMetaCloudPB&& in,
-                                const SchemaCloudDictionary* dict = nullptr);
+RowsetMetaPB cloud_rowset_meta_to_doris(const RowsetMetaCloudPB&);
+RowsetMetaPB cloud_rowset_meta_to_doris(RowsetMetaCloudPB&&);
+void cloud_rowset_meta_to_doris(RowsetMetaPB* out, const RowsetMetaCloudPB& 
in);
+void cloud_rowset_meta_to_doris(RowsetMetaPB* out, RowsetMetaCloudPB&& in);
 
 // TabletSchemaPB <=> TabletSchemaCloudPB
 TabletSchemaCloudPB doris_tablet_schema_to_cloud(const TabletSchemaPB&);
diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp
index 08d774ce67d..bb03ceeef9b 100644
--- a/be/src/olap/tablet_meta.cpp
+++ b/be/src/olap/tablet_meta.cpp
@@ -325,7 +325,7 @@ TabletMeta::TabletMeta(int64_t table_id, int64_t 
partition_id, int64_t tablet_id
     }
 
     if (tablet_schema.__isset.variant_enable_flatten_nested) {
-        
schema->set_variant_enable_flatten_nested(tablet_schema.variant_enable_flatten_nested);
+        
schema->set_enable_variant_flatten_nested(tablet_schema.variant_enable_flatten_nested);
     }
 
     if (tablet_schema.__isset.enable_single_replica_compaction) {
diff --git a/be/src/olap/tablet_schema.cpp b/be/src/olap/tablet_schema.cpp
index 716711589ea..a2c4f29ce0d 100644
--- a/be/src/olap/tablet_schema.cpp
+++ b/be/src/olap/tablet_schema.cpp
@@ -1069,7 +1069,7 @@ void TabletSchema::init_from_pb(const TabletSchemaPB& 
schema, bool ignore_extrac
 
     
_row_store_column_unique_ids.assign(schema.row_store_column_unique_ids().begin(),
                                         
schema.row_store_column_unique_ids().end());
-    _variant_enable_flatten_nested = schema.variant_enable_flatten_nested();
+    _enable_variant_flatten_nested = schema.enable_variant_flatten_nested();
     _vl_field_mem_size += _row_store_column_unique_ids.capacity() * 
sizeof(int32_t);
     update_metadata_size();
 }
@@ -1139,7 +1139,7 @@ void TabletSchema::build_current_tablet_schema(int64_t 
index_id, int32_t version
     _sort_col_num = ori_tablet_schema.sort_col_num();
     _row_store_page_size = ori_tablet_schema.row_store_page_size();
     _storage_page_size = ori_tablet_schema.storage_page_size();
-    _variant_enable_flatten_nested = 
ori_tablet_schema.variant_flatten_nested();
+    _enable_variant_flatten_nested = 
ori_tablet_schema.variant_flatten_nested();
 
     // copy from table_schema_param
     _schema_version = version;
@@ -1304,7 +1304,7 @@ void TabletSchema::to_schema_pb(TabletSchemaPB* 
tablet_schema_pb) const {
     
tablet_schema_pb->set_inverted_index_storage_format(_inverted_index_storage_format);
     tablet_schema_pb->mutable_row_store_column_unique_ids()->Assign(
             _row_store_column_unique_ids.begin(), 
_row_store_column_unique_ids.end());
-    
tablet_schema_pb->set_variant_enable_flatten_nested(_variant_enable_flatten_nested);
+    
tablet_schema_pb->set_enable_variant_flatten_nested(_enable_variant_flatten_nested);
 }
 
 size_t TabletSchema::row_size() const {
@@ -1573,7 +1573,7 @@ bool operator==(const TabletSchema& a, const 
TabletSchema& b) {
     if (a._row_store_page_size != b._row_store_page_size) return false;
     if (a._storage_page_size != b._storage_page_size) return false;
     if (a._skip_write_index_on_load != b._skip_write_index_on_load) return 
false;
-    if (a._variant_enable_flatten_nested != b._variant_enable_flatten_nested) 
return false;
+    if (a._enable_variant_flatten_nested != b._enable_variant_flatten_nested) 
return false;
     return true;
 }
 
diff --git a/be/src/olap/tablet_schema.h b/be/src/olap/tablet_schema.h
index 957b9adb2b9..e5f5a4c348d 100644
--- a/be/src/olap/tablet_schema.h
+++ b/be/src/olap/tablet_schema.h
@@ -371,10 +371,10 @@ public:
         _disable_auto_compaction = disable_auto_compaction;
     }
     bool disable_auto_compaction() const { return _disable_auto_compaction; }
-    void set_variant_enable_flatten_nested(bool flatten_nested) {
-        _variant_enable_flatten_nested = flatten_nested;
+    void set_enable_variant_flatten_nested(bool flatten_nested) {
+        _enable_variant_flatten_nested = flatten_nested;
     }
-    bool variant_flatten_nested() const { return 
_variant_enable_flatten_nested; }
+    bool variant_flatten_nested() const { return 
_enable_variant_flatten_nested; }
     void set_enable_single_replica_compaction(bool 
enable_single_replica_compaction) {
         _enable_single_replica_compaction = enable_single_replica_compaction;
     }
@@ -594,7 +594,7 @@ private:
     // Contains column ids of which columns should be encoded into row store.
     // ATTN: For compability reason empty cids means all columns of tablet 
schema are encoded to row column
     std::vector<int32_t> _row_store_column_unique_ids;
-    bool _variant_enable_flatten_nested = false;
+    bool _enable_variant_flatten_nested = false;
     int64_t _vl_field_mem_size {0}; // variable length field
 };
 
diff --git a/be/test/olap/pb_convert_test.cpp b/be/test/olap/pb_convert_test.cpp
new file mode 100644
index 00000000000..9e03b023a4b
--- /dev/null
+++ b/be/test/olap/pb_convert_test.cpp
@@ -0,0 +1,443 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "cloud/pb_convert.h"
+
+#include <gen_cpp/olap_file.pb.h>
+
+#include <iostream>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "google/protobuf/message.h"
+#include "gtest/gtest.h"
+
+namespace doris {
+
+using namespace doris::cloud;
+using namespace google::protobuf;
+
+// RowsetMetaPB <=> RowsetMetaCloudPB
+// TabletSchemaPB <=> TabletSchemaCloudPB
+// TabletMetaPB <=> TabletMetaCloudPB
+
+// test if 2 PBs have the same declared fields: count and names.
+// note that reserved fields are not considered
+bool have_same_fields(const google::protobuf::Descriptor* desc1,
+                      const google::protobuf::Descriptor* desc2) {
+    if (desc1->field_count() != desc2->field_count()) {
+        return false;
+    }
+    std::set<std::string> fields1;
+    for (int i = 0; i < desc1->field_count(); ++i) {
+        fields1.insert(desc1->field(i)->name());
+    }
+    std::set<std::string> fields2;
+    for (int i = 0; i < desc2->field_count(); ++i) {
+        fields2.insert(desc2->field(i)->name());
+    }
+    return fields1 == fields2;
+}
+
+// traverse all fields of the given message clear them and set them to a 
default
+// value, after which, all has_xxx() function will return true;
+void set_all_fields_to_default(Message* message) {
+    const Descriptor* descriptor = message->GetDescriptor();
+    const Reflection* reflection = message->GetReflection();
+
+    // set scalar value to the field
+    auto set_scalar_type = [](Message* m, const FieldDescriptor* f, const 
Reflection* r) {
+        switch (f->cpp_type()) {
+        case FieldDescriptor::CPPTYPE_INT32:
+            r->SetInt32(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_INT64:
+            r->SetInt64(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_UINT32:
+            r->SetUInt32(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_UINT64:
+            r->SetUInt64(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_DOUBLE:
+            r->SetDouble(m, f, 0.0);
+            break;
+        case FieldDescriptor::CPPTYPE_FLOAT:
+            r->SetFloat(m, f, 0.0f);
+            break;
+        case FieldDescriptor::CPPTYPE_BOOL:
+            r->SetBool(m, f, false);
+            break;
+        case FieldDescriptor::CPPTYPE_ENUM:
+            r->SetEnum(m, f, f->enum_type()->value(0));
+            break;
+        case FieldDescriptor::CPPTYPE_STRING: {
+            const std::string empty_str;
+            r->SetString(m, f, empty_str);
+            break;
+        }
+        default:
+            EXPECT_TRUE(false) << "unexpected branch reached";
+            break;
+        }
+    };
+
+    // add a scalar value to the repeated field
+    auto add_scalar_type = [](Message* m, const FieldDescriptor* f, const 
Reflection* r) {
+        switch (f->cpp_type()) {
+        case FieldDescriptor::CPPTYPE_INT32:
+            r->AddInt32(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_INT64:
+            r->AddInt64(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_UINT32:
+            r->AddUInt32(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_UINT64:
+            r->AddUInt64(m, f, 0);
+            break;
+        case FieldDescriptor::CPPTYPE_DOUBLE:
+            r->AddDouble(m, f, 0.0);
+            break;
+        case FieldDescriptor::CPPTYPE_FLOAT:
+            r->AddFloat(m, f, 0.0f);
+            break;
+        case FieldDescriptor::CPPTYPE_BOOL:
+            r->AddBool(m, f, false);
+            break;
+        case FieldDescriptor::CPPTYPE_ENUM:
+            r->AddEnum(m, f, f->enum_type()->value(0));
+            break;
+        case FieldDescriptor::CPPTYPE_STRING: {
+            const std::string empty_str;
+            r->AddString(m, f, empty_str);
+            break;
+        }
+        default:
+            EXPECT_TRUE(false) << "unexpected branch reached";
+            break;
+        }
+    };
+
+    for (int i = 0; i < descriptor->field_count(); ++i) {
+        const FieldDescriptor* field = descriptor->field(i);
+        if (field->is_repeated()) { // add an element
+            reflection->ClearField(message, field);
+            if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+                [[maybe_unused]] Message* sub_message = 
reflection->AddMessage(message, field);
+                // the following has memory issue, however it is no need to 
set vaule
+                // set_all_fields_to_default(sub_message);
+            } else {
+                add_scalar_type(message, field, reflection);
+            }
+        } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+            Message* sub_message = reflection->MutableMessage(message, field);
+            set_all_fields_to_default(sub_message);
+        } else {
+            set_scalar_type(message, field, reflection);
+        }
+    }
+}
+
+// get all names of fields that are set, despite of the vaules, of the msg
+std::set<std::string> get_set_fields(const google::protobuf::Message& msg) {
+    std::set<std::string> set_fields;
+    const auto* descriptor = msg.GetDescriptor();
+    const auto* reflection = msg.GetReflection();
+    for (int i = 0; i < descriptor->field_count(); ++i) {
+        const auto* field = descriptor->field(i);
+        if (field->is_repeated()) {
+            if (reflection->FieldSize(msg, field) > 0) {
+                set_fields.insert(field->name());
+            }
+        } else {
+            if (reflection->HasField(msg, field)) {
+                set_fields.insert(field->name());
+            }
+        }
+    }
+    return set_fields;
+}
+
+// clang-format off
+
+auto print = [](auto v) { std::stringstream s; for (auto& i : v) s << i << " 
"; return s.str(); };
+auto set_diff = [](auto a, auto b) {
+    std::set<std::string> r;
+    std::set_difference(a.begin(), a.end(), b.begin(), b.end(), 
std::inserter(r, r.end()));
+    return r;
+};
+
+// ensure that PBs need to be converted have identical fields, so that they can
+// be inter-converted
+TEST(PbConvert, ensure_identical_fields) {
+    EXPECT_EQ(RowsetMetaPB::GetDescriptor()->field_count(), 
RowsetMetaCloudPB::GetDescriptor()->field_count());
+    EXPECT_EQ(TabletSchemaPB::GetDescriptor()->field_count(), 
TabletSchemaCloudPB::GetDescriptor()->field_count());
+    EXPECT_EQ(TabletMetaPB::GetDescriptor()->field_count(), 
TabletMetaCloudPB::GetDescriptor()->field_count());
+
+    EXPECT_TRUE(have_same_fields(RowsetMetaPB::GetDescriptor(), 
RowsetMetaCloudPB::GetDescriptor()));
+    EXPECT_TRUE(have_same_fields(TabletMetaPB::GetDescriptor(), 
TabletMetaCloudPB::GetDescriptor()));
+    EXPECT_TRUE(have_same_fields(TabletSchemaPB::GetDescriptor(), 
TabletSchemaCloudPB::GetDescriptor()));
+}
+
+TEST(PbConvert, ensure_all_fields_converted_correctly) {
+    // rowset meta
+    RowsetMetaPB rs;
+    set_all_fields_to_default(&rs);
+    auto rowset_meta_set_fields = get_set_fields(rs);
+    EXPECT_EQ(rowset_meta_set_fields.size(), 
RowsetMetaPB::GetDescriptor()->field_count()) << print(rowset_meta_set_fields);
+
+    RowsetMetaCloudPB rs_cloud;
+    set_all_fields_to_default(&rs_cloud);
+    auto rowset_meta_cloud_set_fields = get_set_fields(rs_cloud);
+    EXPECT_EQ(rowset_meta_cloud_set_fields.size(), 
RowsetMetaCloudPB::GetDescriptor()->field_count()) << 
print(rowset_meta_cloud_set_fields);
+    EXPECT_EQ(rowset_meta_set_fields.size(), 
rowset_meta_cloud_set_fields.size());
+
+    RowsetMetaCloudPB rowset_meta_cloud_out;
+    doris_rowset_meta_to_cloud(&rowset_meta_cloud_out, rs);
+    auto rowset_meta_cloud_out_set_fields = 
get_set_fields(rowset_meta_cloud_out);
+    EXPECT_EQ(rowset_meta_set_fields.size(), 
rowset_meta_cloud_out_set_fields.size())
+        << "doris_rowset_meta_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(rowset_meta_set_fields)
+        << "\n output_fields=" << print(rowset_meta_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(rowset_meta_set_fields, 
rowset_meta_cloud_out_set_fields));
+
+    RowsetMetaPB rowset_meta_out;
+    cloud_rowset_meta_to_doris(&rowset_meta_out, rs_cloud);
+    auto rowset_meta_out_set_fields = get_set_fields(rowset_meta_out);
+    EXPECT_EQ(rowset_meta_cloud_set_fields.size(), 
rowset_meta_out_set_fields.size())
+        << "cloud_rowset_meta_to_doris() missing output fields,"
+        << "\n input_fields=" << print(rowset_meta_cloud_set_fields)
+        << "\n output_fields=" << print(rowset_meta_out_set_fields)
+        << "\n diff=" << print(set_diff(rowset_meta_cloud_set_fields, 
rowset_meta_out_set_fields));
+
+    // tablet schema
+    TabletSchemaPB tablet_schema;
+    set_all_fields_to_default(&tablet_schema);
+    auto tablet_schema_set_fields = get_set_fields(tablet_schema);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
TabletSchemaPB::GetDescriptor()->field_count()) << 
print(tablet_schema_set_fields);
+
+    TabletSchemaCloudPB tablet_schema_cloud;
+    set_all_fields_to_default(&tablet_schema_cloud);
+    auto tablet_schema_cloud_set_fields = get_set_fields(tablet_schema_cloud);
+    EXPECT_EQ(tablet_schema_cloud_set_fields.size(), 
TabletSchemaCloudPB::GetDescriptor()->field_count()) << 
print(tablet_schema_cloud_set_fields);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_set_fields.size());
+
+    TabletSchemaCloudPB tablet_schema_cloud_out;
+    doris_tablet_schema_to_cloud(&tablet_schema_cloud_out, tablet_schema);
+    auto tablet_schema_cloud_out_set_fields = 
get_set_fields(tablet_schema_cloud_out);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_out_set_fields.size())
+        << "doris_tablet_schema_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_set_fields)
+        << "\n output_fields=" << print(tablet_schema_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_set_fields, 
tablet_schema_cloud_out_set_fields));
+
+    TabletSchemaPB tablet_schema_out;
+    cloud_tablet_schema_to_doris(&tablet_schema_out, tablet_schema_cloud);
+    auto tablet_schema_out_set_fields = get_set_fields(tablet_schema_out);
+    EXPECT_EQ(tablet_schema_cloud_set_fields.size(), 
tablet_schema_out_set_fields.size())
+        << "cloud_tablet_schema_to_doris() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_cloud_set_fields)
+        << "\n output_fields=" << print(tablet_schema_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_cloud_set_fields, 
tablet_schema_out_set_fields));
+
+    // tablet meta
+    TabletMetaPB tablet_meta;
+    set_all_fields_to_default(&tablet_meta);
+    auto tablet_meta_set_fields = get_set_fields(tablet_meta);
+    EXPECT_EQ(tablet_meta_set_fields.size(), 
TabletMetaPB::GetDescriptor()->field_count()) << print(tablet_meta_set_fields);
+    TabletMetaCloudPB tablet_meta_cloud;
+    set_all_fields_to_default(&tablet_meta_cloud);
+    auto tablet_meta_cloud_set_fields = get_set_fields(tablet_meta_cloud);
+    EXPECT_EQ(tablet_meta_cloud_set_fields.size(), 
TabletMetaCloudPB::GetDescriptor()->field_count()) << 
print(tablet_meta_cloud_set_fields);
+    EXPECT_EQ(tablet_meta_set_fields.size(), 
tablet_meta_cloud_set_fields.size());
+
+    TabletMetaCloudPB tablet_meta_cloud_out;
+    doris_tablet_meta_to_cloud(&tablet_meta_cloud_out, tablet_meta);
+    auto tablet_meta_cloud_out_set_fields = 
get_set_fields(tablet_meta_cloud_out);
+    EXPECT_EQ(tablet_meta_set_fields.size(), 
tablet_meta_cloud_out_set_fields.size())
+        << "doris_tablet_meta_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(tablet_meta_set_fields)
+        << "\n output_fields=" << print(tablet_meta_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_meta_set_fields, 
tablet_meta_cloud_out_set_fields));
+
+    TabletMetaPB tablet_meta_out;
+    cloud_tablet_meta_to_doris(&tablet_meta_out, tablet_meta_cloud);
+    auto tablet_meta_out_set_fields = get_set_fields(tablet_meta_out);
+    EXPECT_EQ(tablet_meta_cloud_set_fields.size(), 
tablet_meta_out_set_fields.size())
+        << "cloud_tablet_meta_to_doris() missing output fields,"
+        << "\n input_fields=" << print(tablet_meta_cloud_set_fields)
+        << "\n output_fields=" << print(tablet_meta_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_meta_cloud_set_fields, 
tablet_meta_out_set_fields));
+}
+
+TEST(PbConvert, test_rvalue_overloads) {
+    // rowset meta
+    RowsetMetaPB rs;
+    set_all_fields_to_default(&rs);
+    auto rs_set_fields = get_set_fields(rs);
+
+    RowsetMetaCloudPB rs_cloud;
+    set_all_fields_to_default(&rs_cloud);
+    auto rs_cloud_set_fields = get_set_fields(rs_cloud);
+    EXPECT_EQ(rs_set_fields.size(), rs_cloud_set_fields.size());
+
+    RowsetMetaCloudPB rs_cloud_out;
+    rs_cloud_out = doris_rowset_meta_to_cloud(std::move(rs));
+    auto rs_cloud_out_set_fields = get_set_fields(rs_cloud_out);
+    EXPECT_EQ(rs_set_fields.size(), rs_cloud_out_set_fields.size())
+        << "doris_rowset_meta_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(rs_set_fields)
+        << "\n output_fields=" << print(rs_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(rs_set_fields, 
rs_cloud_out_set_fields));
+
+    RowsetMetaPB rs_out;
+    rs_out = cloud_rowset_meta_to_doris(std::move(rs_cloud));
+    auto rs_out_set_fields = get_set_fields(rs_out);
+    EXPECT_EQ(rs_cloud_set_fields.size(), rs_out_set_fields.size())
+        << "cloud_rowset_meta_to_doris() missing output fields,"
+        << "\n input_fields=" << print(rs_cloud_set_fields)
+        << "\n output_fields=" << print(rs_out_set_fields)
+        << "\n diff=" << print(set_diff(rs_cloud_set_fields, 
rs_out_set_fields));
+
+    // tablet schema
+    TabletSchemaPB tablet_schema;
+    set_all_fields_to_default(&tablet_schema);
+    auto tablet_schema_set_fields = get_set_fields(tablet_schema);
+
+    TabletSchemaCloudPB tablet_schema_cloud;
+    set_all_fields_to_default(&tablet_schema_cloud);
+    auto tablet_schema_cloud_set_fields = get_set_fields(tablet_schema_cloud);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_set_fields.size());
+
+    TabletSchemaCloudPB tablet_schema_cloud_out;
+    tablet_schema_cloud_out = 
doris_tablet_schema_to_cloud(std::move(tablet_schema));
+    auto tablet_schema_cloud_out_set_fields = 
get_set_fields(tablet_schema_cloud_out);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_out_set_fields.size())
+        << "doris_tablet_schema_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_set_fields)
+        << "\n output_fields=" << print(tablet_schema_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_set_fields, 
tablet_schema_cloud_out_set_fields));
+
+    TabletSchemaPB tablet_schema_out;
+    tablet_schema_out = 
cloud_tablet_schema_to_doris(std::move(tablet_schema_cloud));
+    auto tablet_schema_out_set_fields = get_set_fields(tablet_schema_out);
+    EXPECT_EQ(tablet_schema_cloud_set_fields.size(), 
tablet_schema_out_set_fields.size())
+        << "cloud_tablet_schema_to_doris() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_cloud_set_fields)
+        << "\n output_fields=" << print(tablet_schema_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_cloud_set_fields, 
tablet_schema_out_set_fields));
+
+    // tablet meta
+    TabletMetaPB tablet_meta;
+    set_all_fields_to_default(&tablet_meta);
+    auto tablet_meta_set_fields = get_set_fields(tablet_meta);
+
+    TabletMetaCloudPB tablet_meta_cloud;
+    set_all_fields_to_default(&tablet_meta_cloud);
+    auto tablet_meta_cloud_set_fields = get_set_fields(tablet_meta_cloud);
+    EXPECT_EQ(tablet_meta_set_fields.size(), 
tablet_meta_cloud_set_fields.size());
+
+    TabletMetaCloudPB tablet_meta_cloud_out;
+    tablet_meta_cloud_out = doris_tablet_meta_to_cloud(std::move(tablet_meta));
+    auto tablet_meta_cloud_out_set_fields = 
get_set_fields(tablet_meta_cloud_out);
+    EXPECT_EQ(tablet_meta_set_fields.size(), 
tablet_meta_cloud_out_set_fields.size())
+        << "doris_tablet_meta_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(tablet_meta_set_fields)
+        << "\n output_fields=" << print(tablet_meta_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_meta_set_fields, 
tablet_meta_cloud_out_set_fields));
+
+    TabletMetaPB tablet_meta_out;
+    tablet_meta_out = cloud_tablet_meta_to_doris(std::move(tablet_meta_cloud));
+    auto tablet_meta_out_set_fields = get_set_fields(tablet_meta_out);
+    EXPECT_EQ(tablet_meta_cloud_set_fields.size(), 
tablet_meta_out_set_fields.size())
+        << "cloud_tablet_meta_to_doris() missing output fields,"
+        << "\n input_fields=" << print(tablet_meta_cloud_set_fields)
+        << "\n output_fields=" << print(tablet_meta_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_meta_cloud_set_fields, 
tablet_meta_out_set_fields));
+}
+
+TEST(PbConvert, test_return_value_overloads) {
+    // rowset meta
+    RowsetMetaPB rs;
+    set_all_fields_to_default(&rs);
+    auto rs_set_fields = get_set_fields(rs);
+    EXPECT_EQ(rs_set_fields.size(), 
RowsetMetaPB::GetDescriptor()->field_count());
+
+    RowsetMetaCloudPB rs_cloud;
+    set_all_fields_to_default(&rs_cloud);
+    auto rs_cloud_set_fields = get_set_fields(rs_cloud);
+    EXPECT_EQ(rs_cloud_set_fields.size(), 
RowsetMetaCloudPB::GetDescriptor()->field_count());
+    EXPECT_EQ(rs_set_fields.size(), rs_cloud_set_fields.size());
+
+    RowsetMetaCloudPB rs_cloud_out;
+    rs_cloud_out = doris_rowset_meta_to_cloud(std::move(rs));
+    auto rs_cloud_out_set_fields = get_set_fields(rs_cloud_out);
+    EXPECT_EQ(rs_set_fields.size(), rs_cloud_out_set_fields.size())
+        << "doris_rowset_meta_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(rs_set_fields)
+        << "\n output_fields=" << print(rs_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(rs_set_fields, 
rs_cloud_out_set_fields));
+
+    RowsetMetaPB rs_out;
+    rs_out = cloud_rowset_meta_to_doris(std::move(rs_cloud));
+    auto rs_out_set_fields = get_set_fields(rs_out);
+    EXPECT_EQ(rs_cloud_set_fields.size(), rs_out_set_fields.size())
+        << "cloud_rowset_meta_to_doris() missing output fields,"
+        << "\n input_fields=" << print(rs_cloud_set_fields)
+        << "\n output_fields=" << print(rs_out_set_fields)
+        << "\n diff=" << print(set_diff(rs_cloud_set_fields, 
rs_out_set_fields));
+
+    // tablet schema
+    TabletSchemaPB tablet_schema;
+    set_all_fields_to_default(&tablet_schema);
+    auto tablet_schema_set_fields = get_set_fields(tablet_schema);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
TabletSchemaPB::GetDescriptor()->field_count());
+
+    TabletSchemaCloudPB tablet_schema_cloud;
+    set_all_fields_to_default(&tablet_schema_cloud);
+    auto tablet_schema_cloud_set_fields = get_set_fields(tablet_schema_cloud);
+    EXPECT_EQ(tablet_schema_cloud_set_fields.size(), 
TabletSchemaCloudPB::GetDescriptor()->field_count());
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_set_fields.size());
+
+    TabletSchemaCloudPB tablet_schema_cloud_out;
+    tablet_schema_cloud_out = 
doris_tablet_schema_to_cloud(std::move(tablet_schema));
+    auto tablet_schema_cloud_out_set_fields = 
get_set_fields(tablet_schema_cloud_out);
+    EXPECT_EQ(tablet_schema_set_fields.size(), 
tablet_schema_cloud_out_set_fields.size())
+        << "doris_tablet_schema_to_cloud() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_set_fields)
+        << "\n output_fields=" << print(tablet_schema_cloud_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_set_fields, 
tablet_schema_cloud_out_set_fields));
+
+    TabletSchemaPB tablet_schema_out;
+    tablet_schema_out = 
cloud_tablet_schema_to_doris(std::move(tablet_schema_cloud));
+    auto tablet_schema_out_set_fields = get_set_fields(tablet_schema_out);
+    EXPECT_EQ(tablet_schema_cloud_set_fields.size(), 
tablet_schema_out_set_fields.size())
+        << "cloud_tablet_schema_to_doris() missing output fields,"
+        << "\n input_fields=" << print(tablet_schema_cloud_set_fields)
+        << "\n output_fields=" << print(tablet_schema_out_set_fields)
+        << "\n diff=" << print(set_diff(tablet_schema_cloud_set_fields, 
tablet_schema_out_set_fields));
+}
+
+// clang-format on
+
+} // namespace doris
+
+// vim: et tw=80 ts=4 sw=4 cc=80:
diff --git a/cloud/src/meta-service/meta_service.cpp 
b/cloud/src/meta-service/meta_service.cpp
index 6ceee180939..21e70d8b99e 100644
--- a/cloud/src/meta-service/meta_service.cpp
+++ b/cloud/src/meta-service/meta_service.cpp
@@ -750,10 +750,6 @@ void 
MetaServiceImpl::update_tablet(::google::protobuf::RpcController* controlle
             tablet_meta.set_is_persistent(tablet_meta_info.is_persistent());
         } else if (tablet_meta_info.has_ttl_seconds()) {
             tablet_meta.set_ttl_seconds(tablet_meta_info.ttl_seconds());
-        } else if (tablet_meta_info.has_group_commit_interval_ms()) {
-            
tablet_meta.set_group_commit_interval_ms(tablet_meta_info.group_commit_interval_ms());
-        } else if (tablet_meta_info.has_group_commit_data_bytes()) {
-            
tablet_meta.set_group_commit_data_bytes(tablet_meta_info.group_commit_data_bytes());
         } else if (tablet_meta_info.has_compaction_policy()) {
             
tablet_meta.set_compaction_policy(tablet_meta_info.compaction_policy());
         } else if 
(tablet_meta_info.has_time_series_compaction_goal_size_mbytes()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/alter/CloudRollupJobV2.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/CloudRollupJobV2.java
index 37638319e3f..7d4338322c6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/CloudRollupJobV2.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/CloudRollupJobV2.java
@@ -230,7 +230,7 @@ public class CloudRollupJobV2 extends RollupJobV2 {
                                     
tbl.getTimeSeriesCompactionLevelThreshold(),
                                     tbl.disableAutoCompaction(),
                                     
tbl.getRowStoreColumnsUniqueIds(rowStoreColumns),
-                                    tbl.getEnableMowLightDelete(), null,
+                                    null,
                                     tbl.rowStorePageSize(),
                                     tbl.variantEnableFlattenNested(), null,
                                     tbl.storagePageSize());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/alter/CloudSchemaChangeJobV2.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/CloudSchemaChangeJobV2.java
index f765dd1bb7f..549fd693f9e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/alter/CloudSchemaChangeJobV2.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/alter/CloudSchemaChangeJobV2.java
@@ -274,7 +274,6 @@ public class CloudSchemaChangeJobV2 extends 
SchemaChangeJobV2 {
                                             
tbl.getTimeSeriesCompactionLevelThreshold(),
                                             tbl.disableAutoCompaction(),
                                             
tbl.getRowStoreColumnsUniqueIds(rowStoreColumns),
-                                            tbl.getEnableMowLightDelete(),
                                             
tbl.getInvertedIndexFileStorageFormat(),
                                             tbl.rowStorePageSize(),
                                             tbl.variantEnableFlattenNested(), 
clusterKeyUids,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/datasource/CloudInternalCatalog.java
 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/datasource/CloudInternalCatalog.java
index ed7ce0dc4b5..9683af4b672 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/datasource/CloudInternalCatalog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/datasource/CloudInternalCatalog.java
@@ -179,7 +179,6 @@ public class CloudInternalCatalog extends InternalCatalog {
                         tbl.getTimeSeriesCompactionLevelThreshold(),
                         tbl.disableAutoCompaction(),
                         tbl.getRowStoreColumnsUniqueIds(rowStoreColumns),
-                        tbl.getEnableMowLightDelete(),
                         tbl.getInvertedIndexFileStorageFormat(),
                         tbl.rowStorePageSize(),
                         tbl.variantEnableFlattenNested(), clusterKeyUids,
@@ -213,7 +212,7 @@ public class CloudInternalCatalog extends InternalCatalog {
             Long timeSeriesCompactionGoalSizeMbytes, Long 
timeSeriesCompactionFileCountThreshold,
             Long timeSeriesCompactionTimeThresholdSeconds, Long 
timeSeriesCompactionEmptyRowsetsThreshold,
             Long timeSeriesCompactionLevelThreshold, boolean 
disableAutoCompaction,
-            List<Integer> rowStoreColumnUniqueIds, boolean 
enableMowLightDelete,
+            List<Integer> rowStoreColumnUniqueIds,
             TInvertedIndexFileStorageFormat invertedIndexFileStorageFormat, 
long pageSize,
             boolean variantEnableFlattenNested, List<Integer> clusterKeyUids,
             long storagePageSize) throws DdlException {
@@ -338,7 +337,6 @@ public class CloudInternalCatalog extends InternalCatalog {
             
schemaBuilder.addAllRowStoreColumnUniqueIds(rowStoreColumnUniqueIds);
         }
         schemaBuilder.setDisableAutoCompaction(disableAutoCompaction);
-        schemaBuilder.setEnableMowLightDelete(enableMowLightDelete);
 
         if (invertedIndexFileStorageFormat != null) {
             if (invertedIndexFileStorageFormat == 
TInvertedIndexFileStorageFormat.V1) {
diff --git a/gensrc/proto/olap_file.proto b/gensrc/proto/olap_file.proto
index 3bd76279b45..d831eb085c7 100644
--- a/gensrc/proto/olap_file.proto
+++ b/gensrc/proto/olap_file.proto
@@ -137,6 +137,7 @@ message RowsetMetaPB {
 
     optional bool enable_inverted_index_file_info = 1006;
     repeated InvertedIndexFileInfo inverted_index_file_info = 1007;
+    optional SchemaDictKeyList schema_dict_key_list = 1008; // align to cloud 
rowset
 }
 
 message SchemaDictKeyList {
@@ -383,6 +384,7 @@ message TabletSchemaPB {
     optional CompressKind compress_kind = 5; // OLAPHeaderMessage.compress_kind
     optional double bf_fpp = 6; // OLAPHeaderMessage.bf_fpp
     optional uint32 next_column_unique_id = 7; // 
OLAPHeaderMessage.next_column_unique_id
+    // FIXME(gavin): deprecate and remove in the future
     optional bool is_in_memory = 8 [default=false];
     optional int32 delete_sign_idx = 9 [default = -1];
     optional int32 sequence_col_idx = 10 [default= -1];
@@ -395,8 +397,8 @@ message TabletSchemaPB {
     optional int32 version_col_idx = 17 [default = -1];
     optional bool store_row_column = 18 [default=false]; // store tuplerow 
oriented column
     optional bool is_dynamic_schema = 19 [default=false]; // deprecated
-    optional bool is_partial_update = 20 [default=false]; // deprecated
-    repeated string partial_update_input_columns = 21; // deprecated
+    reserved 20; // deprecated is_partial_update
+    reserved 21; // deprecated partial_update_input_columns
     optional bool enable_single_replica_compaction = 22 [default=false];
     optional bool skip_write_index_on_load = 23 [default=false];
     repeated int32 cluster_key_uids = 24;
@@ -405,7 +407,7 @@ message TabletSchemaPB {
     repeated int32 row_store_column_unique_ids = 26;
     optional int64 row_store_page_size = 27 [default=16384];
 
-    optional bool variant_enable_flatten_nested = 28 [default=false];
+    optional bool enable_variant_flatten_nested = 28 [default=false];
     optional int32 skip_bitmap_col_idx = 29 [default = -1];
     optional int64 storage_page_size = 30 [default=65536];
 }
@@ -437,12 +439,15 @@ message TabletSchemaCloudPB {
     // column unique ids for row store columns
     repeated int32 row_store_column_unique_ids = 26;
     optional int64 row_store_page_size = 27 [default=16384];
-    optional bool enable_mow_light_delete = 28 [default=false];
+    reserved 28; // deprecated enable_mow_light_delete
     optional bool enable_variant_flatten_nested = 29 [default=false];
     optional int32 skip_bitmap_col_idx = 30 [default = -1];
     optional int64 storage_page_size = 31 [default=65536];
 
     optional bool is_dynamic_schema = 100 [default=false];
+
+    // FIXME(gavin): deprecate and remove in the future
+    optional bool is_in_memory = 200 [default=false]; // unused, just keep 
align to TabletSchemaPB
 }
 
 enum TabletStatePB {
@@ -578,8 +583,8 @@ message TabletMetaCloudPB {
     optional int64 time_series_compaction_goal_size_mbytes = 32 [default = 
1024];
     optional int64 time_series_compaction_file_count_threshold = 33 [default = 
2000];
     optional int64 time_series_compaction_time_threshold_seconds = 34 [default 
= 3600];
-    optional int64 group_commit_interval_ms = 35 [default = 10000];
-    optional int64 group_commit_data_bytes = 36 [default = 134217728];
+    reserved 35; // deprecated group_commit_interval_ms
+    reserved 36; // deprecated group_commit_data_bytes
     optional int64 time_series_compaction_empty_rowsets_threshold = 37 
[default = 5];
     optional int64 time_series_compaction_level_threshold = 38 [default = 1];
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to