Skip to content

Commit 184860f

Browse files
register on buffer allocated async instead
1 parent 52c90d3 commit 184860f

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

include/aws/s3/private/s3_request.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,14 @@ struct aws_s3_request {
139139
* retried.*/
140140
struct aws_byte_buf request_body;
141141

142+
/**
143+
* Ticket to acquire the buffer.
144+
*/
142145
struct aws_s3_buffer_ticket *ticket;
143146

147+
/* Result of memory acquisition */
148+
int buffer_acquire_result;
149+
144150
/* Beginning range of this part. */
145151
/* TODO currently only used by auto_range_get, could be hooked up to auto_range_put as well. */
146152
uint64_t part_range_start;

source/s3_client.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1909,7 +1909,10 @@ void s_acquire_mem_and_prepare_request(
19091909
}
19101910
/* END CRITICAL SECTION */
19111911

1912-
aws_future_s3_buffer_ticket_register_callback(payload->buffer_future, s_on_pool_buffer_reserved, payload);
1912+
/* Note: run callback async on event loop. this is done to avoid any race conditions between cancelling
1913+
which requires a lock on meta request and buffer acquire callback which also requires a lock. */
1914+
aws_future_s3_buffer_ticket_register_event_loop_callback(
1915+
payload->buffer_future, meta_request->io_event_loop, s_on_pool_buffer_reserved, payload);
19131916
return;
19141917
}
19151918

source/s3_meta_request.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,13 +1832,12 @@ void aws_s3_meta_request_cancel_pending_buffer_futures_synced(
18321832
struct aws_s3_meta_request *meta_request,
18331833
int error_code) {
18341834
ASSERT_SYNCED_DATA_LOCK_HELD(meta_request);
1835-
while (!aws_linked_list_empty(&meta_request->synced_data.pending_buffer_futures)) {
18361835

1837-
struct aws_linked_list_node *request_node =
1838-
aws_linked_list_pop_front(&meta_request->synced_data.pending_buffer_futures);
1836+
for (struct aws_linked_list_node *node = aws_linked_list_begin(&meta_request->synced_data.pending_buffer_futures);
1837+
node != aws_linked_list_end(&meta_request->synced_data.pending_buffer_futures);
1838+
node = aws_linked_list_next(node)) {
18391839

1840-
struct aws_s3_request *request =
1841-
AWS_CONTAINER_OF(request_node, struct aws_s3_request, pending_buffer_future_list_node);
1840+
struct aws_s3_request *request = AWS_CONTAINER_OF(node, struct aws_s3_request, pending_buffer_future_list_node);
18421841

18431842
aws_future_s3_buffer_ticket_set_error(request->synced_data.buffer_future, error_code);
18441843
}

0 commit comments

Comments
 (0)