fix: [2.6]Ensure fulfill promise when CreateArrowFileSystem throw an exception (#44976)

issue: #44974 

master pr: #44975

---------

Signed-off-by: Cai Zhang <cai.zhang@zilliz.com>
This commit is contained in:
cai.zhang 2025-10-21 10:14:03 +08:00 committed by GitHub
parent 6476b1dbcf
commit 09880e8e6c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -33,12 +33,13 @@ StorageV2FSCache::Get(const Key& key) {
std::promise<milvus_storage::ArrowFileSystemPtr> p; std::promise<milvus_storage::ArrowFileSystemPtr> p;
std::shared_future<milvus_storage::ArrowFileSystemPtr> f = p.get_future(); std::shared_future<milvus_storage::ArrowFileSystemPtr> f = p.get_future();
auto iter = concurrent_map_.emplace(key, Value(std::move(p), f)); auto [iter, inserted] =
if (!iter.second) { concurrent_map_.emplace(key, Value(std::move(p), f));
return iter.first->second.second.get(); if (!inserted) {
return iter->second.second.get();
} }
// singleflight create fs for one key try {
milvus_storage::ArrowFileSystemConfig conf; milvus_storage::ArrowFileSystemConfig conf;
conf.address = std::string(key.address); conf.address = std::string(key.address);
conf.bucket_name = std::string(key.bucket_name); conf.bucket_name = std::string(key.bucket_name);
@ -57,17 +58,29 @@ StorageV2FSCache::Get(const Key& key) {
conf.request_timeout_ms = key.requestTimeoutMs; conf.request_timeout_ms = key.requestTimeoutMs;
conf.gcp_credential_json = std::string(key.gcp_credential_json); conf.gcp_credential_json = std::string(key.gcp_credential_json);
conf.use_custom_part_upload = key.use_custom_part_upload; conf.use_custom_part_upload = key.use_custom_part_upload;
auto result = milvus_storage::CreateArrowFileSystem(conf); auto result = milvus_storage::CreateArrowFileSystem(conf);
if (!result.ok()) { if (!result.ok()) {
iter.first->second.first.set_value(nullptr); iter->second.first.set_value(nullptr);
std::unique_lock lck(mutex_); std::unique_lock lck(mutex_);
concurrent_map_.unsafe_erase(iter.first); concurrent_map_.unsafe_erase(iter);
return nullptr; return nullptr;
} }
auto fs = result.value(); auto fs = result.value();
iter.first->second.first.set_value(fs); iter->second.first.set_value(fs);
return fs; return fs;
} catch (...) {
try {
iter->second.first.set_exception(std::current_exception());
} catch (...) {
}
std::unique_lock lck(mutex_);
concurrent_map_.unsafe_erase(iter);
return nullptr;
}
} }
} // namespace milvus::storage } // namespace milvus::storage