@@ -182,45 +182,39 @@ async fn schema() -> &'static str {
182182
183183/// Download an object from S3
184184///
185- /// Requests a byte range if `offset` or `size` is specified in the request.
186- ///
187185/// # Arguments
188186///
189187/// * `client`: S3 client object
190- /// * `request_data`: RequestData object for the request
188+ /// * `bucket`: Name of the bucket
189+ /// * `key`: Name of the object in the bucket
190+ /// * `range`: Optional byte range
191191/// * `resource_manager`: ResourceManager object
192- #[ tracing:: instrument( level = "DEBUG" , skip( client, request_data, resource_manager) ) ]
192+ /// * `mem_permits`: Memory permits for the request
193+ #[ tracing:: instrument( level = "DEBUG" , skip( client, bucket, key, range, resource_manager) ) ]
193194async fn download_s3_object < ' a > (
194195 client : & s3_client:: S3Client ,
195- request_data : & models:: RequestData ,
196+ bucket : & str ,
197+ key : & str ,
198+ range : Option < String > ,
196199 resource_manager : & ' a ResourceManager ,
197200 mut mem_permits : Option < SemaphorePermit < ' a > > ,
198201) -> Result < Bytes , ActiveStorageError > {
199- // Convert request data to byte range for S3 request
200- let range = s3_client:: get_range ( request_data. offset , request_data. size ) ;
201202 // Acquire connection permit to be freed via drop when this function returns
202203 let _conn_permits = resource_manager. s3_connection ( ) . await ?;
203204
204205 client
205- . download_object (
206- & request_data. bucket ,
207- & request_data. object ,
208- range,
209- resource_manager,
210- & mut mem_permits,
211- )
206+ . download_object ( bucket, key, range, resource_manager, & mut mem_permits)
212207 . await
213208}
214209
215210/// Download and cache an object from S3
216211///
217- /// Requests a byte range if `offset` or `size` is specified in the request.
218- ///
219212/// # Arguments
220213///
221214/// * `client`: S3 client object
222215/// * `request_data`: RequestData object for the request
223216/// * `resource_manager`: ResourceManager object
217+ /// * `mem_permits`: Memory permits for the request
224218/// * `chunk_cache`: ChunkCache object
225219#[ tracing:: instrument(
226220 level = "DEBUG" ,
@@ -285,19 +279,35 @@ async fn download_and_cache_s3_object<'a>(
285279 . instrument ( tracing:: Span :: current ( ) )
286280 . await ?;
287281 if let Some ( bytes) = cache_value {
288- return Ok ( bytes) ;
282+ return Ok ( s3_client:: apply_range (
283+ bytes,
284+ request_data. offset ,
285+ request_data. size ,
286+ ) ) ;
289287 }
290288 }
291289
292- let data = download_s3_object ( client, request_data, resource_manager, mem_permits) . await ?;
290+ let data = download_s3_object (
291+ client,
292+ & request_data. bucket ,
293+ & request_data. object ,
294+ None ,
295+ resource_manager,
296+ mem_permits,
297+ )
298+ . await ?;
293299
294300 // Write data to cache
295- chunk_cache. set ( & key, data. clone ( ) ) . await ?;
301+ chunk_cache. set ( & key, & data) . await ?;
296302
297303 // Increment the prometheus metric for cache misses
298304 LOCAL_CACHE_MISSES . with_label_values ( & [ "disk" ] ) . inc ( ) ;
299305
300- Ok ( data)
306+ Ok ( s3_client:: apply_range (
307+ data,
308+ request_data. offset ,
309+ request_data. size ,
310+ ) )
301311}
302312
303313/// Handler for Active Storage operations
@@ -341,7 +351,9 @@ async fn operation_handler<T: operation::Operation>(
341351
342352 let data = match ( & state. args . use_chunk_cache , & state. chunk_cache ) {
343353 ( false , _) => {
344- download_s3_object ( & s3_client, & request_data, & state. resource_manager , _mem_permits)
354+ // Convert request data offset and size to byte range for S3 request
355+ let range = s3_client:: get_range ( request_data. offset , request_data. size ) ;
356+ download_s3_object ( & s3_client, & request_data. bucket , & request_data. object , range, & state. resource_manager , _mem_permits)
345357 . instrument ( tracing:: Span :: current ( ) )
346358 . await ?
347359 }
@@ -393,10 +405,7 @@ fn operation<T: operation::Operation>(
393405 assert_eq ! ( ptr, data. as_ptr( ) ) ;
394406 }
395407 // Convert to a mutable vector to allow in-place byte order conversion.
396- let ptr = data. as_ptr ( ) ;
397408 let vec: Vec < u8 > = data. into ( ) ;
398- // Assert that we're using zero-copy.
399- assert_eq ! ( ptr, vec. as_ptr( ) ) ;
400409 debug_span ! ( "operation" ) . in_scope ( || T :: execute ( & request_data, vec) )
401410}
402411
0 commit comments