Merge pull request #19725 from arjunroy/ch2_parser_mdkey_intern

CH2 interned metadata key parsing fastpath.
pull/19389/head
Arjun Roy 6 years ago committed by GitHub
commit dce35449c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 43
      src/core/ext/transport/chttp2/transport/parsing.cc

@ -394,6 +394,32 @@ error_handler:
static void free_timeout(void* p) { gpr_free(p); }
static bool md_key_cmp(grpc_mdelem md, const grpc_slice& reference) {
GPR_DEBUG_ASSERT(grpc_slice_is_interned(GRPC_MDKEY(md)));
return GRPC_MDKEY(md).refcount == reference.refcount;
}
static bool md_cmp(grpc_mdelem md, grpc_mdelem ref_md,
const grpc_slice& ref_key) {
if (GPR_LIKELY(GRPC_MDELEM_IS_INTERNED(md))) {
return md.payload == ref_md.payload;
}
if (md_key_cmp(md, ref_key)) {
return grpc_slice_eq_static_interned(GRPC_MDVALUE(md),
GRPC_MDVALUE(ref_md));
}
return false;
}
static bool is_nonzero_status(grpc_mdelem md) {
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
// TODO(ctiller): check for a status like " 0"
return md_key_cmp(md, GRPC_MDSTR_GRPC_STATUS) &&
!md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS);
}
static void on_initial_header(void* tp, grpc_mdelem md) {
GPR_TIMER_SCOPE("on_initial_header", 0);
@ -411,15 +437,9 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
gpr_free(value);
}
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
/* TODO(ctiller): check for a status like " 0" */
if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
s->seen_error = true;
} else if (grpc_slice_eq_static_interned(GRPC_MDKEY(md),
GRPC_MDSTR_GRPC_TIMEOUT)) {
} else if (md_key_cmp(md, GRPC_MDSTR_GRPC_TIMEOUT)) {
grpc_millis* cached_timeout =
static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
grpc_millis timeout;
@ -496,12 +516,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
gpr_free(value);
}
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
/* TODO(ctiller): check for a status like " 0" */
if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
s->seen_error = true;
}

Loading…
Cancel
Save