@@ -68,21 +68,26 @@ where
6868 chunk_ids,
6969 request_id,
7070 bucket_id,
71+ file_key,
7172 ..
7273 } = event;
7374
74- // Get the file metadata from the file storage.
75- let file_storage_read_lock = self . storage_hub_handler . file_storage . read ( ) . await ;
76- let file_metadata = file_storage_read_lock
77- . get_metadata ( & event. file_key . into ( ) )
78- . map_err ( |_| anyhow:: anyhow!( "Failed to get file metadata" ) ) ?;
75+ let file_key_hash = file_key. into ( ) ;
7976
80- // If the file metadata is not found, return an error.
81- let file_metadata = if let Some ( file_metadata) = file_metadata {
82- file_metadata
83- } else {
84- error ! ( target: LOG_TARGET , "File not found in file storage" ) ;
85- return Err ( anyhow:: anyhow!( "File not found in file storage" ) ) ;
77+ // Get the file metadata from the file storage within a short-lived read lock.
78+ let file_metadata = {
79+ let file_storage_read_lock = self . storage_hub_handler . file_storage . read ( ) . await ;
80+ let file_metadata = file_storage_read_lock
81+ . get_metadata ( & file_key_hash)
82+ . map_err ( |_| anyhow:: anyhow!( "Failed to get file metadata" ) ) ?;
83+
84+ // If the file metadata is not found, return an error.
85+ if let Some ( file_metadata) = file_metadata {
86+ file_metadata
87+ } else {
88+ error ! ( target: LOG_TARGET , "File not found in file storage" ) ;
89+ return Err ( anyhow:: anyhow!( "File not found in file storage" ) ) ;
90+ }
8691 } ;
8792
8893 // If we have a bucket ID in the request, check if the file bucket matches the bucket ID in
@@ -92,15 +97,20 @@ where
9297 error ! (
9398 target: LOG_TARGET ,
9499 "File bucket mismatch for file {:?}: expected {:?}, got {:?}" ,
95- event. file_key, file_metadata. bucket_id( ) , bucket_id
100+ file_key,
101+ file_metadata. bucket_id( ) ,
102+ bucket_id
96103 ) ;
97104 return Err ( anyhow:: anyhow!( "File bucket mismatch" ) ) ;
98105 }
99106 }
100107
101- // Generate the proof for the chunk (which also contains the chunk data itself).
102- let generate_proof_result =
103- file_storage_read_lock. generate_proof ( & event. file_key . into ( ) , & chunk_ids) ;
108+ // Generate the proof for the chunk (which also contains the chunk data itself) within a
109+ // short-lived read lock, then drop the lock before performing any network I/O.
110+ let generate_proof_result = {
111+ let file_storage_read_lock = self . storage_hub_handler . file_storage . read ( ) . await ;
112+ file_storage_read_lock. generate_proof ( & file_key_hash, & chunk_ids)
113+ } ;
104114
105115 match generate_proof_result {
106116 Ok ( file_key_proof) => {
@@ -118,7 +128,7 @@ where
118128
119129 Ok ( format ! (
120130 "Handled RemoteDownloadRequest [{:?}] for file [{:x}]" ,
121- request_id, event . file_key
131+ request_id, file_key
122132 ) )
123133 }
124134}
0 commit comments