@@ -40,12 +40,48 @@ struct s3_cancel_test_user_data {
4040 bool abort_successful ;
4141};
4242
43- static bool s_s3_meta_request_update_cancel_test (
43+ /* TODO: this is an unfortunately copy/paste from `s_s3_auto_ranged_put_pause`, we need to hold the lock to invoke the
44+ * pause for the test to avoid the checks changed after checking it and used afterward. In between move the
45+ * synced_section from s_s3_auto_ranged_put_pause to a function that can be used here and copy/paste it here. I picked
46+ * copy/paste it to avoid exposing a weird test only function to our API. */
47+ static void s_pause_meta_request_synced (
4448 struct aws_s3_meta_request * meta_request ,
45- uint32_t flags ,
46- struct aws_s3_request * * out_request ) {
49+ struct aws_s3_meta_request_resume_token * * out_resume_token ) {
50+
51+ struct aws_s3_auto_ranged_put * auto_ranged_put = meta_request -> impl ;
52+ /* upload can be in one of several states:
53+ * - not started, i.e. we didn't even call crete mpu yet - return success,
54+ * token is NULL and cancel the upload
55+ * - in the middle of upload - return success, create token and cancel
56+ * upload
57+ * - complete MPU started - return success, generate token and try to cancel
58+ * complete MPU
59+ */
60+ if (auto_ranged_put -> synced_data .create_multipart_upload_completed ) {
61+
62+ * out_resume_token = aws_s3_meta_request_resume_token_new (meta_request -> allocator );
63+
64+ (* out_resume_token )-> type = AWS_S3_META_REQUEST_TYPE_PUT_OBJECT ;
65+ (* out_resume_token )-> multipart_upload_id =
66+ aws_string_clone_or_reuse (meta_request -> allocator , auto_ranged_put -> upload_id );
67+ (* out_resume_token )-> part_size = meta_request -> part_size ;
68+ (* out_resume_token )-> total_num_parts = auto_ranged_put -> total_num_parts_from_content_length ;
69+ (* out_resume_token )-> num_parts_completed = auto_ranged_put -> synced_data .num_parts_completed ;
70+ }
71+
72+ /**
73+ * Cancels the meta request using the PAUSED flag to avoid deletion of uploaded parts.
74+ * This allows the client to resume the upload later, setting the persistable state in the meta request options.
75+ */
76+ aws_s3_meta_request_set_fail_synced (meta_request , NULL , AWS_ERROR_S3_PAUSED );
77+
78+ aws_s3_meta_request_cancel_cancellable_requests_synced (meta_request , AWS_ERROR_S3_PAUSED );
79+ aws_s3_meta_request_cancel_pending_buffer_futures_synced (meta_request , AWS_ERROR_S3_PAUSED );
80+ }
81+
82+ static bool s_s3_meta_request_cancel_test_synced_update_stub (struct aws_s3_meta_request * meta_request ) {
4783 AWS_PRECONDITION (meta_request );
48- AWS_PRECONDITION ( out_request );
84+ ASSERT_SYNCED_DATA_LOCK_HELD ( meta_request );
4985
5086 struct aws_s3_meta_request_test_results * results = meta_request -> user_data ;
5187 struct aws_s3_tester * tester = results -> tester ;
@@ -57,8 +93,6 @@ static bool s_s3_meta_request_update_cancel_test(
5793 bool call_cancel_or_pause = false;
5894 bool block_update = false;
5995
60- aws_s3_meta_request_lock_synced_data (meta_request );
61-
6296 switch (cancel_test_user_data -> type ) {
6397 case S3_UPDATE_CANCEL_TYPE_NO_CANCEL :
6498 break ;
@@ -131,23 +165,20 @@ static bool s_s3_meta_request_update_cancel_test(
131165 break ;
132166 }
133167
134- aws_s3_meta_request_unlock_synced_data (meta_request );
135168 if (call_cancel_or_pause ) {
136169 if (cancel_test_user_data -> pause ) {
137- aws_s3_meta_request_pause (meta_request , & cancel_test_user_data -> resume_token );
170+ s_pause_meta_request_synced (meta_request , & cancel_test_user_data -> resume_token );
138171 } else {
139- aws_s3_meta_request_cancel (meta_request );
172+ aws_s3_meta_request_set_fail_synced (meta_request , NULL , AWS_ERROR_S3_CANCELED );
173+ aws_s3_meta_request_cancel_cancellable_requests_synced (meta_request , AWS_ERROR_S3_CANCELED );
174+ aws_s3_meta_request_cancel_pending_buffer_futures_synced (meta_request , AWS_ERROR_S3_CANCELED );
140175 }
141176 }
142177
143178 if (block_update ) {
144179 return true;
145180 }
146-
147- struct aws_s3_meta_request_vtable * original_meta_request_vtable =
148- aws_s3_tester_get_meta_request_vtable_patch (tester , 0 )-> original_vtable ;
149-
150- return original_meta_request_vtable -> update (meta_request , flags , out_request );
181+ return false;
151182}
152183
153184static void s_s3_meta_request_finished_request_cancel_test (
@@ -188,7 +219,7 @@ static struct aws_s3_meta_request *s_meta_request_factory_patch_update_cancel_te
188219
189220 struct aws_s3_meta_request_vtable * patched_meta_request_vtable =
190221 aws_s3_tester_patch_meta_request_vtable (tester , meta_request , NULL );
191- patched_meta_request_vtable -> update = s_s3_meta_request_update_cancel_test ;
222+ patched_meta_request_vtable -> synced_update_stub = s_s3_meta_request_cancel_test_synced_update_stub ;
192223 patched_meta_request_vtable -> finished_request = s_s3_meta_request_finished_request_cancel_test ;
193224
194225 return meta_request ;
0 commit comments