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