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