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 55824a5afe5 [feat](cloud) get_tablet support versioned read (#54542)
55824a5afe5 is described below

commit 55824a5afe57800b5b0039508963c9b8266b2841
Author: walter <[email protected]>
AuthorDate: Mon Aug 11 20:00:01 2025 +0800

    [feat](cloud) get_tablet support versioned read (#54542)
---
 cloud/src/meta-service/meta_service.cpp         | 44 +++++++++++++++++++++++--
 cloud/test/meta_service_versioned_read_test.cpp | 35 ++++++++++++++++++++
 2 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/cloud/src/meta-service/meta_service.cpp 
b/cloud/src/meta-service/meta_service.cpp
index 4fcb92e5822..92e5566c451 100644
--- a/cloud/src/meta-service/meta_service.cpp
+++ b/cloud/src/meta-service/meta_service.cpp
@@ -1218,8 +1218,48 @@ void 
MetaServiceImpl::get_tablet(::google::protobuf::RpcController* controller,
         msg = "failed to init txn";
         return;
     }
-    internal_get_tablet(code, msg, instance_id, txn.get(), 
request->tablet_id(),
-                        response->mutable_tablet_meta(), false);
+    if (!is_version_read_enabled(instance_id)) {
+        internal_get_tablet(code, msg, instance_id, txn.get(), 
request->tablet_id(),
+                            response->mutable_tablet_meta(), false);
+        return;
+    }
+
+    MetaReader reader(instance_id, txn_kv_.get());
+    TabletMetaCloudPB tablet_meta;
+    err = reader.get_tablet_meta(txn.get(), request->tablet_id(), 
&tablet_meta, nullptr);
+    if (err != TxnErrorCode::TXN_OK) {
+        code = cast_as<ErrCategory::READ>(err);
+        msg = fmt::format("failed to get tablet meta, tablet_id={}, err={}", 
request->tablet_id(),
+                          err);
+        return;
+    }
+
+    if (tablet_meta.has_schema() &&
+        tablet_meta.schema().column_size() > 0) { // tablet meta saved before 
detach schema kv
+        tablet_meta.set_schema_version(tablet_meta.schema().schema_version());
+        return;
+    }
+
+    if (!tablet_meta.has_schema_version()) {
+        code = MetaServiceCode::INVALID_ARGUMENT;
+        msg = "tablet_meta must have either schema or schema_version";
+        response->mutable_tablet_meta()->Clear();
+        return;
+    }
+    auto key = meta_schema_key({instance_id, tablet_meta.index_id(), 
tablet_meta.schema_version()});
+    ValueBuf val_buf;
+    err = cloud::blob_get(txn.get(), key, &val_buf);
+    if (err != TxnErrorCode::TXN_OK) {
+        code = cast_as<ErrCategory::READ>(err);
+        msg = fmt::format("failed to get schema, err={}",
+                          err == TxnErrorCode::TXN_KEY_NOT_FOUND ? "not found" 
: "internal error");
+        return;
+    }
+    if (!parse_schema_value(val_buf, tablet_meta.mutable_schema())) {
+        code = MetaServiceCode::PROTOBUF_PARSE_ERR;
+        msg = fmt::format("malformed schema value, key={}", key);
+    }
+    response->mutable_tablet_meta()->Swap(&tablet_meta);
 }
 
 static void set_schema_in_existed_rowset(MetaServiceCode& code, std::string& 
msg, Transaction* txn,
diff --git a/cloud/test/meta_service_versioned_read_test.cpp 
b/cloud/test/meta_service_versioned_read_test.cpp
index e9077a6882e..b6b33dc35de 100644
--- a/cloud/test/meta_service_versioned_read_test.cpp
+++ b/cloud/test/meta_service_versioned_read_test.cpp
@@ -349,6 +349,41 @@ TEST(MetaServiceVersionedReadTest, 
BatchGetVersionFallback) {
     ASSERT_EQ(resp.versions_size(), N);
 }
 
+TEST(MetaServiceVersionedReadTest, GetTablet) {
+    auto service = get_meta_service(false);
+    std::string instance_id = "test_cloud_instance_id";
+
+    MOCK_GET_INSTANCE_ID(instance_id);
+    create_and_refresh_instance(service.get(), instance_id);
+
+    int64_t table_id = 2;
+    int64_t index_id = 3;
+    int64_t partition_id = 4;
+    int64_t tablet_id = 5;
+
+    // Create tablet
+    create_tablet(service.get(), table_id, index_id, partition_id, tablet_id);
+
+    {
+        // Get the tablet meta
+        brpc::Controller cntl;
+        GetTabletRequest req;
+        req.set_cloud_unique_id(fmt::format("1:{}:1", instance_id));
+        req.set_tablet_id(tablet_id);
+        GetTabletResponse resp;
+        service->get_tablet(&cntl, &req, &resp, nullptr);
+        ASSERT_EQ(resp.status().code(), MetaServiceCode::OK)
+                << " status is " << resp.status().DebugString();
+        ASSERT_EQ(resp.tablet_meta().table_id(), table_id);
+        ASSERT_EQ(resp.tablet_meta().index_id(), index_id);
+        ASSERT_EQ(resp.tablet_meta().partition_id(), partition_id);
+        ASSERT_EQ(resp.tablet_meta().tablet_id(), tablet_id);
+
+        // Verify the tablet schema
+        ASSERT_TRUE(resp.tablet_meta().has_schema());
+    }
+}
+
 TEST(MetaServiceVersionedReadTest, GetRowsetMetas) {
     auto service = get_meta_service(false);
     std::string instance_id = "test_cloud_instance_id";


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to