@@ -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