Skip to content

Commit e740606

Browse files
committed
fix: deadlock in inner_write_threshold_keys
1 parent ce69b55 commit e740606

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

core/service/src/vault/storage/crypto_material/threshold.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,29 @@ impl<PubS: Storage + Send + Sync + 'static, PrivS: StorageExt + Send + Sync + 's
116116
let mut guarded_meta_storage = meta_store.write().await;
117117

118118
// Step 1: Serialize server_key to public storage FIRST (before consuming it)
119-
let mut pub_storage = self.inner.public_storage.lock().await;
120-
let server_result = store_versioned_at_request_id(
121-
&mut (*pub_storage),
122-
key_id,
123-
&fhe_key_set.server_key,
124-
&PubDataType::ServerKey.to_string(),
125-
)
126-
.await;
127-
128-
if let Err(e) = &server_result {
129-
tracing::error!("Failed to store server key for request {}: {}", key_id, e);
130-
} else {
131-
log_storage_success(
119+
let server_result = {
120+
let mut pub_storage = self.inner.public_storage.lock().await;
121+
let result = store_versioned_at_request_id(
122+
&mut (*pub_storage),
132123
key_id,
133-
pub_storage.info(),
124+
&fhe_key_set.server_key,
134125
&PubDataType::ServerKey.to_string(),
135-
true,
136-
true,
137-
);
138-
}
126+
)
127+
.await;
128+
129+
if let Err(e) = &result {
130+
tracing::error!("Failed to store server key for request {}: {}", key_id, e);
131+
} else {
132+
log_storage_success(
133+
key_id,
134+
pub_storage.info(),
135+
&PubDataType::ServerKey.to_string(),
136+
true,
137+
true,
138+
);
139+
}
140+
result
141+
}; // pub_storage lock released here
139142

140143
// Step 2: Consume server_key to extract components
141144
let (
@@ -160,6 +163,7 @@ impl<PubS: Storage + Send + Sync + 'static, PrivS: StorageExt + Send + Sync + 's
160163

161164
// Step 4: Run remaining storage operations in parallel
162165
let (r1, r2, r3) = {
166+
let mut pub_storage = self.inner.public_storage.lock().await;
163167
let mut priv_storage = self.inner.private_storage.lock().await;
164168
let back_vault = match self.inner.backup_vault {
165169
Some(ref x) => Some(x.lock().await),

0 commit comments

Comments
 (0)