@@ -194,6 +194,25 @@ impl InstrumentedObjectStore {
194194 Ok ( ret)
195195 }
196196
197+ async fn instrumented_delete ( & self , location : & Path ) -> Result < ( ) > {
198+ let timestamp = Utc :: now ( ) ;
199+ let start = Instant :: now ( ) ;
200+ self . inner . delete ( location) . await ?;
201+ let elapsed = start. elapsed ( ) ;
202+
203+ self . requests . lock ( ) . push ( RequestDetails {
204+ op : Operation :: Delete ,
205+ path : location. clone ( ) ,
206+ timestamp,
207+ duration : Some ( elapsed) ,
208+ size : None ,
209+ range : None ,
210+ extra_display : None ,
211+ } ) ;
212+
213+ Ok ( ( ) )
214+ }
215+
197216 fn instrumented_list (
198217 & self ,
199218 prefix : Option < & Path > ,
@@ -235,6 +254,25 @@ impl InstrumentedObjectStore {
235254
236255 Ok ( ret)
237256 }
257+
258+ async fn instrumented_head ( & self , location : & Path ) -> Result < ObjectMeta > {
259+ let timestamp = Utc :: now ( ) ;
260+ let start = Instant :: now ( ) ;
261+ let ret = self . inner . head ( location) . await ?;
262+ let elapsed = start. elapsed ( ) ;
263+
264+ self . requests . lock ( ) . push ( RequestDetails {
265+ op : Operation :: Head ,
266+ path : location. clone ( ) ,
267+ timestamp,
268+ duration : Some ( elapsed) ,
269+ size : None ,
270+ range : None ,
271+ extra_display : None ,
272+ } ) ;
273+
274+ Ok ( ret)
275+ }
238276}
239277
240278impl fmt:: Display for InstrumentedObjectStore {
@@ -285,6 +323,10 @@ impl ObjectStore for InstrumentedObjectStore {
285323 }
286324
287325 async fn delete ( & self , location : & Path ) -> Result < ( ) > {
326+ if self . enabled ( ) {
327+ return self . instrumented_delete ( location) . await ;
328+ }
329+
288330 self . inner . delete ( location) . await
289331 }
290332
@@ -313,6 +355,10 @@ impl ObjectStore for InstrumentedObjectStore {
313355 }
314356
315357 async fn head ( & self , location : & Path ) -> Result < ObjectMeta > {
358+ if self . enabled ( ) {
359+ return self . instrumented_head ( location) . await ;
360+ }
361+
316362 self . inner . head ( location) . await
317363 }
318364}
@@ -321,9 +367,9 @@ impl ObjectStore for InstrumentedObjectStore {
321367#[ derive( Copy , Clone , Debug , PartialEq , Eq , Hash , PartialOrd , Ord ) ]
322368pub enum Operation {
323369 _Copy,
324- _Delete ,
370+ Delete ,
325371 Get ,
326- _Head ,
372+ Head ,
327373 List ,
328374 Put ,
329375}
@@ -753,6 +799,35 @@ mod tests {
753799 assert ! ( request. extra_display. is_none( ) ) ;
754800 }
755801
802+ #[ tokio:: test]
803+ async fn instrumented_store_delete ( ) {
804+ let ( instrumented, path) = setup_test_store ( ) . await ;
805+
806+ // By default no requests should be instrumented/stored
807+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
808+ instrumented. delete ( & path) . await . unwrap ( ) ;
809+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
810+
811+ // We need a new store so we have data to delete again
812+ let ( instrumented, path) = setup_test_store ( ) . await ;
813+ instrumented. set_instrument_mode ( InstrumentedObjectStoreMode :: Trace ) ;
814+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
815+ instrumented. delete ( & path) . await . unwrap ( ) ;
816+ assert_eq ! ( instrumented. requests. lock( ) . len( ) , 1 ) ;
817+
818+ let mut requests = instrumented. take_requests ( ) ;
819+ assert_eq ! ( requests. len( ) , 1 ) ;
820+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
821+
822+ let request = requests. pop ( ) . unwrap ( ) ;
823+ assert_eq ! ( request. op, Operation :: Delete ) ;
824+ assert_eq ! ( request. path, path) ;
825+ assert ! ( request. duration. is_some( ) ) ;
826+ assert ! ( request. size. is_none( ) ) ;
827+ assert ! ( request. range. is_none( ) ) ;
828+ assert ! ( request. extra_display. is_none( ) ) ;
829+ }
830+
756831 #[ tokio:: test]
757832 async fn instrumented_store_list ( ) {
758833 let ( instrumented, path) = setup_test_store ( ) . await ;
@@ -865,6 +940,33 @@ mod tests {
865940 assert ! ( request. extra_display. is_none( ) ) ;
866941 }
867942
943+ #[ tokio:: test]
944+ async fn instrumented_store_head ( ) {
945+ let ( instrumented, path) = setup_test_store ( ) . await ;
946+
947+ // By default no requests should be instrumented/stored
948+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
949+ let _ = instrumented. head ( & path) . await . unwrap ( ) ;
950+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
951+
952+ instrumented. set_instrument_mode ( InstrumentedObjectStoreMode :: Trace ) ;
953+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
954+ let _ = instrumented. head ( & path) . await . unwrap ( ) ;
955+ assert_eq ! ( instrumented. requests. lock( ) . len( ) , 1 ) ;
956+
957+ let mut requests = instrumented. take_requests ( ) ;
958+ assert_eq ! ( requests. len( ) , 1 ) ;
959+ assert ! ( instrumented. requests. lock( ) . is_empty( ) ) ;
960+
961+ let request = requests. pop ( ) . unwrap ( ) ;
962+ assert_eq ! ( request. op, Operation :: Head ) ;
963+ assert_eq ! ( request. path, path) ;
964+ assert ! ( request. duration. is_some( ) ) ;
965+ assert ! ( request. size. is_none( ) ) ;
966+ assert ! ( request. range. is_none( ) ) ;
967+ assert ! ( request. extra_display. is_none( ) ) ;
968+ }
969+
868970 #[ test]
869971 fn request_details ( ) {
870972 let rd = RequestDetails {
0 commit comments