Skip to content

Commit 3a9d56a

Browse files
committed
make sure it kick off the task once more window available
1 parent 17ce1ed commit 3a9d56a

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

include/aws/s3/private/s3_meta_request_impl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,15 @@ struct aws_s3_meta_request {
225225

226226
/* Task for delivering events on the meta-request's io_event_loop thread.
227227
* We do this to ensure a meta-request's callbacks are fired sequentially and non-overlapping.
228-
* If `event_delivery_array` has items in it, then this task is scheduled.
228+
* If `event_delivery_task_scheduled` is true, then this task is scheduled.
229229
* If `event_delivery_active` is true, then this task is actively running.
230230
* Delivery is not 100% complete until `event_delivery_array` is empty AND `event_delivery_active` is false
231231
* (use aws_s3_meta_request_are_events_out_for_delivery_synced() to check) */
232232
struct aws_task event_delivery_task;
233233

234+
/* Whether or not event delivery is currently scheduled. */
235+
uint32_t event_delivery_task_scheduled : 1;
236+
234237
/* Array of `struct aws_s3_meta_request_event` to deliver when the `event_delivery_task` runs. */
235238
struct aws_array_list event_delivery_array;
236239

source/s3_meta_request.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,8 @@ void aws_s3_meta_request_increment_read_window(struct aws_s3_meta_request *meta_
412412
/* Response will never approach UINT64_MAX, so do a saturating sum instead of worrying about overflow */
413413
meta_request->synced_data.read_window_running_total =
414414
aws_add_u64_saturating(bytes, meta_request->synced_data.read_window_running_total);
415+
/* Kick off the event delivery task again see if we need to */
416+
aws_s3_meta_request_add_event_for_delivery_synced(meta_request, NULL);
415417

416418
aws_s3_meta_request_unlock_synced_data(meta_request);
417419
/* END CRITICAL SECTION */
@@ -1882,12 +1884,13 @@ void aws_s3_meta_request_add_event_for_delivery_synced(
18821884
const struct aws_s3_meta_request_event *event) {
18831885

18841886
ASSERT_SYNCED_DATA_LOCK_HELD(meta_request);
1887+
if (event) {
1888+
aws_array_list_push_back(&meta_request->synced_data.event_delivery_array, event);
1889+
}
18851890

1886-
aws_array_list_push_back(&meta_request->synced_data.event_delivery_array, event);
1887-
1888-
/* If the array was empty before, schedule task to deliver all events in the array.
1889-
* If the array already had things in it, then the task is already scheduled and will run soon. */
1890-
if (aws_array_list_length(&meta_request->synced_data.event_delivery_array) == 1) {
1891+
/* If the event delivery task is not scheduled before, and there are more to be delivery. */
1892+
if (!meta_request->synced_data.event_delivery_task_scheduled &&
1893+
aws_array_list_length(&meta_request->synced_data.event_delivery_array) > 0) {
18911894
aws_s3_meta_request_acquire(meta_request);
18921895

18931896
aws_task_init(
@@ -1896,6 +1899,7 @@ void aws_s3_meta_request_add_event_for_delivery_synced(
18961899
meta_request,
18971900
"s3_meta_request_event_delivery");
18981901
aws_event_loop_schedule_task_now(meta_request->io_event_loop, &meta_request->synced_data.event_delivery_task);
1902+
meta_request->synced_data.event_delivery_task_scheduled = true;
18991903
}
19001904
}
19011905

@@ -1991,6 +1995,7 @@ static void s_s3_meta_request_event_delivery_task(struct aws_task *task, void *a
19911995

19921996
aws_array_list_swap_contents(event_delivery_array, &meta_request->synced_data.event_delivery_array);
19931997
meta_request->synced_data.event_delivery_active = true;
1998+
meta_request->synced_data.event_delivery_task_scheduled = false;
19941999

19952000
if (aws_s3_meta_request_has_finish_result_synced(meta_request)) {
19962001
error_code = AWS_ERROR_S3_CANCELED;

0 commit comments

Comments
 (0)