@@ -1428,7 +1428,7 @@ static int s_s3_meta_request_incoming_body(
14281428 }
14291429
14301430 if (request -> send_data .response_body .capacity == 0 ) {
1431- if (request -> ticket != NULL ) {
1431+ if (request -> has_buffer_ticket_for_response && request -> ticket != NULL ) {
14321432 request -> send_data .response_body = aws_s3_buffer_ticket_claim (request -> ticket );
14331433 } else {
14341434 size_t buffer_size = s_dynamic_body_initial_buf_size ;
@@ -2356,7 +2356,7 @@ struct aws_s3_meta_request_poll_write_result aws_s3_meta_request_poll_write(
23562356
23572357 } else if (meta_request -> synced_data .async_write .buffered_data .len == meta_request -> part_size ) {
23582358 /* Can't write more until buffered data is sent. Store waker */
2359- AWS_LOGF_TRACE (AWS_LS_S3_META_REQUEST , "id=%p: write() pending, waker registered ..." , (void * )meta_request );
2359+ AWS_LOGF_DEBUG (AWS_LS_S3_META_REQUEST , "id=%p: write() pending, waker registered ..." , (void * )meta_request );
23602360 meta_request -> synced_data .async_write .waker = waker ;
23612361 meta_request -> synced_data .async_write .waker_user_data = user_data ;
23622362 result .is_pending = true;
@@ -2366,52 +2366,42 @@ struct aws_s3_meta_request_poll_write_result aws_s3_meta_request_poll_write(
23662366 /* If we don't already have a buffer, grab one from the pool. */
23672367 if (meta_request -> synced_data .async_write .buffered_data_ticket == NULL ) {
23682368
2369- if (meta_request -> synced_data .async_write .buffered_data_ticket == NULL &&
2370- meta_request -> synced_data .async_write .buffered_ticket_future == NULL ) {
2371- /* NOTE: we acquire a forced-buffer because there's a risk of deadlock if we
2372- * waited for a normal ticket reservation, respecting the pool's memory limit.
2373- * (See "test_s3_many_async_uploads_without_data" for description of deadlock scenario) */
2369+ struct aws_future_s3_buffer_ticket * buffered_ticket_future ;
2370+ /* NOTE: we acquire a forced-buffer because there's a risk of deadlock if we
2371+ * waited for a normal ticket reservation, respecting the pool's memory limit.
2372+ * (See "test_s3_many_async_uploads_without_data" for description of deadlock scenario) */
23742373
2375- struct aws_s3_buffer_pool_reserve_meta meta = {
2376- .size = meta_request -> part_size ,
2377- .can_block = true,
2378- .meta_request = meta_request ,
2379- .client = meta_request -> client };
2374+ struct aws_s3_buffer_pool_reserve_meta meta = {
2375+ .size = meta_request -> part_size ,
2376+ .can_block = true,
2377+ .meta_request = meta_request ,
2378+ .client = meta_request -> client };
23802379
2381- meta_request -> synced_data . async_write . buffered_ticket_future =
2382- aws_s3_buffer_pool_reserve ( meta_request -> client -> buffer_pool , meta );
2380+ buffered_ticket_future = aws_s3_buffer_pool_reserve ( meta_request -> client -> buffer_pool , meta );
2381+ AWS_FATAL_ASSERT ( buffered_ticket_future );
23832382
2384- AWS_FATAL_ASSERT (meta_request -> synced_data .async_write .buffered_ticket_future );
2385- }
2386-
2387- if (aws_future_s3_buffer_ticket_is_done (meta_request -> synced_data .async_write .buffered_ticket_future )) {
2388- if (aws_future_s3_buffer_ticket_get_error (
2389- meta_request -> synced_data .async_write .buffered_ticket_future ) != AWS_OP_SUCCESS ) {
2383+ if (aws_future_s3_buffer_ticket_is_done (buffered_ticket_future )) {
2384+ if (aws_future_s3_buffer_ticket_get_error (buffered_ticket_future ) != AWS_OP_SUCCESS ) {
23902385 AWS_LOGF_ERROR (AWS_LS_S3_META_REQUEST , "id=%p: Failed to acquire buffer." , (void * )meta_request );
23912386 illegal_usage_terminate_meta_request = true;
23922387 } else {
23932388 meta_request -> synced_data .async_write .buffered_data_ticket =
2394- aws_future_s3_buffer_ticket_get_result_by_move (
2395- meta_request -> synced_data .async_write .buffered_ticket_future );
2389+ aws_future_s3_buffer_ticket_get_result_by_move (buffered_ticket_future );
23962390
2397- meta_request -> synced_data .async_write .buffered_ticket_future = aws_future_s3_buffer_ticket_release (
2398- meta_request -> synced_data .async_write .buffered_ticket_future );
2391+ aws_future_s3_buffer_ticket_release (buffered_ticket_future );
23992392
24002393 meta_request -> synced_data .async_write .buffered_data =
24012394 aws_s3_buffer_ticket_claim (meta_request -> synced_data .async_write .buffered_data_ticket );
24022395 }
24032396 } else {
2404- /* Failing to acquire memory synchronously is a hard error for now. Consider relaxing this in future. */
2405- meta_request -> synced_data .async_write .buffered_ticket_future =
2406- aws_future_s3_buffer_ticket_release (meta_request -> synced_data .async_write .buffered_ticket_future );
2407-
2408- AWS_LOGF_TRACE (
2397+ AWS_LOGF_DEBUG (
24092398 AWS_LS_S3_META_REQUEST ,
24102399 "id=%p: Illegal call to write(). Failed to acquire buffer memory." ,
24112400 (void * )meta_request );
24122401 illegal_usage_terminate_meta_request = true;
2402+ aws_future_s3_buffer_ticket_release (buffered_ticket_future );
24132403 }
2414- }
2404+ }
24152405
24162406 if (!illegal_usage_terminate_meta_request ) {
24172407 /* Copy as much data as we can into the buffer */
@@ -2431,7 +2421,7 @@ struct aws_s3_meta_request_poll_write_result aws_s3_meta_request_poll_write(
24312421 ready_to_send = true;
24322422 }
24332423
2434- AWS_LOGF_TRACE (
2424+ AWS_LOGF_DEBUG (
24352425 AWS_LS_S3_META_REQUEST ,
24362426 "id=%p: write(data=%zu, eof=%d) processed=%zu remainder:%zu previously-buffered=%zu. %s"
24372427 "part..." ,
0 commit comments