Skip to content

Commit 55fda6d

Browse files
flag for response
1 parent 8eae3de commit 55fda6d

5 files changed

Lines changed: 31 additions & 35 deletions

File tree

include/aws/s3/private/s3_meta_request_impl.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ struct aws_s3_meta_request {
242242
* The length will always be less than part-size */
243243
struct aws_byte_buf buffered_data;
244244
struct aws_s3_buffer_ticket *buffered_data_ticket;
245-
struct aws_future_s3_buffer_ticket *buffered_ticket_future;
246245

247246
/* Waker callback.
248247
* Stored if a poll_write() call returns result.is_pending

include/aws/s3/private/s3_request.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ enum aws_s3_request_flags {
2222
AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS = 0x00000001,
2323
AWS_S3_REQUEST_FLAG_ALWAYS_SEND = 0x00000002,
2424
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL = 0x00000004,
25+
AWS_S3_REQUEST_FLAG_RESPONSE_ALLOCATED_FROM_POOL = 0x00000008,
2526
};
2627

2728
/**
@@ -257,6 +258,9 @@ struct aws_s3_request {
257258

258259
/* When true, this request has already been uploaded. we still prepare the request to check the durability. */
259260
uint32_t was_previously_uploaded : 1;
261+
262+
/* When true, this request has buffer allocated to response */
263+
uint32_t has_buffer_ticket_for_response : 1;
260264
};
261265

262266
AWS_EXTERN_C_BEGIN

source/s3_auto_ranged_get.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ static bool s_s3_auto_ranged_get_update(
252252
AWS_S3_REQUEST_TYPE_GET_OBJECT,
253253
1 /*part_number*/,
254254
AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS |
255-
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL);
255+
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL |
256+
AWS_S3_REQUEST_FLAG_RESPONSE_ALLOCATED_FROM_POOL);
256257
++auto_ranged_get->synced_data.num_parts_requested;
257258

258259
break;
@@ -293,7 +294,8 @@ static bool s_s3_auto_ranged_get_update(
293294
AWS_S3_REQUEST_TYPE_GET_OBJECT,
294295
1 /*part_number*/,
295296
AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS |
296-
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL);
297+
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL |
298+
AWS_S3_REQUEST_FLAG_RESPONSE_ALLOCATED_FROM_POOL);
297299
request->part_range_start = part_range_start;
298300
request->part_range_end = part_range_start + first_part_size - 1; /* range-end is inclusive */
299301
++auto_ranged_get->synced_data.num_parts_requested;
@@ -344,7 +346,7 @@ static bool s_s3_auto_ranged_get_update(
344346
AWS_S3_AUTO_RANGE_GET_REQUEST_TYPE_GET_OBJECT_WITH_RANGE,
345347
AWS_S3_REQUEST_TYPE_GET_OBJECT,
346348
auto_ranged_get->synced_data.num_parts_requested + 1 /*part_number*/,
347-
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL);
349+
AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL | AWS_S3_REQUEST_FLAG_RESPONSE_ALLOCATED_FROM_POOL);
348350

349351
aws_s3_calculate_auto_ranged_get_part_range(
350352
auto_ranged_get->synced_data.object_range_start,

source/s3_meta_request.c

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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...",

source/s3_request.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct aws_s3_request *aws_s3_request_new(
3838
request->part_number = part_number;
3939
request->record_response_headers = (flags & AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS) != 0;
4040
request->should_allocate_buffer_from_pool = (flags & AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL) != 0;
41+
request->has_buffer_ticket_for_response = (flags & AWS_S3_REQUEST_FLAG_RESPONSE_ALLOCATED_FROM_POOL;)
4142
request->always_send = (flags & AWS_S3_REQUEST_FLAG_ALWAYS_SEND) != 0;
4243

4344
return request;

0 commit comments

Comments
 (0)