@@ -28,18 +28,18 @@ static int s_validate_time_metrics(struct aws_s3_request_metrics *metrics, bool
2828 bool is_success = (error_code == AWS_ERROR_SUCCESS );
2929
3030 /* Always available */
31- aws_s3_request_metrics_get_request_start_timestamp_ns (metrics , & start );
31+ aws_s3_request_metrics_get_s3_request_first_attempt_start_timestamp_ns (metrics , & start );
3232 ASSERT_TRUE (start > 0 );
3333 /* Available on last attempt only */
3434 if (is_last_attempt ) {
35- ASSERT_SUCCESS (aws_s3_request_metrics_get_request_end_timestamp_ns (metrics , & end ));
35+ ASSERT_SUCCESS (aws_s3_request_metrics_get_s3_request_last_attempt_end_timestamp_ns (metrics , & end ));
3636 ASSERT_TRUE (end > 0 );
37- ASSERT_SUCCESS (aws_s3_request_metrics_get_request_duration_ns (metrics , & duration ));
37+ ASSERT_SUCCESS (aws_s3_request_metrics_get_s3_request_total_duration_ns (metrics , & duration ));
3838 ASSERT_TRUE (duration > 0 );
3939 ASSERT_UINT_EQUALS (end - start , duration );
4040 } else {
41- ASSERT_FAILS (aws_s3_request_metrics_get_request_end_timestamp_ns (metrics , & end ));
42- ASSERT_FAILS (aws_s3_request_metrics_get_request_duration_ns (metrics , & end ));
41+ ASSERT_FAILS (aws_s3_request_metrics_get_s3_request_last_attempt_end_timestamp_ns (metrics , & end ));
42+ ASSERT_FAILS (aws_s3_request_metrics_get_s3_request_total_duration_ns (metrics , & end ));
4343 }
4444
4545 aws_s3_request_metrics_get_start_timestamp_ns (metrics , & start );
@@ -87,8 +87,7 @@ static int s_validate_time_metrics(struct aws_s3_request_metrics *metrics, bool
8787 ASSERT_TRUE (duration > 0 );
8888 ASSERT_UINT_EQUALS (end - start , duration );
8989
90- if (metrics -> req_resp_info_metrics .request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT &&
91- metrics -> crt_info_metrics .part_number > 0 ) {
90+ if (metrics -> req_resp_info_metrics .request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT ) {
9291 ASSERT_SUCCESS (aws_s3_request_metrics_get_delivery_start_timestamp_ns (metrics , & start ));
9392 ASSERT_TRUE (start > 0 );
9493 ASSERT_SUCCESS (aws_s3_request_metrics_get_delivery_end_timestamp_ns (metrics , & end ));
@@ -99,14 +98,18 @@ static int s_validate_time_metrics(struct aws_s3_request_metrics *metrics, bool
9998 }
10099 }
101100
102- if (! is_last_attempt ) {
101+ if (metrics -> crt_info_metrics . retry_attempt > 0 ) {
103102 ASSERT_SUCCESS (aws_s3_request_metrics_get_retry_delay_start_timestamp_ns (metrics , & start ));
104103 ASSERT_TRUE (start > 0 );
105104 ASSERT_SUCCESS (aws_s3_request_metrics_get_retry_delay_end_timestamp_ns (metrics , & end ));
106105 ASSERT_TRUE (end > 0 );
107106 ASSERT_SUCCESS (aws_s3_request_metrics_get_retry_delay_duration_ns (metrics , & duration ));
108107 ASSERT_TRUE (duration > 0 );
109108 ASSERT_UINT_EQUALS (end - start , duration );
109+ } else {
110+ ASSERT_FAILS (aws_s3_request_metrics_get_retry_delay_start_timestamp_ns (metrics , & start ));
111+ ASSERT_FAILS (aws_s3_request_metrics_get_retry_delay_end_timestamp_ns (metrics , & end ));
112+ ASSERT_FAILS (aws_s3_request_metrics_get_retry_delay_duration_ns (metrics , & duration ));
110113 }
111114
112115 return AWS_OP_SUCCESS ;
@@ -141,51 +144,8 @@ static int s_validate_create_multipart_upload_metrics(struct aws_s3_request_metr
141144 ASSERT_UINT_EQUALS (AWS_ERROR_SUCCESS , aws_s3_request_metrics_get_error_code (metrics ));
142145
143146 /* Get all those time stamp */
144- uint64_t time_stamp = 0 ;
145-
146- aws_s3_request_metrics_get_request_start_timestamp_ns (metrics , & time_stamp );
147- ASSERT_FALSE (time_stamp == 0 );
148- time_stamp = 0 ;
149- aws_s3_request_metrics_get_request_end_timestamp_ns (metrics , & time_stamp );
150- ASSERT_FALSE (time_stamp == 0 );
151- time_stamp = 0 ;
152- aws_s3_request_metrics_get_request_duration_ns (metrics , & time_stamp );
153- ASSERT_FALSE (time_stamp == 0 );
154- time_stamp = 0 ;
155-
156- aws_s3_request_metrics_get_start_timestamp_ns (metrics , & time_stamp );
157- ASSERT_FALSE (time_stamp == 0 );
158- time_stamp = 0 ;
159- aws_s3_request_metrics_get_end_timestamp_ns (metrics , & time_stamp );
160- ASSERT_FALSE (time_stamp == 0 );
161- time_stamp = 0 ;
162- aws_s3_request_metrics_get_total_duration_ns (metrics , & time_stamp );
163- ASSERT_FALSE (time_stamp == 0 );
164- time_stamp = 0 ;
165-
166- ASSERT_SUCCESS (aws_s3_request_metrics_get_send_start_timestamp_ns (metrics , & time_stamp ));
167- ASSERT_FALSE (time_stamp == 0 );
168- time_stamp = 0 ;
169- ASSERT_SUCCESS (aws_s3_request_metrics_get_send_end_timestamp_ns (metrics , & time_stamp ));
170- ASSERT_FALSE (time_stamp == 0 );
171- time_stamp = 0 ;
172- ASSERT_SUCCESS (aws_s3_request_metrics_get_sending_duration_ns (metrics , & time_stamp ));
173- ASSERT_FALSE (time_stamp == 0 );
174- time_stamp = 0 ;
175-
176- ASSERT_SUCCESS (aws_s3_request_metrics_get_receive_start_timestamp_ns (metrics , & time_stamp ));
177- ASSERT_FALSE (time_stamp == 0 );
178- time_stamp = 0 ;
179- ASSERT_SUCCESS (aws_s3_request_metrics_get_receive_end_timestamp_ns (metrics , & time_stamp ));
180- ASSERT_FALSE (time_stamp == 0 );
181- time_stamp = 0 ;
182- ASSERT_SUCCESS (aws_s3_request_metrics_get_receiving_duration_ns (metrics , & time_stamp ));
183- ASSERT_FALSE (time_stamp == 0 );
184- time_stamp = 0 ;
185-
186- ASSERT_SUCCESS (aws_s3_request_metrics_get_service_call_duration_ns (metrics , & time_stamp ));
187- ASSERT_FALSE (time_stamp == 0 );
188- time_stamp = 0 ;
147+ ASSERT_SUCCESS (s_validate_time_metrics (metrics , true));
148+
189149 enum aws_s3_request_type request_type = 0 ;
190150 aws_s3_request_metrics_get_request_type (metrics , & request_type );
191151 ASSERT_UINT_EQUALS (AWS_S3_REQUEST_TYPE_CREATE_MULTIPART_UPLOAD , request_type );
@@ -197,7 +157,7 @@ static int s_validate_create_multipart_upload_metrics(struct aws_s3_request_metr
197157 return AWS_OP_SUCCESS ;
198158}
199159
200- static int s_validate_upload_part_metrics (struct aws_s3_request_metrics * metrics ) {
160+ static int s_validate_upload_part_metrics (struct aws_s3_request_metrics * metrics , bool is_last_attempt ) {
201161 struct aws_http_headers * response_headers = NULL ;
202162 struct aws_byte_cursor header_value ;
203163 enum aws_s3_request_type request_type = 0 ;
@@ -216,6 +176,8 @@ static int s_validate_upload_part_metrics(struct aws_s3_request_metrics *metrics
216176 ASSERT_SUCCESS (aws_s3_request_metrics_get_operation_name (metrics , & operation_name ));
217177 ASSERT_STR_EQUALS ("UploadPart" , aws_string_c_str (operation_name ));
218178
179+ ASSERT_SUCCESS (s_validate_time_metrics (metrics , is_last_attempt ));
180+
219181 return AWS_OP_SUCCESS ;
220182}
221183
@@ -228,6 +190,8 @@ static int s_validate_complete_multipart_upload_metrics(struct aws_s3_request_me
228190 ASSERT_SUCCESS (aws_s3_request_metrics_get_operation_name (metrics , & operation_name ));
229191 ASSERT_STR_EQUALS ("CompleteMultipartUpload" , aws_string_c_str (operation_name ));
230192
193+ ASSERT_SUCCESS (s_validate_time_metrics (metrics , true));
194+
231195 return AWS_OP_SUCCESS ;
232196}
233197
@@ -245,7 +209,7 @@ static int s_validate_mpu_mock_server_metrics(struct aws_array_list *metrics_lis
245209 for (size_t i = 1 ; i < aws_array_list_length (metrics_list ) - 1 ; i ++ ) {
246210 metrics = NULL ;
247211 aws_array_list_get_at (metrics_list , (void * * )& metrics , i );
248- ASSERT_SUCCESS (s_validate_upload_part_metrics (metrics ));
212+ ASSERT_SUCCESS (s_validate_upload_part_metrics (metrics , true )); /* assuming all requests were success */
249213 }
250214
251215 /* Last metrics should be CompleteMPU*/
@@ -262,48 +226,36 @@ static int s_validate_retry_metrics(
262226 uint32_t parts ,
263227 struct aws_allocator * allocator ) {
264228 struct aws_s3_request_metrics * metrics = NULL , * metrics2 = NULL ;
265- size_t failed_count = 0 ;
266-
267- for (size_t i = 1 ; i < aws_array_list_length (metrics_list ) - 1 ; i ++ ) {
268- metrics = NULL ;
269- aws_array_list_get_at (metrics_list , (void * * )& metrics , i );
270- if (aws_s3_request_metrics_get_error_code (metrics ) != AWS_ERROR_SUCCESS ) {
271- failed_count ++ ;
272- }
273- if (metrics -> crt_info_metrics .part_number != 0 ) {
274- for (size_t j = i + 1 ; j < aws_array_list_length (metrics_list ); j ++ ) {
275- metrics2 = NULL ;
276- aws_array_list_get_at (metrics_list , (void * * )& metrics2 , j );
277- if (metrics2 -> crt_info_metrics .part_number == metrics -> crt_info_metrics .part_number ) {
278- ASSERT_INT_EQUALS (
279- metrics2 -> time_metrics .request_start_timestamp_ns ,
280- metrics -> time_metrics .request_start_timestamp_ns );
281- }
282- }
283- }
284- }
285229
286- // verify time metrics
287- struct aws_hash_table hash_table ;
230+ /* First metrics should be the CreateMPU */
231+ aws_array_list_get_at (metrics_list , (void * * )& metrics , 0 );
232+ ASSERT_SUCCESS (s_validate_create_multipart_upload_metrics (metrics ));
288233
289- aws_hash_table_init (& hash_table , allocator , parts , aws_hash_ptr , aws_ptr_eq , NULL , NULL );
290234
291- for (size_t i = (aws_array_list_length (metrics_list )); i -- > 0 ;) {
292- metrics = NULL ;
293- aws_array_list_get_at (metrics_list , (void * * )& metrics , i );
294- int was_created = -1 ;
295- aws_hash_table_put (
296- & hash_table , (void * )(uintptr_t )metrics -> crt_info_metrics .part_number , (void * )(uintptr_t )1 , & was_created );
297- if (was_created == 1 || metrics -> crt_info_metrics .part_number == 0 ) {
298- ASSERT_SUCCESS (s_validate_time_metrics (metrics , true));
299- } else {
300- ASSERT_SUCCESS (s_validate_time_metrics (metrics , false));
235+ /* All of the middle should be Upload Parts*/
236+ size_t failed_count = 0 ;
237+ for (size_t i = 1 ; i < aws_array_list_length (metrics_list ) - 1 ; i = i + expected_failures + 1 ){
238+ aws_array_list_get_at (metrics_list , & metrics , i );
239+ for (size_t j = i ; j < i + expected_failures ; j ++ ){
240+ aws_array_list_get_at (metrics_list , & metrics2 , j + 1 );
241+ ASSERT_TRUE (metrics -> crt_info_metrics .error_code != AWS_ERROR_SUCCESS );
242+ failed_count ++ ;
243+ aws_array_list_get_at (metrics_list , (void * * )& metrics , j );
244+ ASSERT_SUCCESS (s_validate_upload_part_metrics (metrics , false));
245+ ASSERT_INT_EQUALS (metrics -> time_metrics .s3_request_first_attempt_start_timestamp_ns , metrics2 -> time_metrics .s3_request_first_attempt_start_timestamp_ns );
246+ ASSERT_INT_EQUALS (metrics -> crt_info_metrics .retry_attempt + 1 , metrics2 -> crt_info_metrics .retry_attempt );
247+ metrics = metrics2 ;
301248 }
249+ ASSERT_SUCCESS (s_validate_upload_part_metrics (metrics , true));
302250 }
303251
304- aws_hash_table_clean_up (& hash_table );
305-
306252 ASSERT_UINT_EQUALS (expected_failures * parts , failed_count );
253+
254+ /* Last metrics should be CompleteMPU*/
255+ metrics = NULL ;
256+ aws_array_list_get_at (metrics_list , (void * * )& metrics , aws_array_list_length (metrics_list ) - 1 );
257+ ASSERT_SUCCESS (s_validate_complete_multipart_upload_metrics (metrics ));
258+
307259 return AWS_OP_SUCCESS ;
308260}
309261
@@ -409,9 +361,6 @@ TEST_CASE(multipart_upload_with_n_retries_mock_server) {
409361 // check if number of metrics received for each part is n
410362 aws_s3_meta_request_test_results_init (& meta_request_test_results , allocator );
411363 ASSERT_SUCCESS (aws_s3_tester_send_meta_request_with_options (& tester , & put_options , & meta_request_test_results ));
412- ASSERT_SUCCESS (s_validate_mpu_mock_server_metrics (
413- & meta_request_test_results .synced_data .metrics ,
414- parts * 2 + (parts > 1 ? 2 : 0 ) /*1 create, 1 complete, 2 parts with 4 retries each*/ ));
415364 uint32_t expected_failures = (uint32_t )(uintptr_t )tester .user_data - 1 ;
416365 ASSERT_SUCCESS (s_validate_retry_metrics (
417366 & meta_request_test_results .synced_data .metrics , expected_failures , parts , allocator ));
0 commit comments