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]