diff options
author | 2017-11-09 17:46:29 -0800 | |
---|---|---|
committer | 2017-11-09 17:46:29 -0800 | |
commit | 4e9265c828f0b559b5fdba04913fed46bf771399 (patch) | |
tree | 4a379fc2bdc037753cf8d81f8b86327e4bc50a42 /src/core/ext/filters/message_size | |
parent | 0ee7574732a06e8cace4e099a678f4bd5dbff679 (diff) | |
parent | d9da7387b8057f3bd99a417a5ee905377bce9296 (diff) |
Merge with master
Diffstat (limited to 'src/core/ext/filters/message_size')
-rw-r--r-- | src/core/ext/filters/message_size/message_size_filter.cc | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index b5c0efe6b9..b6a12a10bf 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -30,14 +30,33 @@ #include "src/core/lib/surface/channel_init.h" #include "src/core/lib/transport/service_config.h" -typedef struct message_size_limits { +typedef struct { int max_send_size; int max_recv_size; } message_size_limits; -static void message_size_limits_free(void* value) { gpr_free(value); } +typedef struct { + gpr_refcount refs; + message_size_limits limits; +} refcounted_message_size_limits; + +static void* refcounted_message_size_limits_ref(void* value) { + refcounted_message_size_limits* limits = + (refcounted_message_size_limits*)value; + gpr_ref(&limits->refs); + return value; +} + +static void refcounted_message_size_limits_unref(void* value) { + refcounted_message_size_limits* limits = + (refcounted_message_size_limits*)value; + if (gpr_unref(&limits->refs)) { + gpr_free(value); + } +} -static void* message_size_limits_create_from_json(const grpc_json* json) { +static void* refcounted_message_size_limits_create_from_json( + const grpc_json* json) { int max_request_message_bytes = -1; int max_response_message_bytes = -1; for (grpc_json* field = json->child; field != NULL; field = field->next) { @@ -58,10 +77,12 @@ static void* message_size_limits_create_from_json(const grpc_json* json) { if (max_response_message_bytes == -1) return NULL; } } - message_size_limits* value = - (message_size_limits*)gpr_malloc(sizeof(message_size_limits)); - value->max_send_size = max_request_message_bytes; - value->max_recv_size = max_response_message_bytes; + refcounted_message_size_limits* value = + (refcounted_message_size_limits*)gpr_malloc( + sizeof(refcounted_message_size_limits)); + gpr_ref_init(&value->refs, 1); + value->limits.max_send_size = max_request_message_bytes; + value->limits.max_recv_size = max_response_message_bytes; return value; } @@ -80,7 +101,7 @@ typedef struct call_data { typedef struct channel_data { message_size_limits limits; - // Maps path names to message_size_limits structs. + // Maps path names to refcounted_message_size_limits structs. grpc_slice_hash_table* method_limit_table; } channel_data; @@ -125,9 +146,10 @@ static void start_transport_stream_op_batch( op->payload->send_message.send_message->length, calld->limits.max_send_size); grpc_transport_stream_op_batch_finish_with_failure( - op, grpc_error_set_int( - GRPC_ERROR_CREATE_FROM_COPIED_STRING(message_string), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED), + op, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(message_string), + GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_RESOURCE_EXHAUSTED), calld->call_combiner); gpr_free(message_string); return; @@ -158,19 +180,19 @@ static grpc_error* init_call_elem(grpc_call_element* elem, // size to the receive limit. calld->limits = chand->limits; if (chand->method_limit_table != NULL) { - message_size_limits* limits = - (message_size_limits*)grpc_method_config_table_get( + refcounted_message_size_limits* limits = + (refcounted_message_size_limits*)grpc_method_config_table_get( chand->method_limit_table, args->path); if (limits != NULL) { - if (limits->max_send_size >= 0 && - (limits->max_send_size < calld->limits.max_send_size || + if (limits->limits.max_send_size >= 0 && + (limits->limits.max_send_size < calld->limits.max_send_size || calld->limits.max_send_size < 0)) { - calld->limits.max_send_size = limits->max_send_size; + calld->limits.max_send_size = limits->limits.max_send_size; } - if (limits->max_recv_size >= 0 && - (limits->max_recv_size < calld->limits.max_recv_size || + if (limits->limits.max_recv_size >= 0 && + (limits->limits.max_recv_size < calld->limits.max_recv_size || calld->limits.max_recv_size < 0)) { - calld->limits.max_recv_size = limits->max_recv_size; + calld->limits.max_recv_size = limits->limits.max_recv_size; } } } @@ -230,8 +252,9 @@ static grpc_error* init_channel_elem(grpc_channel_element* elem, if (service_config != NULL) { chand->method_limit_table = grpc_service_config_create_method_config_table( - service_config, message_size_limits_create_from_json, - message_size_limits_free); + service_config, refcounted_message_size_limits_create_from_json, + refcounted_message_size_limits_ref, + refcounted_message_size_limits_unref); grpc_service_config_destroy(service_config); } } |