Skip to content

Commit

Permalink
[chttp2] Better error message on metadata size exceeded message (grpc…
Browse files Browse the repository at this point in the history
…#32809)

This error can trigger for either initial or trailing metadata (and
we've had outages where the latter was the cause).

I don't think we know at this layer if we're parsing initial or trailing
- though it'd be a good exercise to plumb that through.

For now remove the word initial because it's better to give less
information than wrong information.

<!--

If you know who should review your pull request, please assign it to
that
person, otherwise the pull request would get assigned randomly.

If your pull request is for a specific language, please add the
appropriate
lang label.

-->
  • Loading branch information
ctiller committed May 4, 2023
1 parent 7fe3bf9 commit 72abe13
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 22 deletions.
4 changes: 2 additions & 2 deletions src/core/ext/transport/chttp2/transport/hpack_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -837,11 +837,11 @@ class HPackParser::Parser {
"B)", summary.empty() ? "" : " to ", summary);
if (exceeded_hard_limit) {
error_message = absl::StrCat(
"received initial metadata size exceeds hard limit (", *frame_length_,
"received metadata size exceeds hard limit (", *frame_length_,
" vs. ", metadata_early_detection_->hard_limit(), ")", summary);
} else {
error_message = absl::StrCat(
"received initial metadata size exceeds soft limit (", *frame_length_,
"received metadata size exceeds soft limit (", *frame_length_,
" vs. ", metadata_early_detection_->soft_limit(),
"), rejecting requests with some random probability", summary);
}
Expand Down
30 changes: 10 additions & 20 deletions test/core/end2end/tests/large_metadata.cc
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,7 @@ static void test_request_with_large_metadata_between_soft_and_hard_limits(
auto status = send_metadata(f.get(), metadata_size, &client_details);
if (status == GRPC_STATUS_RESOURCE_EXHAUSTED) {
num_requests_rejected++;
const char* expected_error =
"received initial metadata size exceeds soft limit";
const char* expected_error = "received metadata size exceeds soft limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -246,8 +245,7 @@ static void test_request_with_large_metadata_above_hard_limit(
grpc_slice client_details;
auto status = send_metadata(f.get(), metadata_size, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -292,8 +290,7 @@ static void test_request_with_large_metadata_soft_limit_above_hard_limit(
auto status =
send_metadata(f.get(), metadata_size_above_hard_limit, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -337,8 +334,7 @@ static void test_request_with_large_metadata_soft_limit_overrides_default_hard(
send_metadata(f.get(), metadata_size_between_limits, &client_details);
if (status == GRPC_STATUS_RESOURCE_EXHAUSTED) {
num_requests_rejected++;
const char* expected_error =
"received initial metadata size exceeds soft limit";
const char* expected_error = "received metadata size exceeds soft limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand All @@ -358,8 +354,7 @@ static void test_request_with_large_metadata_soft_limit_overrides_default_hard(
auto status =
send_metadata(f.get(), metadata_size_above_hard_limit, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -404,8 +399,7 @@ static void test_request_with_large_metadata_hard_limit_overrides_default_soft(
send_metadata(f.get(), metadata_size_between_limits, &client_details);
if (status == GRPC_STATUS_RESOURCE_EXHAUSTED) {
num_requests_rejected++;
const char* expected_error =
"received initial metadata size exceeds soft limit";
const char* expected_error = "received metadata size exceeds soft limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand All @@ -425,8 +419,7 @@ static void test_request_with_large_metadata_hard_limit_overrides_default_soft(
auto status =
send_metadata(f.get(), metadata_size_above_hard_limit, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -467,8 +460,7 @@ static void test_request_with_large_metadata_hard_limit_below_default_hard(
auto status =
send_metadata(f.get(), metadata_size_above_hard_limit, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down Expand Up @@ -512,8 +504,7 @@ static void test_request_with_large_metadata_soft_limit_below_default_soft(
send_metadata(f.get(), metadata_size_between_limits, &client_details);
if (status == GRPC_STATUS_RESOURCE_EXHAUSTED) {
num_requests_rejected++;
const char* expected_error =
"received initial metadata size exceeds soft limit";
const char* expected_error = "received metadata size exceeds soft limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand All @@ -533,8 +524,7 @@ static void test_request_with_large_metadata_soft_limit_below_default_soft(
auto status =
send_metadata(f.get(), metadata_size_above_hard_limit, &client_details);
GPR_ASSERT(status == GRPC_STATUS_RESOURCE_EXHAUSTED);
const char* expected_error =
"received initial metadata size exceeds hard limit";
const char* expected_error = "received metadata size exceeds hard limit";
grpc_slice actual_error =
grpc_slice_split_head(&client_details, strlen(expected_error));
GPR_ASSERT(0 == grpc_slice_str_cmp(actual_error, expected_error));
Expand Down

0 comments on commit 72abe13

Please sign in to comment.