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

gavinchou pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 645755cad6610270e5935f8dcaf5702e1232f65a
Author: Gavin Chou <gavineaglec...@gmail.com>
AuthorDate: Tue Sep 10 14:44:18 2024 +0800

    [opt](vault) Do not use latest_fs() in vault mode (#40516)
    
    To prevent incorrect storage backends selected by loading data, e.g.
    empty vault id passed from FE, we should not use latest_fs() in vault
    mode.
---
 be/src/cloud/cloud_meta_mgr.cpp                  |  8 ++++++--
 be/src/cloud/cloud_meta_mgr.h                    |  9 ++++++++-
 be/src/cloud/cloud_storage_engine.cpp            | 14 ++++++++++----
 cloud/src/meta-service/meta_service_resource.cpp |  2 ++
 gensrc/proto/cloud.proto                         |  1 +
 5 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp
index 8138ea52421..816f1108299 100644
--- a/be/src/cloud/cloud_meta_mgr.cpp
+++ b/be/src/cloud/cloud_meta_mgr.cpp
@@ -906,7 +906,7 @@ Status CloudMetaMgr::precommit_txn(const StreamLoadContext& 
ctx) {
     return retry_rpc("precommit txn", req, &res, 
&MetaService_Stub::precommit_txn);
 }
 
-Status CloudMetaMgr::get_storage_vault_info(StorageVaultInfos* vault_infos) {
+Status CloudMetaMgr::get_storage_vault_info(StorageVaultInfos* vault_infos, 
bool* is_vault_mode) {
     GetObjStoreInfoRequest req;
     GetObjStoreInfoResponse resp;
     req.set_cloud_unique_id(config::cloud_unique_id);
@@ -916,6 +916,8 @@ Status 
CloudMetaMgr::get_storage_vault_info(StorageVaultInfos* vault_infos) {
         return s;
     }
 
+    *is_vault_mode = resp.enable_storage_vault();
+
     auto add_obj_store = [&vault_infos](const auto& obj_store) {
         vault_infos->emplace_back(obj_store.id(), 
S3Conf::get_s3_conf(obj_store),
                                   StorageVaultPB_PathFormat {});
@@ -931,6 +933,7 @@ Status 
CloudMetaMgr::get_storage_vault_info(StorageVaultInfos* vault_infos) {
         }
     });
 
+    // desensitization, hide secret
     for (int i = 0; i < resp.obj_info_size(); ++i) {
         resp.mutable_obj_info(i)->set_sk(resp.obj_info(i).sk().substr(0, 2) + 
"xxx");
     }
@@ -940,7 +943,8 @@ Status 
CloudMetaMgr::get_storage_vault_info(StorageVaultInfos* vault_infos) {
         j->mutable_obj_info()->set_sk(j->obj_info().sk().substr(0, 2) + "xxx");
     }
 
-    LOG(INFO) << "get storage vault response: " << resp.ShortDebugString();
+    LOG(INFO) << "get storage vault, enable_storage_vault=" << is_vault_mode
+              << " response=" << resp.ShortDebugString();
     return Status::OK();
 }
 
diff --git a/be/src/cloud/cloud_meta_mgr.h b/be/src/cloud/cloud_meta_mgr.h
index 6f6cc9c26b4..2f776b05686 100644
--- a/be/src/cloud/cloud_meta_mgr.h
+++ b/be/src/cloud/cloud_meta_mgr.h
@@ -73,7 +73,14 @@ public:
 
     Status precommit_txn(const StreamLoadContext& ctx);
 
-    Status get_storage_vault_info(StorageVaultInfos* vault_infos);
+    /**
+     * Gets storage vault (storage backends) from meta-service
+     * 
+     * @param vault_info output param, all storage backends
+     * @param is_vault_mode output param, true for pure vault mode, false for 
legacy mode
+     * @return status
+     */
+    Status get_storage_vault_info(StorageVaultInfos* vault_infos, bool* 
is_vault_mode);
 
     Status prepare_tablet_job(const TabletJobInfoPB& job, 
StartTabletJobResponse* res);
 
diff --git a/be/src/cloud/cloud_storage_engine.cpp 
b/be/src/cloud/cloud_storage_engine.cpp
index 3e56c23d1d3..b98b2e3d0ef 100644
--- a/be/src/cloud/cloud_storage_engine.cpp
+++ b/be/src/cloud/cloud_storage_engine.cpp
@@ -161,8 +161,9 @@ struct RefreshFSVaultVisitor {
 
 Status CloudStorageEngine::open() {
     cloud::StorageVaultInfos vault_infos;
+    bool enable_storage_vault = false;
     do {
-        auto st = _meta_mgr->get_storage_vault_info(&vault_infos);
+        auto st = _meta_mgr->get_storage_vault_info(&vault_infos, 
&enable_storage_vault);
         if (st.ok()) {
             break;
         }
@@ -177,7 +178,11 @@ Status CloudStorageEngine::open() {
             return vault_process_error(id, vault_info, std::move(st));
         }
     }
-    set_latest_fs(get_filesystem(std::get<0>(vault_infos.back())));
+
+    // vault mode should not support latest_fs to get rid of unexpected 
storage backends choosen
+    if (!enable_storage_vault) {
+        set_latest_fs(get_filesystem(std::get<0>(vault_infos.back())));
+    }
 
     // TODO(plat1ko): DeleteBitmapTxnManager
 
@@ -340,7 +345,8 @@ void 
CloudStorageEngine::_check_file_cache_ttl_block_valid() {
 
 void CloudStorageEngine::sync_storage_vault() {
     cloud::StorageVaultInfos vault_infos;
-    auto st = _meta_mgr->get_storage_vault_info(&vault_infos);
+    bool enable_storage_vault = false;
+    auto st = _meta_mgr->get_storage_vault_info(&vault_infos, 
&enable_storage_vault);
     if (!st.ok()) {
         LOG(WARNING) << "failed to get storage vault info. err=" << st;
         return;
@@ -363,7 +369,7 @@ void CloudStorageEngine::sync_storage_vault() {
     }
 
     if (auto& id = std::get<0>(vault_infos.back());
-        latest_fs() == nullptr || latest_fs()->id() != id) {
+        (latest_fs() == nullptr || latest_fs()->id() != id) && 
!enable_storage_vault) {
         set_latest_fs(get_filesystem(id));
     }
 }
diff --git a/cloud/src/meta-service/meta_service_resource.cpp 
b/cloud/src/meta-service/meta_service_resource.cpp
index 90a88f86006..8a25a73771c 100644
--- a/cloud/src/meta-service/meta_service_resource.cpp
+++ b/cloud/src/meta-service/meta_service_resource.cpp
@@ -254,6 +254,8 @@ void 
MetaServiceImpl::get_obj_store_info(google::protobuf::RpcController* contro
         }
     }
 
+    response->set_enable_storage_vault(instance.enable_storage_vault());
+
     // Iterate all the resources to return to the rpc caller
     if (!instance.resource_ids().empty()) {
         std::string storage_vault_start = 
storage_vault_key({instance.instance_id(), ""});
diff --git a/gensrc/proto/cloud.proto b/gensrc/proto/cloud.proto
index b4c2d0d0968..268744a0088 100644
--- a/gensrc/proto/cloud.proto
+++ b/gensrc/proto/cloud.proto
@@ -895,6 +895,7 @@ message GetObjStoreInfoResponse {
     repeated StorageVaultPB storage_vault = 3;
     optional string default_storage_vault_id = 4;
     optional string default_storage_vault_name = 5;
+    optional bool enable_storage_vault = 6;
 };
 
 message CreateTabletsRequest {


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

Reply via email to