diff --git a/BUILD b/BUILD index cecfdba453f..2c542758068 100644 --- a/BUILD +++ b/BUILD @@ -1854,6 +1854,7 @@ grpc_cc_library( "src/core/lib/transport/error_utils.cc", "src/core/lib/transport/metadata.cc", "src/core/lib/transport/metadata_batch.cc", + "src/core/lib/transport/parsed_metadata.cc", "src/core/lib/transport/pid_controller.cc", "src/core/lib/transport/static_metadata.cc", "src/core/lib/transport/status_conversion.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index 521545a742b..e8d8c2b5a26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2054,6 +2054,7 @@ add_library(grpc src/core/lib/transport/error_utils.cc src/core/lib/transport/metadata.cc src/core/lib/transport/metadata_batch.cc + src/core/lib/transport/parsed_metadata.cc src/core/lib/transport/pid_controller.cc src/core/lib/transport/static_metadata.cc src/core/lib/transport/status_conversion.cc @@ -2643,6 +2644,7 @@ add_library(grpc_unsecure src/core/lib/transport/error_utils.cc src/core/lib/transport/metadata.cc src/core/lib/transport/metadata_batch.cc + src/core/lib/transport/parsed_metadata.cc src/core/lib/transport/pid_controller.cc src/core/lib/transport/static_metadata.cc src/core/lib/transport/status_conversion.cc diff --git a/Makefile b/Makefile index 2523b8c6eaa..b3d9f6ee3ec 100644 --- a/Makefile +++ b/Makefile @@ -1589,6 +1589,7 @@ LIBGRPC_SRC = \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/parsed_metadata.cc \ src/core/lib/transport/pid_controller.cc \ src/core/lib/transport/static_metadata.cc \ src/core/lib/transport/status_conversion.cc \ @@ -2026,6 +2027,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/parsed_metadata.cc \ src/core/lib/transport/pid_controller.cc \ src/core/lib/transport/static_metadata.cc \ src/core/lib/transport/status_conversion.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index f3f968aef14..56c9a93b1e3 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1527,6 +1527,7 @@ libs: - src/core/lib/transport/error_utils.cc - src/core/lib/transport/metadata.cc - src/core/lib/transport/metadata_batch.cc + - src/core/lib/transport/parsed_metadata.cc - src/core/lib/transport/pid_controller.cc - src/core/lib/transport/static_metadata.cc - src/core/lib/transport/status_conversion.cc @@ -2268,6 +2269,7 @@ libs: - src/core/lib/transport/error_utils.cc - src/core/lib/transport/metadata.cc - src/core/lib/transport/metadata_batch.cc + - src/core/lib/transport/parsed_metadata.cc - src/core/lib/transport/pid_controller.cc - src/core/lib/transport/static_metadata.cc - src/core/lib/transport/status_conversion.cc diff --git a/config.m4 b/config.m4 index 9ed147cd2d9..1b3e6d89107 100644 --- a/config.m4 +++ b/config.m4 @@ -642,6 +642,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/transport/error_utils.cc \ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/parsed_metadata.cc \ src/core/lib/transport/pid_controller.cc \ src/core/lib/transport/static_metadata.cc \ src/core/lib/transport/status_conversion.cc \ diff --git a/config.w32 b/config.w32 index 328f6540146..b1c51f95cd8 100644 --- a/config.w32 +++ b/config.w32 @@ -608,6 +608,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\transport\\error_utils.cc " + "src\\core\\lib\\transport\\metadata.cc " + "src\\core\\lib\\transport\\metadata_batch.cc " + + "src\\core\\lib\\transport\\parsed_metadata.cc " + "src\\core\\lib\\transport\\pid_controller.cc " + "src\\core\\lib\\transport\\static_metadata.cc " + "src\\core\\lib\\transport\\status_conversion.cc " + diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 2bf1af977e4..e97bccc3a87 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1345,6 +1345,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/metadata.h', 'src/core/lib/transport/metadata_batch.cc', 'src/core/lib/transport/metadata_batch.h', + 'src/core/lib/transport/parsed_metadata.cc', 'src/core/lib/transport/parsed_metadata.h', 'src/core/lib/transport/pid_controller.cc', 'src/core/lib/transport/pid_controller.h', diff --git a/grpc.gemspec b/grpc.gemspec index 6c28818ba25..3afdc4b7614 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1265,6 +1265,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/transport/metadata.h ) s.files += %w( src/core/lib/transport/metadata_batch.cc ) s.files += %w( src/core/lib/transport/metadata_batch.h ) + s.files += %w( src/core/lib/transport/parsed_metadata.cc ) s.files += %w( src/core/lib/transport/parsed_metadata.h ) s.files += %w( src/core/lib/transport/pid_controller.cc ) s.files += %w( src/core/lib/transport/pid_controller.h ) diff --git a/grpc.gyp b/grpc.gyp index 3a706eb0b4a..adc85f4796d 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -1030,6 +1030,7 @@ 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/metadata.cc', 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/parsed_metadata.cc', 'src/core/lib/transport/pid_controller.cc', 'src/core/lib/transport/static_metadata.cc', 'src/core/lib/transport/status_conversion.cc', @@ -1439,6 +1440,7 @@ 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/metadata.cc', 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/parsed_metadata.cc', 'src/core/lib/transport/pid_controller.cc', 'src/core/lib/transport/static_metadata.cc', 'src/core/lib/transport/status_conversion.cc', diff --git a/package.xml b/package.xml index accda420afa..94b640605f0 100644 --- a/package.xml +++ b/package.xml @@ -1245,6 +1245,7 @@ + diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc index fb6c2f73131..0545e0e6e7b 100644 --- a/src/core/ext/filters/client_channel/backend_metric.cc +++ b/src/core/ext/filters/client_channel/backend_metric.cc @@ -49,12 +49,11 @@ std::map ParseMap( } // namespace const LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData* -ParseBackendMetricData(const grpc_slice& serialized_load_report, Arena* arena) { +ParseBackendMetricData(const Slice& serialized_load_report, Arena* arena) { upb::Arena upb_arena; xds_data_orca_v3_OrcaLoadReport* msg = xds_data_orca_v3_OrcaLoadReport_parse( - reinterpret_cast( - GRPC_SLICE_START_PTR(serialized_load_report)), - GRPC_SLICE_LENGTH(serialized_load_report), upb_arena.ptr()); + reinterpret_cast(serialized_load_report.begin()), + serialized_load_report.size(), upb_arena.ptr()); if (msg == nullptr) return nullptr; auto* backend_metric_data = arena->New< LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData>(); diff --git a/src/core/ext/filters/client_channel/backend_metric.h b/src/core/ext/filters/client_channel/backend_metric.h index 47fb1e21c53..64f8ef61570 100644 --- a/src/core/ext/filters/client_channel/backend_metric.h +++ b/src/core/ext/filters/client_channel/backend_metric.h @@ -23,13 +23,14 @@ #include "src/core/ext/filters/client_channel/lb_policy.h" #include "src/core/lib/gprpp/arena.h" +#include "src/core/lib/slice/slice.h" namespace grpc_core { // Parses the serialized load report and allocates a BackendMetricData // object on the arena. const LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData* -ParseBackendMetricData(const grpc_slice& serialized_load_report, Arena* arena); +ParseBackendMetricData(const Slice& serialized_load_report, Arena* arena); } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 30707e06ab7..755b0b9c505 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -2506,11 +2506,10 @@ class ClientChannel::LoadBalancedCall::BackendMetricAccessor const BackendMetricData* GetBackendMetricData() override { if (lb_call_->backend_metric_data_ == nullptr) { - grpc_linked_mdelem* md = lb_call_->recv_trailing_metadata_->legacy_index() - ->named.x_endpoint_load_metrics_bin; - if (md != nullptr) { + if (const auto* md = lb_call_->recv_trailing_metadata_->get_pointer( + XEndpointLoadMetricsBinMetadata())) { lb_call_->backend_metric_data_ = - ParseBackendMetricData(GRPC_MDVALUE(md->md), lb_call_->arena_); + ParseBackendMetricData(*md, lb_call_->arena_); } } return lb_call_->backend_metric_data_; @@ -2877,14 +2876,15 @@ void ClientChannel::LoadBalancedCall::RecvTrailingMetadataReady( status = absl::Status(static_cast(code), message); } else { // Get status from headers. - const auto& fields = self->recv_trailing_metadata_->legacy_index()->named; + const auto& md = *self->recv_trailing_metadata_; + const auto& fields = md.legacy_index()->named; GPR_ASSERT(fields.grpc_status != nullptr); grpc_status_code code = grpc_get_status_code_from_metadata(fields.grpc_status->md); if (code != GRPC_STATUS_OK) { absl::string_view message; - if (fields.grpc_message != nullptr) { - message = StringViewFromSlice(GRPC_MDVALUE(fields.grpc_message->md)); + if (const auto* grpc_message = md.get_pointer(GrpcMessageMetadata())) { + message = grpc_message->as_string_view(); } status = absl::Status(static_cast(code), message); } diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc index 37fb8f1fe06..84a9f2ecee7 100644 --- a/src/core/ext/filters/http/client/http_client_filter.cc +++ b/src/core/ext/filters/http/client/http_client_filter.cc @@ -138,17 +138,10 @@ static grpc_error_handle client_filter_incoming_metadata( } } - if (b->legacy_index()->named.grpc_message != nullptr) { - grpc_slice pct_decoded_msg = grpc_core::PermissivePercentDecodeSlice( - GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md)); - if (grpc_slice_is_equivalent( - pct_decoded_msg, - GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md))) { - grpc_slice_unref_internal(pct_decoded_msg); - } else { - grpc_metadata_batch_set_value(b->legacy_index()->named.grpc_message, - pct_decoded_msg); - } + if (grpc_core::Slice* grpc_message = + b->get_pointer(grpc_core::GrpcMessageMetadata())) { + *grpc_message = + grpc_core::PermissivePercentDecodeSlice(std::move(*grpc_message)); } if (b->legacy_index()->named.content_type != nullptr) { diff --git a/src/core/ext/filters/http/server/http_server_filter.cc b/src/core/ext/filters/http/server/http_server_filter.cc index abf6d190077..2c63fe47748 100644 --- a/src/core/ext/filters/http/server/http_server_filter.cc +++ b/src/core/ext/filters/http/server/http_server_filter.cc @@ -104,18 +104,10 @@ struct channel_data { } // namespace static grpc_error_handle hs_filter_outgoing_metadata(grpc_metadata_batch* b) { - if (b->legacy_index()->named.grpc_message != nullptr) { - grpc_slice pct_encoded_msg = grpc_core::PercentEncodeSlice( - GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md), - grpc_core::PercentEncodingType::Compatible); - if (grpc_slice_is_equivalent( - pct_encoded_msg, - GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md))) { - grpc_slice_unref_internal(pct_encoded_msg); - } else { - grpc_metadata_batch_set_value(b->legacy_index()->named.grpc_message, - pct_encoded_msg); - } + if (grpc_core::Slice* grpc_message = + b->get_pointer(grpc_core::GrpcMessageMetadata())) { + *grpc_message = grpc_core::PercentEncodeSlice( + std::move(*grpc_message), grpc_core::PercentEncodingType::Compatible); } return GRPC_ERROR_NONE; } @@ -306,19 +298,11 @@ static grpc_error_handle hs_filter_incoming_metadata(grpc_call_element* elem, } } - if (b->legacy_index()->named.host != nullptr && - b->legacy_index()->named.authority == nullptr) { - grpc_linked_mdelem* el = b->legacy_index()->named.host; - grpc_mdelem md = GRPC_MDELEM_REF(el->md); - b->Remove(el); - hs_add_error( - error_name, &error, - grpc_metadata_batch_add_head( - b, el, - grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY, - grpc_slice_ref_internal(GRPC_MDVALUE(md))), - GRPC_BATCH_AUTHORITY)); - GRPC_MDELEM_UNREF(md); + if (b->legacy_index()->named.authority == nullptr) { + absl::optional host = b->Take(grpc_core::HostMetadata()); + if (host.has_value()) { + b->Append(":authority", std::move(*host)); + } } if (b->legacy_index()->named.authority == nullptr) { diff --git a/src/core/ext/transport/binder/transport/binder_transport.cc b/src/core/ext/transport/binder/transport/binder_transport.cc index 1d0f94edfa2..f90d9ae34a4 100644 --- a/src/core/ext/transport/binder/transport/binder_transport.cc +++ b/src/core/ext/transport/binder/transport/binder_transport.cc @@ -319,6 +319,52 @@ static void recv_trailing_metadata_locked(void* arg, GRPC_BINDER_STREAM_UNREF(gbs, "recv_trailing_metadata"); } +namespace grpc_binder { +namespace { + +class MetadataEncoder { + public: + MetadataEncoder(bool is_client, Transaction* tx, Metadata* init_md) + : is_client_(is_client), tx_(tx), init_md_(init_md) {} + + void Encode(grpc_mdelem md) { + absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md)); + absl::string_view value = grpc_core::StringViewFromSlice(GRPC_MDVALUE(md)); + gpr_log(GPR_INFO, "send metadata key-value %s", + absl::StrCat(key, " ", value).c_str()); + if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_PATH)) { + // TODO(b/192208403): Figure out if it is correct to simply drop '/' + // prefix and treat it as rpc method name + GPR_ASSERT(value[0] == '/'); + std::string path = std::string(value).substr(1); + + // Only client send method ref. + GPR_ASSERT(is_client_); + tx_->SetMethodRef(path); + } else if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS)) { + int status = grpc_get_status_code_from_metadata(md); + gpr_log(GPR_INFO, "send trailing metadata status = %d", status); + tx_->SetStatus(status); + } else { + init_md_->emplace_back(std::string(key), std::string(value)); + } + } + + template + void Encode(Trait, const typename Trait::ValueType& value) { + init_md_->emplace_back(std::string(Trait::key()), + std::string(Trait::Encode(value).as_string_view())); + } + + private: + const bool is_client_; + Transaction* const tx_; + Metadata* const init_md_; +}; + +} // namespace +} // namespace grpc_binder + static void perform_stream_op_locked(void* stream_op, grpc_error_handle /*error*/) { grpc_transport_stream_op_batch* op = @@ -386,25 +432,8 @@ static void perform_stream_op_locked(void* stream_op, grpc_binder::Metadata init_md; auto batch = op->payload->send_initial_metadata.send_initial_metadata; - batch->ForEach([&](grpc_mdelem md) { - absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md)); - absl::string_view value = - grpc_core::StringViewFromSlice(GRPC_MDVALUE(md)); - gpr_log(GPR_INFO, "send initial metatday key-value %s", - absl::StrCat(key, " ", value).c_str()); - if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_PATH)) { - // TODO(b/192208403): Figure out if it is correct to simply drop '/' - // prefix and treat it as rpc method name - GPR_ASSERT(value[0] == '/'); - std::string path = std::string(value).substr(1); - - // Only client send method ref. - GPR_ASSERT(gbt->is_client); - tx.SetMethodRef(path); - } else { - init_md.emplace_back(std::string(key), std::string(value)); - } - }); + grpc_binder::MetadataEncoder encoder(gbt->is_client, &tx, &init_md); + batch->Encode(&encoder); tx.SetPrefix(init_md); } if (op->send_message) { @@ -438,23 +467,10 @@ static void perform_stream_op_locked(void* stream_op, auto batch = op->payload->send_trailing_metadata.send_trailing_metadata; grpc_binder::Metadata trailing_metadata; - batch->ForEach([&](grpc_mdelem md) { - // Client will not send trailing metadata. - GPR_ASSERT(!gbt->is_client); + grpc_binder::MetadataEncoder encoder(gbt->is_client, &tx, + &trailing_metadata); + batch->Encode(&encoder); - if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS)) { - int status = grpc_get_status_code_from_metadata(md); - gpr_log(GPR_INFO, "send trailing metadata status = %d", status); - tx.SetStatus(status); - } else { - absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md)); - absl::string_view value = - grpc_core::StringViewFromSlice(GRPC_MDVALUE(md)); - gpr_log(GPR_INFO, "send trailing metatday key-value %s", - absl::StrCat(key, " ", value).c_str()); - trailing_metadata.emplace_back(std::string(key), std::string(value)); - } - }); // TODO(mingcl): Will we ever has key-value pair here? According to // wireformat client suffix data is always empty. tx.SetSuffix(trailing_metadata); diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 0e3eccb1a19..d3c7c0e25e1 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -2102,10 +2102,9 @@ void grpc_chttp2_fake_status(grpc_chttp2_transport* t, grpc_chttp2_stream* s, GRPC_MDSTR_GRPC_STATUS, grpc_core::UnmanagedMemorySlice(status_string))); if (!message.empty()) { - grpc_slice message_slice = grpc_slice_from_cpp_string(std::move(message)); - GRPC_LOG_IF_ERROR("add_status_message", - s->trailing_metadata_buffer.ReplaceOrAppend( - GRPC_MDSTR_GRPC_MESSAGE, message_slice)); + s->trailing_metadata_buffer.Set( + grpc_core::GrpcMessageMetadata(), + grpc_core::Slice::FromCopiedBuffer(message)); } s->published_metadata[1] = GRPC_METADATA_SYNTHESIZED_FROM_FAKE; grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s); diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc index d70a30cc683..f7e740b5e99 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc @@ -265,6 +265,32 @@ class StringValue { VarintWriter<1> len_val_; }; +class BinaryStringValue { + public: + explicit BinaryStringValue(const grpc_slice& value, + bool use_true_binary_metadata) + : wire_value_(GetWireValue(value, use_true_binary_metadata, true)), + len_val_(wire_value_.length) {} + + size_t prefix_length() const { + return len_val_.length() + + (wire_value_.insert_null_before_wire_value ? 1 : 0); + } + + void WritePrefix(uint8_t* prefix_data) { + len_val_.Write(wire_value_.huffman_prefix, prefix_data); + if (wire_value_.insert_null_before_wire_value) { + prefix_data[len_val_.length()] = 0; + } + } + + const grpc_slice& data() { return wire_value_.data; } + + private: + WireValue wire_value_; + VarintWriter<1> len_val_; +}; + class NonBinaryStringValue { public: explicit NonBinaryStringValue(const grpc_slice& value) @@ -356,6 +382,30 @@ void HPackCompressor::Framer::EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem) { Add(emit.data()); } +void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyNotIdx( + const grpc_slice& key_slice, const grpc_slice& value_slice) { + GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V(); + GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED(); + StringKey key(key_slice); + key.WritePrefix(0x00, AddTiny(key.prefix_length())); + Add(grpc_slice_ref_internal(key.key())); + BinaryStringValue emit(value_slice, use_true_binary_metadata_); + emit.WritePrefix(AddTiny(emit.prefix_length())); + Add(emit.data()); +} + +void HPackCompressor::Framer::EmitLitHdrWithNonBinaryStringKeyNotIdx( + const grpc_slice& key_slice, const grpc_slice& value_slice) { + GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V(); + GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED(); + StringKey key(key_slice); + key.WritePrefix(0x00, AddTiny(key.prefix_length())); + Add(grpc_slice_ref_internal(key.key())); + NonBinaryStringValue emit(value_slice); + emit.WritePrefix(AddTiny(emit.prefix_length())); + Add(grpc_slice_ref_internal(emit.data())); +} + void HPackCompressor::Framer::AdvertiseTableSizeChange() { VarintWriter<3> w(compressor_->table_.max_size()); w.Write(0x20, AddTiny(w.length())); diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.h b/src/core/ext/transport/chttp2/transport/hpack_encoder.h index 0702a391b53..9335520c6f1 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_encoder.h +++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.h @@ -120,6 +120,24 @@ class HPackCompressor { void Encode(GrpcTimeoutMetadata, grpc_millis deadline); void Encode(TeMetadata, TeMetadata::ValueType value); void Encode(UserAgentMetadata, const Slice& slice); + void Encode(GrpcMessageMetadata, const Slice& slice) { + if (slice.empty()) return; + EmitLitHdrWithNonBinaryStringKeyNotIdx( + StaticSlice::FromStaticString("grpc-message").c_slice(), + slice.c_slice()); + } + template + void Encode(Which, const Slice& slice) { + if (absl::EndsWith(Which::key(), "-bin")) { + EmitLitHdrWithBinaryStringKeyNotIdx( + StaticSlice::FromStaticString(Which::key()).c_slice(), + slice.c_slice()); + } else { + EmitLitHdrWithNonBinaryStringKeyNotIdx( + StaticSlice::FromStaticString(Which::key()).c_slice(), + slice.c_slice()); + } + } private: struct FramePrefix { @@ -144,6 +162,10 @@ class HPackCompressor { void EmitLitHdrWithStringKeyIncIdx(grpc_mdelem elem); void EmitLitHdrWithNonBinaryStringKeyIncIdx(const grpc_slice& key_slice, const grpc_slice& value_slice); + void EmitLitHdrWithBinaryStringKeyNotIdx(const grpc_slice& key_slice, + const grpc_slice& value_slice); + void EmitLitHdrWithNonBinaryStringKeyNotIdx(const grpc_slice& key_slice, + const grpc_slice& value_slice); void EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem); void EncodeAlwaysIndexed(uint32_t* index, const grpc_slice& key, diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.cc b/src/core/ext/transport/chttp2/transport/hpack_parser.cc index ec0910c39f7..97efeab40e4 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.cc @@ -1219,6 +1219,7 @@ class HPackParser::Parser { " vs. %" PRIu32 "). GRPC_ARG_MAX_METADATA_SIZE can be set to increase this limit.", *frame_length_, metadata_size_limit_); + if (metadata_buffer_ != nullptr) metadata_buffer_->Clear(); return input_->MaybeSetErrorAndReturn( [] { return grpc_error_set_int( diff --git a/src/core/lib/security/authorization/cel_authorization_engine.cc b/src/core/lib/security/authorization/cel_authorization_engine.cc index a5d0a92e671..2f3b3ac0b41 100644 --- a/src/core/lib/security/authorization/cel_authorization_engine.cc +++ b/src/core/lib/security/authorization/cel_authorization_engine.cc @@ -115,17 +115,17 @@ std::unique_ptr CelAuthorizationEngine::CreateActivation( mock_cel::CelValue::CreateStringView(method)); } } else if (elem == kHeaders) { - std::multimap headers = - args.GetHeaders(); std::vector> header_items; for (const auto& header_key : header_keys_) { - auto header_item = headers.find(header_key); - if (header_item != headers.end()) { + std::string temp_value; + absl::optional header_value = + args.GetHeaderValue(header_key, &temp_value); + if (header_value.has_value()) { header_items.push_back( std::pair( mock_cel::CelValue::CreateStringView(header_key), - mock_cel::CelValue::CreateStringView(header_item->second))); + mock_cel::CelValue::CreateStringView(*header_value))); } } headers_ = mock_cel::ContainerBackedMapImpl::Create( diff --git a/src/core/lib/security/authorization/evaluate_args.cc b/src/core/lib/security/authorization/evaluate_args.cc index 80b713c03dd..b57f0d97252 100644 --- a/src/core/lib/security/authorization/evaluate_args.cc +++ b/src/core/lib/security/authorization/evaluate_args.cc @@ -91,11 +91,10 @@ absl::string_view EvaluateArgs::GetPath() const { absl::string_view EvaluateArgs::GetHost() const { absl::string_view host; - if (metadata_ != nullptr && - metadata_->legacy_index()->named.host != nullptr) { - grpc_linked_mdelem* elem = metadata_->legacy_index()->named.host; - const grpc_slice& val = GRPC_MDVALUE(elem->md); - host = StringViewFromSlice(val); + if (metadata_ != nullptr) { + if (auto* host_md = metadata_->get_pointer(HostMetadata())) { + host = host_md->as_string_view(); + } } return host; } @@ -111,20 +110,6 @@ absl::string_view EvaluateArgs::GetMethod() const { return method; } -std::multimap EvaluateArgs::GetHeaders() - const { - std::multimap headers; - if (metadata_ == nullptr) { - return headers; - } - metadata_->ForEach([&](grpc_mdelem md) { - const grpc_slice& key = GRPC_MDKEY(md); - const grpc_slice& val = GRPC_MDVALUE(md); - headers.emplace(StringViewFromSlice(key), StringViewFromSlice(val)); - }); - return headers; -} - absl::optional EvaluateArgs::GetHeaderValue( absl::string_view key, std::string* concatenated_value) const { if (metadata_ == nullptr) { diff --git a/src/core/lib/security/authorization/evaluate_args.h b/src/core/lib/security/authorization/evaluate_args.h index 3c345b3a8df..36ff38f4148 100644 --- a/src/core/lib/security/authorization/evaluate_args.h +++ b/src/core/lib/security/authorization/evaluate_args.h @@ -58,7 +58,6 @@ class EvaluateArgs { absl::string_view GetPath() const; absl::string_view GetHost() const; absl::string_view GetMethod() const; - std::multimap GetHeaders() const; // Returns metadata value(s) for the specified key. // If the key is not present in the batch, returns absl::nullopt. // If the key is present exactly once in the batch, returns a string_view of diff --git a/src/core/lib/slice/percent_encoding.cc b/src/core/lib/slice/percent_encoding.cc index 257ed137c53..98e17bc5027 100644 --- a/src/core/lib/slice/percent_encoding.cc +++ b/src/core/lib/slice/percent_encoding.cc @@ -78,135 +78,79 @@ const BitSet<256>& LookupTableForPercentEncodingType(PercentEncodingType type) { } } // namespace -grpc_slice PercentEncodeSlice(const grpc_slice& slice, - PercentEncodingType type) { +Slice PercentEncodeSlice(Slice slice, PercentEncodingType type) { static const uint8_t hex[] = "0123456789ABCDEF"; const BitSet<256>& lut = LookupTableForPercentEncodingType(type); // first pass: count the number of bytes needed to output this string size_t output_length = 0; - const uint8_t* slice_start = GRPC_SLICE_START_PTR(slice); - const uint8_t* slice_end = GRPC_SLICE_END_PTR(slice); - const uint8_t* p; bool any_reserved_bytes = false; - for (p = slice_start; p < slice_end; p++) { - bool unres = lut.is_set(*p); + for (uint8_t c : slice) { + bool unres = lut.is_set(c); output_length += unres ? 1 : 3; any_reserved_bytes |= !unres; } // no unreserved bytes: return the string unmodified if (!any_reserved_bytes) { - return grpc_slice_ref_internal(slice); + return slice; } // second pass: actually encode - grpc_slice out = GRPC_SLICE_MALLOC(output_length); - uint8_t* q = GRPC_SLICE_START_PTR(out); - for (p = slice_start; p < slice_end; p++) { - if (lut.is_set(*p)) { - *q++ = *p; + auto out = MutableSlice::CreateUninitialized(output_length); + uint8_t* q = out.begin(); + for (uint8_t c : slice) { + if (lut.is_set(c)) { + *q++ = c; } else { *q++ = '%'; - *q++ = hex[*p >> 4]; - *q++ = hex[*p & 15]; + *q++ = hex[c >> 4]; + *q++ = hex[c & 15]; } } - GPR_ASSERT(q == GRPC_SLICE_END_PTR(out)); - return out; + GPR_ASSERT(q == out.end()); + return Slice(std::move(out)); } -static bool valid_hex(const uint8_t* p, const uint8_t* end) { +static bool ValidHex(const uint8_t* p, const uint8_t* end) { if (p >= end) return false; return (*p >= '0' && *p <= '9') || (*p >= 'a' && *p <= 'f') || (*p >= 'A' && *p <= 'F'); } -static uint8_t dehex(uint8_t c) { +static uint8_t DeHex(uint8_t c) { if (c >= '0' && c <= '9') return static_cast(c - '0'); if (c >= 'A' && c <= 'F') return static_cast(c - 'A' + 10); if (c >= 'a' && c <= 'f') return static_cast(c - 'a' + 10); GPR_UNREACHABLE_CODE(return 255); } -absl::optional PercentDecodeSlice(const grpc_slice& slice_in, - PercentEncodingType type) { - const uint8_t* p = GRPC_SLICE_START_PTR(slice_in); - const uint8_t* in_end = GRPC_SLICE_END_PTR(slice_in); - size_t out_length = 0; +Slice PermissivePercentDecodeSlice(Slice slice_in) { bool any_percent_encoded_stuff = false; - const BitSet<256>& lut = LookupTableForPercentEncodingType(type); - while (p != in_end) { - if (*p == '%') { - if (!valid_hex(++p, in_end)) return {}; - if (!valid_hex(++p, in_end)) return {}; - p++; - out_length++; + for (uint8_t c : slice_in) { + if (c == '%') { any_percent_encoded_stuff = true; - } else if (lut.is_set(*p)) { - p++; - out_length++; - } else { - return {}; - } - } - if (!any_percent_encoded_stuff) { - return grpc_slice_ref_internal(slice_in); - } - p = GRPC_SLICE_START_PTR(slice_in); - grpc_slice slice_out = GRPC_SLICE_MALLOC(out_length); - uint8_t* q = GRPC_SLICE_START_PTR(slice_out); - while (p != in_end) { - if (*p == '%') { - *q++ = static_cast(dehex(p[1]) << 4) | (dehex(p[2])); - p += 3; - } else { - *q++ = *p++; + break; } } - GPR_ASSERT(q == GRPC_SLICE_END_PTR(slice_out)); - return slice_out; -} + if (!any_percent_encoded_stuff) return slice_in; -grpc_slice PermissivePercentDecodeSlice(const grpc_slice& slice_in) { - const uint8_t* p = GRPC_SLICE_START_PTR(slice_in); - const uint8_t* in_end = GRPC_SLICE_END_PTR(slice_in); - size_t out_length = 0; - bool any_percent_encoded_stuff = false; - while (p != in_end) { - if (*p == '%') { - if (!valid_hex(p + 1, in_end) || !valid_hex(p + 2, in_end)) { - p++; - out_length++; - } else { - p += 3; - out_length++; - any_percent_encoded_stuff = true; - } - } else { - p++; - out_length++; - } - } - if (!any_percent_encoded_stuff) { - return grpc_slice_ref_internal(slice_in); - } - p = GRPC_SLICE_START_PTR(slice_in); - grpc_slice out = GRPC_SLICE_MALLOC(out_length); - uint8_t* q = GRPC_SLICE_START_PTR(out); - while (p != in_end) { + MutableSlice out = slice_in.TakeMutable(); + uint8_t* q = out.begin(); + const uint8_t* p = out.begin(); + const uint8_t* end = out.end(); + while (p != end) { if (*p == '%') { - if (!valid_hex(p + 1, in_end) || !valid_hex(p + 2, in_end)) { + if (!ValidHex(p + 1, end) || !ValidHex(p + 2, end)) { *q++ = *p++; } else { - *q++ = static_cast(dehex(p[1]) << 4) | (dehex(p[2])); + *q++ = static_cast(DeHex(p[1]) << 4) | (DeHex(p[2])); p += 3; } } else { *q++ = *p++; } } - GPR_ASSERT(q == GRPC_SLICE_END_PTR(out)); - return out; + return Slice(out.TakeSubSlice(0, q - out.begin())); } } // namespace grpc_core diff --git a/src/core/lib/slice/percent_encoding.h b/src/core/lib/slice/percent_encoding.h index 2cc85c50b85..830ef025c43 100644 --- a/src/core/lib/slice/percent_encoding.h +++ b/src/core/lib/slice/percent_encoding.h @@ -34,32 +34,26 @@ #include +#include "src/core/lib/slice/slice.h" + namespace grpc_core { enum class PercentEncodingType { // Flags [A-Za-z0-9-_.~] as unreserved bytes for the percent encoding routines URL, // Flags ascii7 non-control characters excluding '%' as unreserved bytes for - // the - // percent encoding routines + // the percent encoding routines Compatible }; // Percent-encode a slice, returning the new slice (this cannot fail): // unreserved_bytes is a bitfield indicating which bytes are considered // unreserved and thus do not need percent encoding -grpc_slice PercentEncodeSlice(const grpc_slice& slice, - PercentEncodingType type); -// Percent-decode a slice, strictly. -// If the input is legal (contains no unreserved bytes, and legal % encodings), -// returns the decoded slice. -// If the input is not legal, returns {}. -absl::optional PercentDecodeSlice(const grpc_slice& slice_in, - PercentEncodingType type); +Slice PercentEncodeSlice(Slice slice, PercentEncodingType type); // Percent-decode a slice, permissively. // If a % triplet can not be decoded, pass it through verbatim. // This cannot fail. -grpc_slice PermissivePercentDecodeSlice(const grpc_slice& slice_in); +Slice PermissivePercentDecodeSlice(Slice slice_in); } // namespace grpc_core diff --git a/src/core/lib/slice/slice.h b/src/core/lib/slice/slice.h index 6e315ed5fbd..0bb7ec16d00 100644 --- a/src/core/lib/slice/slice.h +++ b/src/core/lib/slice/slice.h @@ -162,10 +162,14 @@ struct CopyConstructors { static Out FromCopiedString(std::string s) { return Out(grpc_slice_from_cpp_string(std::move(s))); } + static Out FromCopiedBuffer(const char* p, size_t len) { + return Out(UnmanagedMemorySlice(p, len)); + } + template static Out FromCopiedBuffer(const Buffer& buffer) { - return Out(UnmanagedMemorySlice( - reinterpret_cast(buffer.data()), buffer.size())); + return FromCopiedBuffer(reinterpret_cast(buffer.data()), + buffer.size()); } }; @@ -187,6 +191,10 @@ class StaticSlice : public slice_detail::BaseSlice { return StaticSlice(grpc_slice_from_static_string(s)); } + static StaticSlice FromStaticString(absl::string_view s) { + return StaticSlice(ExternallyManagedSlice(s.data(), s.size())); + } + StaticSlice(const StaticSlice& other) : slice_detail::BaseSlice(other.c_slice()) {} StaticSlice& operator=(const StaticSlice& other) { @@ -221,6 +229,16 @@ class MutableSlice : public slice_detail::BaseSlice, return *this; } + static MutableSlice CreateUninitialized(size_t length) { + return MutableSlice(grpc_slice_malloc(length)); + } + + // Return a sub slice of this one. Leaves this slice in an indeterminate but + // valid state. + MutableSlice TakeSubSlice(size_t pos, size_t n) { + return MutableSlice(grpc_slice_sub_no_ref(TakeCSlice(), pos, pos + n)); + } + // Iterator access to the underlying bytes uint8_t* begin() { return mutable_data(); } uint8_t* end() { return mutable_data() + size(); } @@ -235,10 +253,7 @@ class Slice : public slice_detail::BaseSlice, Slice() = default; ~Slice() { grpc_slice_unref_internal(c_slice()); } explicit Slice(const grpc_slice& slice) : slice_detail::BaseSlice(slice) {} - template - explicit Slice(absl::enable_if_t< - std::is_base_of::value, - SliceType>&& other) + explicit Slice(slice_detail::BaseSlice&& other) : slice_detail::BaseSlice(other.TakeCSlice()) {} Slice(const Slice&) = delete; @@ -300,6 +315,12 @@ class Slice : public slice_detail::BaseSlice, return MutableSlice(grpc_slice_copy(c_slice())); } + // Return a sub slice of this one. Leaves this slice in an indeterminate but + // valid state. + Slice TakeSubSlice(size_t pos, size_t n) { + return Slice(grpc_slice_sub_no_ref(TakeCSlice(), pos, pos + n)); + } + Slice Ref() const { return Slice(grpc_slice_ref_internal(c_slice())); } Slice Copy() const { return Slice(grpc_slice_copy(c_slice())); } diff --git a/src/core/lib/slice/static_slice.cc b/src/core/lib/slice/static_slice.cc index 4c13be78965..9f59753608a 100644 --- a/src/core/lib/slice/static_slice.cc +++ b/src/core/lib/slice/static_slice.cc @@ -32,154 +32,144 @@ namespace grpc_core { const uint8_t g_static_metadata_bytes[] = { 58, 112, 97, 116, 104, 58, 109, 101, 116, 104, 111, 100, 58, 115, 116, 97, 116, 117, 115, 58, 97, 117, 116, 104, 111, 114, 105, 116, 121, 58, - 115, 99, 104, 101, 109, 101, 103, 114, 112, 99, 45, 109, 101, 115, 115, - 97, 103, 101, 103, 114, 112, 99, 45, 115, 116, 97, 116, 117, 115, 103, - 114, 112, 99, 45, 112, 97, 121, 108, 111, 97, 100, 45, 98, 105, 110, - 103, 114, 112, 99, 45, 101, 110, 99, 111, 100, 105, 110, 103, 103, 114, - 112, 99, 45, 97, 99, 99, 101, 112, 116, 45, 101, 110, 99, 111, 100, - 105, 110, 103, 103, 114, 112, 99, 45, 115, 101, 114, 118, 101, 114, 45, - 115, 116, 97, 116, 115, 45, 98, 105, 110, 103, 114, 112, 99, 45, 116, - 97, 103, 115, 45, 98, 105, 110, 103, 114, 112, 99, 45, 116, 114, 97, - 99, 101, 45, 98, 105, 110, 99, 111, 110, 116, 101, 110, 116, 45, 116, - 121, 112, 101, 99, 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, - 100, 105, 110, 103, 97, 99, 99, 101, 112, 116, 45, 101, 110, 99, 111, - 100, 105, 110, 103, 103, 114, 112, 99, 45, 105, 110, 116, 101, 114, 110, - 97, 108, 45, 101, 110, 99, 111, 100, 105, 110, 103, 45, 114, 101, 113, - 117, 101, 115, 116, 104, 111, 115, 116, 103, 114, 112, 99, 45, 112, 114, - 101, 118, 105, 111, 117, 115, 45, 114, 112, 99, 45, 97, 116, 116, 101, - 109, 112, 116, 115, 103, 114, 112, 99, 45, 114, 101, 116, 114, 121, 45, - 112, 117, 115, 104, 98, 97, 99, 107, 45, 109, 115, 120, 45, 101, 110, - 100, 112, 111, 105, 110, 116, 45, 108, 111, 97, 100, 45, 109, 101, 116, - 114, 105, 99, 115, 45, 98, 105, 110, 103, 114, 112, 99, 45, 116, 105, - 109, 101, 111, 117, 116, 117, 115, 101, 114, 45, 97, 103, 101, 110, 116, - 49, 50, 51, 52, 47, 103, 114, 112, 99, 46, 108, 98, 46, 118, 49, - 46, 76, 111, 97, 100, 66, 97, 108, 97, 110, 99, 101, 114, 47, 66, - 97, 108, 97, 110, 99, 101, 76, 111, 97, 100, 47, 101, 110, 118, 111, - 121, 46, 115, 101, 114, 118, 105, 99, 101, 46, 108, 111, 97, 100, 95, - 115, 116, 97, 116, 115, 46, 118, 50, 46, 76, 111, 97, 100, 82, 101, - 112, 111, 114, 116, 105, 110, 103, 83, 101, 114, 118, 105, 99, 101, 47, - 83, 116, 114, 101, 97, 109, 76, 111, 97, 100, 83, 116, 97, 116, 115, - 47, 101, 110, 118, 111, 121, 46, 115, 101, 114, 118, 105, 99, 101, 46, - 108, 111, 97, 100, 95, 115, 116, 97, 116, 115, 46, 118, 51, 46, 76, - 111, 97, 100, 82, 101, 112, 111, 114, 116, 105, 110, 103, 83, 101, 114, - 118, 105, 99, 101, 47, 83, 116, 114, 101, 97, 109, 76, 111, 97, 100, - 83, 116, 97, 116, 115, 47, 103, 114, 112, 99, 46, 104, 101, 97, 108, - 116, 104, 46, 118, 49, 46, 72, 101, 97, 108, 116, 104, 47, 87, 97, - 116, 99, 104, 47, 101, 110, 118, 111, 121, 46, 115, 101, 114, 118, 105, - 99, 101, 46, 100, 105, 115, 99, 111, 118, 101, 114, 121, 46, 118, 50, - 46, 65, 103, 103, 114, 101, 103, 97, 116, 101, 100, 68, 105, 115, 99, - 111, 118, 101, 114, 121, 83, 101, 114, 118, 105, 99, 101, 47, 83, 116, - 114, 101, 97, 109, 65, 103, 103, 114, 101, 103, 97, 116, 101, 100, 82, - 101, 115, 111, 117, 114, 99, 101, 115, 47, 101, 110, 118, 111, 121, 46, - 115, 101, 114, 118, 105, 99, 101, 46, 100, 105, 115, 99, 111, 118, 101, - 114, 121, 46, 118, 51, 46, 65, 103, 103, 114, 101, 103, 97, 116, 101, - 100, 68, 105, 115, 99, 111, 118, 101, 114, 121, 83, 101, 114, 118, 105, - 99, 101, 47, 83, 116, 114, 101, 97, 109, 65, 103, 103, 114, 101, 103, - 97, 116, 101, 100, 82, 101, 115, 111, 117, 114, 99, 101, 115, 100, 101, - 102, 108, 97, 116, 101, 103, 122, 105, 112, 115, 116, 114, 101, 97, 109, - 47, 103, 122, 105, 112, 116, 101, 116, 114, 97, 105, 108, 101, 114, 115, - 71, 69, 84, 80, 79, 83, 84, 47, 47, 105, 110, 100, 101, 120, 46, - 104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112, 115, 50, 48, - 48, 50, 48, 52, 50, 48, 54, 51, 48, 52, 52, 48, 48, 52, 48, - 52, 53, 48, 48, 97, 99, 99, 101, 112, 116, 45, 99, 104, 97, 114, - 115, 101, 116, 103, 122, 105, 112, 44, 32, 100, 101, 102, 108, 97, 116, - 101, 97, 99, 99, 101, 112, 116, 45, 108, 97, 110, 103, 117, 97, 103, - 101, 97, 99, 99, 101, 112, 116, 45, 114, 97, 110, 103, 101, 115, 97, - 99, 99, 101, 112, 116, 97, 99, 99, 101, 115, 115, 45, 99, 111, 110, - 116, 114, 111, 108, 45, 97, 108, 108, 111, 119, 45, 111, 114, 105, 103, - 105, 110, 97, 103, 101, 97, 108, 108, 111, 119, 97, 117, 116, 104, 111, - 114, 105, 122, 97, 116, 105, 111, 110, 99, 97, 99, 104, 101, 45, 99, - 111, 110, 116, 114, 111, 108, 99, 111, 110, 116, 101, 110, 116, 45, 100, - 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99, 111, 110, 116, 101, - 110, 116, 45, 108, 97, 110, 103, 117, 97, 103, 101, 99, 111, 110, 116, - 101, 110, 116, 45, 108, 101, 110, 103, 116, 104, 99, 111, 110, 116, 101, - 110, 116, 45, 108, 111, 99, 97, 116, 105, 111, 110, 99, 111, 110, 116, - 101, 110, 116, 45, 114, 97, 110, 103, 101, 99, 111, 111, 107, 105, 101, - 100, 97, 116, 101, 101, 116, 97, 103, 101, 120, 112, 101, 99, 116, 101, - 120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 105, 102, 45, 109, 97, - 116, 99, 104, 105, 102, 45, 109, 111, 100, 105, 102, 105, 101, 100, 45, - 115, 105, 110, 99, 101, 105, 102, 45, 110, 111, 110, 101, 45, 109, 97, - 116, 99, 104, 105, 102, 45, 114, 97, 110, 103, 101, 105, 102, 45, 117, - 110, 109, 111, 100, 105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 101, - 108, 97, 115, 116, 45, 109, 111, 100, 105, 102, 105, 101, 100, 108, 105, - 110, 107, 108, 111, 99, 97, 116, 105, 111, 110, 109, 97, 120, 45, 102, - 111, 114, 119, 97, 114, 100, 115, 112, 114, 111, 120, 121, 45, 97, 117, - 116, 104, 101, 110, 116, 105, 99, 97, 116, 101, 112, 114, 111, 120, 121, - 45, 97, 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, 114, - 97, 110, 103, 101, 114, 101, 102, 101, 114, 101, 114, 114, 101, 102, 114, - 101, 115, 104, 114, 101, 116, 114, 121, 45, 97, 102, 116, 101, 114, 115, - 101, 114, 118, 101, 114, 115, 101, 116, 45, 99, 111, 111, 107, 105, 101, - 115, 116, 114, 105, 99, 116, 45, 116, 114, 97, 110, 115, 112, 111, 114, - 116, 45, 115, 101, 99, 117, 114, 105, 116, 121, 116, 114, 97, 110, 115, - 102, 101, 114, 45, 101, 110, 99, 111, 100, 105, 110, 103, 118, 97, 114, - 121, 118, 105, 97, 119, 119, 119, 45, 97, 117, 116, 104, 101, 110, 116, - 105, 99, 97, 116, 101, 48, 105, 100, 101, 110, 116, 105, 116, 121, 97, - 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 103, 114, 112, 99, - 103, 114, 112, 99, 80, 85, 84, 108, 98, 45, 99, 111, 115, 116, 45, - 98, 105, 110, 105, 100, 101, 110, 116, 105, 116, 121, 44, 100, 101, 102, - 108, 97, 116, 101, 105, 100, 101, 110, 116, 105, 116, 121, 44, 103, 122, - 105, 112, 100, 101, 102, 108, 97, 116, 101, 44, 103, 122, 105, 112, 105, - 100, 101, 110, 116, 105, 116, 121, 44, 100, 101, 102, 108, 97, 116, 101, - 44, 103, 122, 105, 112}; + 115, 99, 104, 101, 109, 101, 103, 114, 112, 99, 45, 115, 116, 97, 116, + 117, 115, 103, 114, 112, 99, 45, 101, 110, 99, 111, 100, 105, 110, 103, + 103, 114, 112, 99, 45, 97, 99, 99, 101, 112, 116, 45, 101, 110, 99, + 111, 100, 105, 110, 103, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, + 112, 101, 99, 111, 110, 116, 101, 110, 116, 45, 101, 110, 99, 111, 100, + 105, 110, 103, 97, 99, 99, 101, 112, 116, 45, 101, 110, 99, 111, 100, + 105, 110, 103, 103, 114, 112, 99, 45, 105, 110, 116, 101, 114, 110, 97, + 108, 45, 101, 110, 99, 111, 100, 105, 110, 103, 45, 114, 101, 113, 117, + 101, 115, 116, 103, 114, 112, 99, 45, 112, 114, 101, 118, 105, 111, 117, + 115, 45, 114, 112, 99, 45, 97, 116, 116, 101, 109, 112, 116, 115, 103, + 114, 112, 99, 45, 114, 101, 116, 114, 121, 45, 112, 117, 115, 104, 98, + 97, 99, 107, 45, 109, 115, 103, 114, 112, 99, 45, 116, 105, 109, 101, + 111, 117, 116, 49, 50, 51, 52, 47, 103, 114, 112, 99, 46, 108, 98, + 46, 118, 49, 46, 76, 111, 97, 100, 66, 97, 108, 97, 110, 99, 101, + 114, 47, 66, 97, 108, 97, 110, 99, 101, 76, 111, 97, 100, 47, 101, + 110, 118, 111, 121, 46, 115, 101, 114, 118, 105, 99, 101, 46, 108, 111, + 97, 100, 95, 115, 116, 97, 116, 115, 46, 118, 50, 46, 76, 111, 97, + 100, 82, 101, 112, 111, 114, 116, 105, 110, 103, 83, 101, 114, 118, 105, + 99, 101, 47, 83, 116, 114, 101, 97, 109, 76, 111, 97, 100, 83, 116, + 97, 116, 115, 47, 101, 110, 118, 111, 121, 46, 115, 101, 114, 118, 105, + 99, 101, 46, 108, 111, 97, 100, 95, 115, 116, 97, 116, 115, 46, 118, + 51, 46, 76, 111, 97, 100, 82, 101, 112, 111, 114, 116, 105, 110, 103, + 83, 101, 114, 118, 105, 99, 101, 47, 83, 116, 114, 101, 97, 109, 76, + 111, 97, 100, 83, 116, 97, 116, 115, 47, 103, 114, 112, 99, 46, 104, + 101, 97, 108, 116, 104, 46, 118, 49, 46, 72, 101, 97, 108, 116, 104, + 47, 87, 97, 116, 99, 104, 47, 101, 110, 118, 111, 121, 46, 115, 101, + 114, 118, 105, 99, 101, 46, 100, 105, 115, 99, 111, 118, 101, 114, 121, + 46, 118, 50, 46, 65, 103, 103, 114, 101, 103, 97, 116, 101, 100, 68, + 105, 115, 99, 111, 118, 101, 114, 121, 83, 101, 114, 118, 105, 99, 101, + 47, 83, 116, 114, 101, 97, 109, 65, 103, 103, 114, 101, 103, 97, 116, + 101, 100, 82, 101, 115, 111, 117, 114, 99, 101, 115, 47, 101, 110, 118, + 111, 121, 46, 115, 101, 114, 118, 105, 99, 101, 46, 100, 105, 115, 99, + 111, 118, 101, 114, 121, 46, 118, 51, 46, 65, 103, 103, 114, 101, 103, + 97, 116, 101, 100, 68, 105, 115, 99, 111, 118, 101, 114, 121, 83, 101, + 114, 118, 105, 99, 101, 47, 83, 116, 114, 101, 97, 109, 65, 103, 103, + 114, 101, 103, 97, 116, 101, 100, 82, 101, 115, 111, 117, 114, 99, 101, + 115, 100, 101, 102, 108, 97, 116, 101, 103, 122, 105, 112, 115, 116, 114, + 101, 97, 109, 47, 103, 122, 105, 112, 116, 101, 116, 114, 97, 105, 108, + 101, 114, 115, 71, 69, 84, 80, 79, 83, 84, 47, 47, 105, 110, 100, + 101, 120, 46, 104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112, + 115, 50, 48, 48, 50, 48, 52, 50, 48, 54, 51, 48, 52, 52, 48, + 48, 52, 48, 52, 53, 48, 48, 97, 99, 99, 101, 112, 116, 45, 99, + 104, 97, 114, 115, 101, 116, 103, 122, 105, 112, 44, 32, 100, 101, 102, + 108, 97, 116, 101, 97, 99, 99, 101, 112, 116, 45, 108, 97, 110, 103, + 117, 97, 103, 101, 97, 99, 99, 101, 112, 116, 45, 114, 97, 110, 103, + 101, 115, 97, 99, 99, 101, 112, 116, 97, 99, 99, 101, 115, 115, 45, + 99, 111, 110, 116, 114, 111, 108, 45, 97, 108, 108, 111, 119, 45, 111, + 114, 105, 103, 105, 110, 97, 103, 101, 97, 108, 108, 111, 119, 97, 117, + 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, 99, 97, 99, 104, + 101, 45, 99, 111, 110, 116, 114, 111, 108, 99, 111, 110, 116, 101, 110, + 116, 45, 100, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99, 111, + 110, 116, 101, 110, 116, 45, 108, 97, 110, 103, 117, 97, 103, 101, 99, + 111, 110, 116, 101, 110, 116, 45, 108, 101, 110, 103, 116, 104, 99, 111, + 110, 116, 101, 110, 116, 45, 108, 111, 99, 97, 116, 105, 111, 110, 99, + 111, 110, 116, 101, 110, 116, 45, 114, 97, 110, 103, 101, 99, 111, 111, + 107, 105, 101, 100, 97, 116, 101, 101, 116, 97, 103, 101, 120, 112, 101, + 99, 116, 101, 120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 104, 111, + 115, 116, 105, 102, 45, 109, 97, 116, 99, 104, 105, 102, 45, 109, 111, + 100, 105, 102, 105, 101, 100, 45, 115, 105, 110, 99, 101, 105, 102, 45, + 110, 111, 110, 101, 45, 109, 97, 116, 99, 104, 105, 102, 45, 114, 97, + 110, 103, 101, 105, 102, 45, 117, 110, 109, 111, 100, 105, 102, 105, 101, + 100, 45, 115, 105, 110, 99, 101, 108, 97, 115, 116, 45, 109, 111, 100, + 105, 102, 105, 101, 100, 108, 105, 110, 107, 108, 111, 99, 97, 116, 105, + 111, 110, 109, 97, 120, 45, 102, 111, 114, 119, 97, 114, 100, 115, 112, + 114, 111, 120, 121, 45, 97, 117, 116, 104, 101, 110, 116, 105, 99, 97, + 116, 101, 112, 114, 111, 120, 121, 45, 97, 117, 116, 104, 111, 114, 105, + 122, 97, 116, 105, 111, 110, 114, 97, 110, 103, 101, 114, 101, 102, 101, + 114, 101, 114, 114, 101, 102, 114, 101, 115, 104, 114, 101, 116, 114, 121, + 45, 97, 102, 116, 101, 114, 115, 101, 114, 118, 101, 114, 115, 101, 116, + 45, 99, 111, 111, 107, 105, 101, 115, 116, 114, 105, 99, 116, 45, 116, + 114, 97, 110, 115, 112, 111, 114, 116, 45, 115, 101, 99, 117, 114, 105, + 116, 121, 116, 114, 97, 110, 115, 102, 101, 114, 45, 101, 110, 99, 111, + 100, 105, 110, 103, 117, 115, 101, 114, 45, 97, 103, 101, 110, 116, 118, + 97, 114, 121, 118, 105, 97, 119, 119, 119, 45, 97, 117, 116, 104, 101, + 110, 116, 105, 99, 97, 116, 101, 48, 105, 100, 101, 110, 116, 105, 116, + 121, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 103, 114, + 112, 99, 103, 114, 112, 99, 80, 85, 84, 108, 98, 45, 99, 111, 115, + 116, 45, 98, 105, 110, 105, 100, 101, 110, 116, 105, 116, 121, 44, 100, + 101, 102, 108, 97, 116, 101, 105, 100, 101, 110, 116, 105, 116, 121, 44, + 103, 122, 105, 112, 100, 101, 102, 108, 97, 116, 101, 44, 103, 122, 105, + 112, 105, 100, 101, 110, 116, 105, 116, 121, 44, 100, 101, 102, 108, 97, + 116, 101, 44, 103, 122, 105, 112}; grpc_slice_refcount StaticSliceRefcount::kStaticSubRefcount; StaticSliceRefcount g_static_metadata_slice_refcounts[GRPC_STATIC_MDSTR_COUNT] = { - StaticSliceRefcount(0), StaticSliceRefcount(1), - StaticSliceRefcount(2), StaticSliceRefcount(3), - StaticSliceRefcount(4), StaticSliceRefcount(5), - StaticSliceRefcount(6), StaticSliceRefcount(7), - StaticSliceRefcount(8), StaticSliceRefcount(9), - StaticSliceRefcount(10), StaticSliceRefcount(11), - StaticSliceRefcount(12), StaticSliceRefcount(13), - StaticSliceRefcount(14), StaticSliceRefcount(15), - StaticSliceRefcount(16), StaticSliceRefcount(17), - StaticSliceRefcount(18), StaticSliceRefcount(19), - StaticSliceRefcount(20), StaticSliceRefcount(21), - StaticSliceRefcount(22), StaticSliceRefcount(23), - StaticSliceRefcount(24), StaticSliceRefcount(25), - StaticSliceRefcount(26), StaticSliceRefcount(27), - StaticSliceRefcount(28), StaticSliceRefcount(29), - StaticSliceRefcount(30), StaticSliceRefcount(31), - StaticSliceRefcount(32), StaticSliceRefcount(33), - StaticSliceRefcount(34), StaticSliceRefcount(35), - StaticSliceRefcount(36), StaticSliceRefcount(37), - StaticSliceRefcount(38), StaticSliceRefcount(39), - StaticSliceRefcount(40), StaticSliceRefcount(41), - StaticSliceRefcount(42), StaticSliceRefcount(43), - StaticSliceRefcount(44), StaticSliceRefcount(45), - StaticSliceRefcount(46), StaticSliceRefcount(47), - StaticSliceRefcount(48), StaticSliceRefcount(49), - StaticSliceRefcount(50), StaticSliceRefcount(51), - StaticSliceRefcount(52), StaticSliceRefcount(53), - StaticSliceRefcount(54), StaticSliceRefcount(55), - StaticSliceRefcount(56), StaticSliceRefcount(57), - StaticSliceRefcount(58), StaticSliceRefcount(59), - StaticSliceRefcount(60), StaticSliceRefcount(61), - StaticSliceRefcount(62), StaticSliceRefcount(63), - StaticSliceRefcount(64), StaticSliceRefcount(65), - StaticSliceRefcount(66), StaticSliceRefcount(67), - StaticSliceRefcount(68), StaticSliceRefcount(69), - StaticSliceRefcount(70), StaticSliceRefcount(71), - StaticSliceRefcount(72), StaticSliceRefcount(73), - StaticSliceRefcount(74), StaticSliceRefcount(75), - StaticSliceRefcount(76), StaticSliceRefcount(77), - StaticSliceRefcount(78), StaticSliceRefcount(79), - StaticSliceRefcount(80), StaticSliceRefcount(81), - StaticSliceRefcount(82), StaticSliceRefcount(83), - StaticSliceRefcount(84), StaticSliceRefcount(85), - StaticSliceRefcount(86), StaticSliceRefcount(87), - StaticSliceRefcount(88), StaticSliceRefcount(89), - StaticSliceRefcount(90), StaticSliceRefcount(91), - StaticSliceRefcount(92), StaticSliceRefcount(93), - StaticSliceRefcount(94), StaticSliceRefcount(95), - StaticSliceRefcount(96), StaticSliceRefcount(97), - StaticSliceRefcount(98), StaticSliceRefcount(99), - StaticSliceRefcount(100), StaticSliceRefcount(101), - StaticSliceRefcount(102), StaticSliceRefcount(103), - StaticSliceRefcount(104), + StaticSliceRefcount(0), StaticSliceRefcount(1), + StaticSliceRefcount(2), StaticSliceRefcount(3), + StaticSliceRefcount(4), StaticSliceRefcount(5), + StaticSliceRefcount(6), StaticSliceRefcount(7), + StaticSliceRefcount(8), StaticSliceRefcount(9), + StaticSliceRefcount(10), StaticSliceRefcount(11), + StaticSliceRefcount(12), StaticSliceRefcount(13), + StaticSliceRefcount(14), StaticSliceRefcount(15), + StaticSliceRefcount(16), StaticSliceRefcount(17), + StaticSliceRefcount(18), StaticSliceRefcount(19), + StaticSliceRefcount(20), StaticSliceRefcount(21), + StaticSliceRefcount(22), StaticSliceRefcount(23), + StaticSliceRefcount(24), StaticSliceRefcount(25), + StaticSliceRefcount(26), StaticSliceRefcount(27), + StaticSliceRefcount(28), StaticSliceRefcount(29), + StaticSliceRefcount(30), StaticSliceRefcount(31), + StaticSliceRefcount(32), StaticSliceRefcount(33), + StaticSliceRefcount(34), StaticSliceRefcount(35), + StaticSliceRefcount(36), StaticSliceRefcount(37), + StaticSliceRefcount(38), StaticSliceRefcount(39), + StaticSliceRefcount(40), StaticSliceRefcount(41), + StaticSliceRefcount(42), StaticSliceRefcount(43), + StaticSliceRefcount(44), StaticSliceRefcount(45), + StaticSliceRefcount(46), StaticSliceRefcount(47), + StaticSliceRefcount(48), StaticSliceRefcount(49), + StaticSliceRefcount(50), StaticSliceRefcount(51), + StaticSliceRefcount(52), StaticSliceRefcount(53), + StaticSliceRefcount(54), StaticSliceRefcount(55), + StaticSliceRefcount(56), StaticSliceRefcount(57), + StaticSliceRefcount(58), StaticSliceRefcount(59), + StaticSliceRefcount(60), StaticSliceRefcount(61), + StaticSliceRefcount(62), StaticSliceRefcount(63), + StaticSliceRefcount(64), StaticSliceRefcount(65), + StaticSliceRefcount(66), StaticSliceRefcount(67), + StaticSliceRefcount(68), StaticSliceRefcount(69), + StaticSliceRefcount(70), StaticSliceRefcount(71), + StaticSliceRefcount(72), StaticSliceRefcount(73), + StaticSliceRefcount(74), StaticSliceRefcount(75), + StaticSliceRefcount(76), StaticSliceRefcount(77), + StaticSliceRefcount(78), StaticSliceRefcount(79), + StaticSliceRefcount(80), StaticSliceRefcount(81), + StaticSliceRefcount(82), StaticSliceRefcount(83), + StaticSliceRefcount(84), StaticSliceRefcount(85), + StaticSliceRefcount(86), StaticSliceRefcount(87), + StaticSliceRefcount(88), StaticSliceRefcount(89), + StaticSliceRefcount(90), StaticSliceRefcount(91), + StaticSliceRefcount(92), StaticSliceRefcount(93), + StaticSliceRefcount(94), StaticSliceRefcount(95), + StaticSliceRefcount(96), StaticSliceRefcount(97), + StaticSliceRefcount(98), }; const StaticMetadataSlice @@ -195,205 +185,193 @@ const StaticMetadataSlice g_static_metadata_bytes + 19), StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7, g_static_metadata_bytes + 29), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 12, + StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11, g_static_metadata_bytes + 36), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11, - g_static_metadata_bytes + 48), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 16, - g_static_metadata_bytes + 59), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13, - g_static_metadata_bytes + 75), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 21, + StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13, + g_static_metadata_bytes + 47), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12, + g_static_metadata_bytes + 80), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16, + g_static_metadata_bytes + 92), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, g_static_metadata_bytes + 108), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 13, - g_static_metadata_bytes + 129), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 14, - g_static_metadata_bytes + 142), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12, - g_static_metadata_bytes + 156), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16, - g_static_metadata_bytes + 168), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 30, - g_static_metadata_bytes + 199), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 4, - g_static_metadata_bytes + 229), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 26, - g_static_metadata_bytes + 233), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 22, - g_static_metadata_bytes + 259), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 27, - g_static_metadata_bytes + 281), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 12, - g_static_metadata_bytes + 308), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 10, - g_static_metadata_bytes + 320), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 1, - g_static_metadata_bytes + 330), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 1, - g_static_metadata_bytes + 331), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 1, - g_static_metadata_bytes + 332), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 1, - g_static_metadata_bytes + 333), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 36, - g_static_metadata_bytes + 334), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 65, - g_static_metadata_bytes + 370), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 65, - g_static_metadata_bytes + 435), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 28, - g_static_metadata_bytes + 500), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 80, - g_static_metadata_bytes + 528), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 80, - g_static_metadata_bytes + 608), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7, - g_static_metadata_bytes + 688), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 30, + g_static_metadata_bytes + 123), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 26, + g_static_metadata_bytes + 153), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 22, + g_static_metadata_bytes + 179), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 12, + g_static_metadata_bytes + 201), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1, + g_static_metadata_bytes + 213), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 1, + g_static_metadata_bytes + 214), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 1, + g_static_metadata_bytes + 215), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 1, + g_static_metadata_bytes + 216), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 36, + g_static_metadata_bytes + 217), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 65, + g_static_metadata_bytes + 253), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 65, + g_static_metadata_bytes + 318), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 28, + g_static_metadata_bytes + 383), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 80, + g_static_metadata_bytes + 411), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 80, + g_static_metadata_bytes + 491), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7, + g_static_metadata_bytes + 571), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4, + g_static_metadata_bytes + 578), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 11, + g_static_metadata_bytes + 582), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 2, + g_static_metadata_bytes + 593), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 8, + g_static_metadata_bytes + 595), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 3, + g_static_metadata_bytes + 603), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 4, + g_static_metadata_bytes + 606), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 1, + g_static_metadata_bytes + 610), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 11, + g_static_metadata_bytes + 611), StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, - g_static_metadata_bytes + 695), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 11, - g_static_metadata_bytes + 699), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 2, - g_static_metadata_bytes + 710), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 8, - g_static_metadata_bytes + 712), + g_static_metadata_bytes + 622), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5, + g_static_metadata_bytes + 626), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 3, + g_static_metadata_bytes + 631), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 3, + g_static_metadata_bytes + 634), StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3, - g_static_metadata_bytes + 720), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 4, - g_static_metadata_bytes + 723), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 1, - g_static_metadata_bytes + 727), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 11, - g_static_metadata_bytes + 728), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 4, - g_static_metadata_bytes + 739), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 5, + g_static_metadata_bytes + 637), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 3, + g_static_metadata_bytes + 640), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 3, + g_static_metadata_bytes + 643), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 3, + g_static_metadata_bytes + 646), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 3, + g_static_metadata_bytes + 649), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 14, + g_static_metadata_bytes + 652), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 13, + g_static_metadata_bytes + 666), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 15, + g_static_metadata_bytes + 679), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 13, + g_static_metadata_bytes + 694), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 6, + g_static_metadata_bytes + 707), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 27, + g_static_metadata_bytes + 713), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3, + g_static_metadata_bytes + 740), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 5, g_static_metadata_bytes + 743), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 3, + StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 13, g_static_metadata_bytes + 748), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 3, - g_static_metadata_bytes + 751), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 3, - g_static_metadata_bytes + 754), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 3, - g_static_metadata_bytes + 757), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 3, - g_static_metadata_bytes + 760), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3, - g_static_metadata_bytes + 763), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 3, - g_static_metadata_bytes + 766), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 14, - g_static_metadata_bytes + 769), StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13, - g_static_metadata_bytes + 783), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 15, - g_static_metadata_bytes + 796), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13, - g_static_metadata_bytes + 811), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 6, - g_static_metadata_bytes + 824), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 27, - g_static_metadata_bytes + 830), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 3, - g_static_metadata_bytes + 857), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 5, - g_static_metadata_bytes + 860), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 13, - g_static_metadata_bytes + 865), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 13, - g_static_metadata_bytes + 878), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 19, - g_static_metadata_bytes + 891), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 16, - g_static_metadata_bytes + 910), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 14, - g_static_metadata_bytes + 926), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 16, - g_static_metadata_bytes + 940), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 13, - g_static_metadata_bytes + 956), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 6, - g_static_metadata_bytes + 969), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 4, - g_static_metadata_bytes + 975), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 4, - g_static_metadata_bytes + 979), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 6, - g_static_metadata_bytes + 983), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 7, - g_static_metadata_bytes + 989), + g_static_metadata_bytes + 761), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 19, + g_static_metadata_bytes + 774), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 16, + g_static_metadata_bytes + 793), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 14, + g_static_metadata_bytes + 809), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 16, + g_static_metadata_bytes + 823), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13, + g_static_metadata_bytes + 839), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 6, + g_static_metadata_bytes + 852), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 4, + g_static_metadata_bytes + 858), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 4, + g_static_metadata_bytes + 862), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 6, + g_static_metadata_bytes + 866), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 7, + g_static_metadata_bytes + 872), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 4, + g_static_metadata_bytes + 879), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 4, + g_static_metadata_bytes + 883), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 8, + g_static_metadata_bytes + 887), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 17, + g_static_metadata_bytes + 895), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 13, + g_static_metadata_bytes + 912), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 8, + g_static_metadata_bytes + 925), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 19, + g_static_metadata_bytes + 933), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 13, + g_static_metadata_bytes + 952), StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4, - g_static_metadata_bytes + 996), + g_static_metadata_bytes + 965), StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8, - g_static_metadata_bytes + 1000), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 17, - g_static_metadata_bytes + 1008), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 13, - g_static_metadata_bytes + 1025), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 8, + g_static_metadata_bytes + 969), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 12, + g_static_metadata_bytes + 977), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 18, + g_static_metadata_bytes + 989), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 19, + g_static_metadata_bytes + 1007), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 5, + g_static_metadata_bytes + 1026), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 7, + g_static_metadata_bytes + 1031), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 7, g_static_metadata_bytes + 1038), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 19, - g_static_metadata_bytes + 1046), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 13, - g_static_metadata_bytes + 1065), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 4, - g_static_metadata_bytes + 1078), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 8, - g_static_metadata_bytes + 1082), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 12, - g_static_metadata_bytes + 1090), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 18, - g_static_metadata_bytes + 1102), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 19, - g_static_metadata_bytes + 1120), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 5, - g_static_metadata_bytes + 1139), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 7, - g_static_metadata_bytes + 1144), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 7, - g_static_metadata_bytes + 1151), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 11, - g_static_metadata_bytes + 1158), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 6, - g_static_metadata_bytes + 1169), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 10, - g_static_metadata_bytes + 1175), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 25, - g_static_metadata_bytes + 1185), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 17, - g_static_metadata_bytes + 1210), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 11, + g_static_metadata_bytes + 1045), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 6, + g_static_metadata_bytes + 1056), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 10, + g_static_metadata_bytes + 1062), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 25, + g_static_metadata_bytes + 1072), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 17, + g_static_metadata_bytes + 1097), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 10, + g_static_metadata_bytes + 1114), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 4, + g_static_metadata_bytes + 1124), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 3, + g_static_metadata_bytes + 1128), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 16, + g_static_metadata_bytes + 1131), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 1, + g_static_metadata_bytes + 1147), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8, + g_static_metadata_bytes + 1148), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 16, + g_static_metadata_bytes + 1156), StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4, - g_static_metadata_bytes + 1227), + g_static_metadata_bytes + 1172), StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3, + g_static_metadata_bytes + 1176), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 11, + g_static_metadata_bytes + 1179), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 16, + g_static_metadata_bytes + 1190), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13, + g_static_metadata_bytes + 1206), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 12, + g_static_metadata_bytes + 1219), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 21, g_static_metadata_bytes + 1231), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 16, - g_static_metadata_bytes + 1234), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 1, - g_static_metadata_bytes + 1250), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8, - g_static_metadata_bytes + 1251), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 16, - g_static_metadata_bytes + 1259), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 4, - g_static_metadata_bytes + 1275), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[99].base, 3, - g_static_metadata_bytes + 1279), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[100].base, 11, - g_static_metadata_bytes + 1282), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[101].base, 16, - g_static_metadata_bytes + 1293), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13, - g_static_metadata_bytes + 1309), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[103].base, 12, - g_static_metadata_bytes + 1322), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[104].base, 21, - g_static_metadata_bytes + 1334), }; } // namespace grpc_core diff --git a/src/core/lib/slice/static_slice.h b/src/core/lib/slice/static_slice.h index 15c02782aca..267b7aba96d 100644 --- a/src/core/lib/slice/static_slice.h +++ b/src/core/lib/slice/static_slice.h @@ -38,7 +38,7 @@ static_assert( std::is_trivially_destructible::value, "StaticMetadataSlice must be trivially destructible."); -#define GRPC_STATIC_MDSTR_COUNT 105 +#define GRPC_STATIC_MDSTR_COUNT 99 /* ":path" */ #define GRPC_MDSTR_PATH (::grpc_core::g_static_metadata_slice_table[0]) /* ":method" */ @@ -49,253 +49,236 @@ static_assert( #define GRPC_MDSTR_AUTHORITY (::grpc_core::g_static_metadata_slice_table[3]) /* ":scheme" */ #define GRPC_MDSTR_SCHEME (::grpc_core::g_static_metadata_slice_table[4]) -/* "grpc-message" */ -#define GRPC_MDSTR_GRPC_MESSAGE (::grpc_core::g_static_metadata_slice_table[5]) /* "grpc-status" */ -#define GRPC_MDSTR_GRPC_STATUS (::grpc_core::g_static_metadata_slice_table[6]) -/* "grpc-payload-bin" */ -#define GRPC_MDSTR_GRPC_PAYLOAD_BIN \ - (::grpc_core::g_static_metadata_slice_table[7]) +#define GRPC_MDSTR_GRPC_STATUS (::grpc_core::g_static_metadata_slice_table[5]) /* "grpc-encoding" */ -#define GRPC_MDSTR_GRPC_ENCODING (::grpc_core::g_static_metadata_slice_table[8]) +#define GRPC_MDSTR_GRPC_ENCODING (::grpc_core::g_static_metadata_slice_table[6]) /* "grpc-accept-encoding" */ #define GRPC_MDSTR_GRPC_ACCEPT_ENCODING \ - (::grpc_core::g_static_metadata_slice_table[9]) -/* "grpc-server-stats-bin" */ -#define GRPC_MDSTR_GRPC_SERVER_STATS_BIN \ - (::grpc_core::g_static_metadata_slice_table[10]) -/* "grpc-tags-bin" */ -#define GRPC_MDSTR_GRPC_TAGS_BIN \ - (::grpc_core::g_static_metadata_slice_table[11]) -/* "grpc-trace-bin" */ -#define GRPC_MDSTR_GRPC_TRACE_BIN \ - (::grpc_core::g_static_metadata_slice_table[12]) + (::grpc_core::g_static_metadata_slice_table[7]) /* "content-type" */ -#define GRPC_MDSTR_CONTENT_TYPE (::grpc_core::g_static_metadata_slice_table[13]) +#define GRPC_MDSTR_CONTENT_TYPE (::grpc_core::g_static_metadata_slice_table[8]) /* "content-encoding" */ #define GRPC_MDSTR_CONTENT_ENCODING \ - (::grpc_core::g_static_metadata_slice_table[14]) + (::grpc_core::g_static_metadata_slice_table[9]) /* "accept-encoding" */ #define GRPC_MDSTR_ACCEPT_ENCODING \ - (::grpc_core::g_static_metadata_slice_table[15]) + (::grpc_core::g_static_metadata_slice_table[10]) /* "grpc-internal-encoding-request" */ #define GRPC_MDSTR_GRPC_INTERNAL_ENCODING_REQUEST \ - (::grpc_core::g_static_metadata_slice_table[16]) -/* "host" */ -#define GRPC_MDSTR_HOST (::grpc_core::g_static_metadata_slice_table[17]) + (::grpc_core::g_static_metadata_slice_table[11]) /* "grpc-previous-rpc-attempts" */ #define GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS \ - (::grpc_core::g_static_metadata_slice_table[18]) + (::grpc_core::g_static_metadata_slice_table[12]) /* "grpc-retry-pushback-ms" */ #define GRPC_MDSTR_GRPC_RETRY_PUSHBACK_MS \ - (::grpc_core::g_static_metadata_slice_table[19]) -/* "x-endpoint-load-metrics-bin" */ -#define GRPC_MDSTR_X_ENDPOINT_LOAD_METRICS_BIN \ - (::grpc_core::g_static_metadata_slice_table[20]) + (::grpc_core::g_static_metadata_slice_table[13]) /* "grpc-timeout" */ -#define GRPC_MDSTR_GRPC_TIMEOUT (::grpc_core::g_static_metadata_slice_table[21]) -/* "user-agent" */ -#define GRPC_MDSTR_USER_AGENT (::grpc_core::g_static_metadata_slice_table[22]) +#define GRPC_MDSTR_GRPC_TIMEOUT (::grpc_core::g_static_metadata_slice_table[14]) /* "1" */ -#define GRPC_MDSTR_1 (::grpc_core::g_static_metadata_slice_table[23]) +#define GRPC_MDSTR_1 (::grpc_core::g_static_metadata_slice_table[15]) /* "2" */ -#define GRPC_MDSTR_2 (::grpc_core::g_static_metadata_slice_table[24]) +#define GRPC_MDSTR_2 (::grpc_core::g_static_metadata_slice_table[16]) /* "3" */ -#define GRPC_MDSTR_3 (::grpc_core::g_static_metadata_slice_table[25]) +#define GRPC_MDSTR_3 (::grpc_core::g_static_metadata_slice_table[17]) /* "4" */ -#define GRPC_MDSTR_4 (::grpc_core::g_static_metadata_slice_table[26]) +#define GRPC_MDSTR_4 (::grpc_core::g_static_metadata_slice_table[18]) /* "" */ -#define GRPC_MDSTR_EMPTY (::grpc_core::g_static_metadata_slice_table[27]) +#define GRPC_MDSTR_EMPTY (::grpc_core::g_static_metadata_slice_table[19]) /* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */ #define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \ - (::grpc_core::g_static_metadata_slice_table[28]) + (::grpc_core::g_static_metadata_slice_table[20]) /* "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats" */ #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \ - (::grpc_core::g_static_metadata_slice_table[29]) + (::grpc_core::g_static_metadata_slice_table[21]) /* "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats" */ #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \ - (::grpc_core::g_static_metadata_slice_table[30]) + (::grpc_core::g_static_metadata_slice_table[22]) /* "/grpc.health.v1.Health/Watch" */ #define GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH \ - (::grpc_core::g_static_metadata_slice_table[31]) + (::grpc_core::g_static_metadata_slice_table[23]) /* "/envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources" */ #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \ - (::grpc_core::g_static_metadata_slice_table[32]) + (::grpc_core::g_static_metadata_slice_table[24]) /* "/envoy.service.discovery.v3.AggregatedDiscoveryService/StreamAggregatedResources" */ #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \ - (::grpc_core::g_static_metadata_slice_table[33]) + (::grpc_core::g_static_metadata_slice_table[25]) /* "deflate" */ -#define GRPC_MDSTR_DEFLATE (::grpc_core::g_static_metadata_slice_table[34]) +#define GRPC_MDSTR_DEFLATE (::grpc_core::g_static_metadata_slice_table[26]) /* "gzip" */ -#define GRPC_MDSTR_GZIP (::grpc_core::g_static_metadata_slice_table[35]) +#define GRPC_MDSTR_GZIP (::grpc_core::g_static_metadata_slice_table[27]) /* "stream/gzip" */ #define GRPC_MDSTR_STREAM_SLASH_GZIP \ - (::grpc_core::g_static_metadata_slice_table[36]) + (::grpc_core::g_static_metadata_slice_table[28]) /* "te" */ -#define GRPC_MDSTR_TE (::grpc_core::g_static_metadata_slice_table[37]) +#define GRPC_MDSTR_TE (::grpc_core::g_static_metadata_slice_table[29]) /* "trailers" */ -#define GRPC_MDSTR_TRAILERS (::grpc_core::g_static_metadata_slice_table[38]) +#define GRPC_MDSTR_TRAILERS (::grpc_core::g_static_metadata_slice_table[30]) /* "GET" */ -#define GRPC_MDSTR_GET (::grpc_core::g_static_metadata_slice_table[39]) +#define GRPC_MDSTR_GET (::grpc_core::g_static_metadata_slice_table[31]) /* "POST" */ -#define GRPC_MDSTR_POST (::grpc_core::g_static_metadata_slice_table[40]) +#define GRPC_MDSTR_POST (::grpc_core::g_static_metadata_slice_table[32]) /* "/" */ -#define GRPC_MDSTR_SLASH (::grpc_core::g_static_metadata_slice_table[41]) +#define GRPC_MDSTR_SLASH (::grpc_core::g_static_metadata_slice_table[33]) /* "/index.html" */ #define GRPC_MDSTR_SLASH_INDEX_DOT_HTML \ - (::grpc_core::g_static_metadata_slice_table[42]) + (::grpc_core::g_static_metadata_slice_table[34]) /* "http" */ -#define GRPC_MDSTR_HTTP (::grpc_core::g_static_metadata_slice_table[43]) +#define GRPC_MDSTR_HTTP (::grpc_core::g_static_metadata_slice_table[35]) /* "https" */ -#define GRPC_MDSTR_HTTPS (::grpc_core::g_static_metadata_slice_table[44]) +#define GRPC_MDSTR_HTTPS (::grpc_core::g_static_metadata_slice_table[36]) /* "200" */ -#define GRPC_MDSTR_200 (::grpc_core::g_static_metadata_slice_table[45]) +#define GRPC_MDSTR_200 (::grpc_core::g_static_metadata_slice_table[37]) /* "204" */ -#define GRPC_MDSTR_204 (::grpc_core::g_static_metadata_slice_table[46]) +#define GRPC_MDSTR_204 (::grpc_core::g_static_metadata_slice_table[38]) /* "206" */ -#define GRPC_MDSTR_206 (::grpc_core::g_static_metadata_slice_table[47]) +#define GRPC_MDSTR_206 (::grpc_core::g_static_metadata_slice_table[39]) /* "304" */ -#define GRPC_MDSTR_304 (::grpc_core::g_static_metadata_slice_table[48]) +#define GRPC_MDSTR_304 (::grpc_core::g_static_metadata_slice_table[40]) /* "400" */ -#define GRPC_MDSTR_400 (::grpc_core::g_static_metadata_slice_table[49]) +#define GRPC_MDSTR_400 (::grpc_core::g_static_metadata_slice_table[41]) /* "404" */ -#define GRPC_MDSTR_404 (::grpc_core::g_static_metadata_slice_table[50]) +#define GRPC_MDSTR_404 (::grpc_core::g_static_metadata_slice_table[42]) /* "500" */ -#define GRPC_MDSTR_500 (::grpc_core::g_static_metadata_slice_table[51]) +#define GRPC_MDSTR_500 (::grpc_core::g_static_metadata_slice_table[43]) /* "accept-charset" */ #define GRPC_MDSTR_ACCEPT_CHARSET \ - (::grpc_core::g_static_metadata_slice_table[52]) + (::grpc_core::g_static_metadata_slice_table[44]) /* "gzip, deflate" */ #define GRPC_MDSTR_GZIP_COMMA_DEFLATE \ - (::grpc_core::g_static_metadata_slice_table[53]) + (::grpc_core::g_static_metadata_slice_table[45]) /* "accept-language" */ #define GRPC_MDSTR_ACCEPT_LANGUAGE \ - (::grpc_core::g_static_metadata_slice_table[54]) + (::grpc_core::g_static_metadata_slice_table[46]) /* "accept-ranges" */ #define GRPC_MDSTR_ACCEPT_RANGES \ - (::grpc_core::g_static_metadata_slice_table[55]) + (::grpc_core::g_static_metadata_slice_table[47]) /* "accept" */ -#define GRPC_MDSTR_ACCEPT (::grpc_core::g_static_metadata_slice_table[56]) +#define GRPC_MDSTR_ACCEPT (::grpc_core::g_static_metadata_slice_table[48]) /* "access-control-allow-origin" */ #define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN \ - (::grpc_core::g_static_metadata_slice_table[57]) + (::grpc_core::g_static_metadata_slice_table[49]) /* "age" */ -#define GRPC_MDSTR_AGE (::grpc_core::g_static_metadata_slice_table[58]) +#define GRPC_MDSTR_AGE (::grpc_core::g_static_metadata_slice_table[50]) /* "allow" */ -#define GRPC_MDSTR_ALLOW (::grpc_core::g_static_metadata_slice_table[59]) +#define GRPC_MDSTR_ALLOW (::grpc_core::g_static_metadata_slice_table[51]) /* "authorization" */ #define GRPC_MDSTR_AUTHORIZATION \ - (::grpc_core::g_static_metadata_slice_table[60]) + (::grpc_core::g_static_metadata_slice_table[52]) /* "cache-control" */ #define GRPC_MDSTR_CACHE_CONTROL \ - (::grpc_core::g_static_metadata_slice_table[61]) + (::grpc_core::g_static_metadata_slice_table[53]) /* "content-disposition" */ #define GRPC_MDSTR_CONTENT_DISPOSITION \ - (::grpc_core::g_static_metadata_slice_table[62]) + (::grpc_core::g_static_metadata_slice_table[54]) /* "content-language" */ #define GRPC_MDSTR_CONTENT_LANGUAGE \ - (::grpc_core::g_static_metadata_slice_table[63]) + (::grpc_core::g_static_metadata_slice_table[55]) /* "content-length" */ #define GRPC_MDSTR_CONTENT_LENGTH \ - (::grpc_core::g_static_metadata_slice_table[64]) + (::grpc_core::g_static_metadata_slice_table[56]) /* "content-location" */ #define GRPC_MDSTR_CONTENT_LOCATION \ - (::grpc_core::g_static_metadata_slice_table[65]) + (::grpc_core::g_static_metadata_slice_table[57]) /* "content-range" */ #define GRPC_MDSTR_CONTENT_RANGE \ - (::grpc_core::g_static_metadata_slice_table[66]) + (::grpc_core::g_static_metadata_slice_table[58]) /* "cookie" */ -#define GRPC_MDSTR_COOKIE (::grpc_core::g_static_metadata_slice_table[67]) +#define GRPC_MDSTR_COOKIE (::grpc_core::g_static_metadata_slice_table[59]) /* "date" */ -#define GRPC_MDSTR_DATE (::grpc_core::g_static_metadata_slice_table[68]) +#define GRPC_MDSTR_DATE (::grpc_core::g_static_metadata_slice_table[60]) /* "etag" */ -#define GRPC_MDSTR_ETAG (::grpc_core::g_static_metadata_slice_table[69]) +#define GRPC_MDSTR_ETAG (::grpc_core::g_static_metadata_slice_table[61]) /* "expect" */ -#define GRPC_MDSTR_EXPECT (::grpc_core::g_static_metadata_slice_table[70]) +#define GRPC_MDSTR_EXPECT (::grpc_core::g_static_metadata_slice_table[62]) /* "expires" */ -#define GRPC_MDSTR_EXPIRES (::grpc_core::g_static_metadata_slice_table[71]) +#define GRPC_MDSTR_EXPIRES (::grpc_core::g_static_metadata_slice_table[63]) /* "from" */ -#define GRPC_MDSTR_FROM (::grpc_core::g_static_metadata_slice_table[72]) +#define GRPC_MDSTR_FROM (::grpc_core::g_static_metadata_slice_table[64]) +/* "host" */ +#define GRPC_MDSTR_HOST (::grpc_core::g_static_metadata_slice_table[65]) /* "if-match" */ -#define GRPC_MDSTR_IF_MATCH (::grpc_core::g_static_metadata_slice_table[73]) +#define GRPC_MDSTR_IF_MATCH (::grpc_core::g_static_metadata_slice_table[66]) /* "if-modified-since" */ #define GRPC_MDSTR_IF_MODIFIED_SINCE \ - (::grpc_core::g_static_metadata_slice_table[74]) + (::grpc_core::g_static_metadata_slice_table[67]) /* "if-none-match" */ #define GRPC_MDSTR_IF_NONE_MATCH \ - (::grpc_core::g_static_metadata_slice_table[75]) + (::grpc_core::g_static_metadata_slice_table[68]) /* "if-range" */ -#define GRPC_MDSTR_IF_RANGE (::grpc_core::g_static_metadata_slice_table[76]) +#define GRPC_MDSTR_IF_RANGE (::grpc_core::g_static_metadata_slice_table[69]) /* "if-unmodified-since" */ #define GRPC_MDSTR_IF_UNMODIFIED_SINCE \ - (::grpc_core::g_static_metadata_slice_table[77]) + (::grpc_core::g_static_metadata_slice_table[70]) /* "last-modified" */ #define GRPC_MDSTR_LAST_MODIFIED \ - (::grpc_core::g_static_metadata_slice_table[78]) + (::grpc_core::g_static_metadata_slice_table[71]) /* "link" */ -#define GRPC_MDSTR_LINK (::grpc_core::g_static_metadata_slice_table[79]) +#define GRPC_MDSTR_LINK (::grpc_core::g_static_metadata_slice_table[72]) /* "location" */ -#define GRPC_MDSTR_LOCATION (::grpc_core::g_static_metadata_slice_table[80]) +#define GRPC_MDSTR_LOCATION (::grpc_core::g_static_metadata_slice_table[73]) /* "max-forwards" */ -#define GRPC_MDSTR_MAX_FORWARDS (::grpc_core::g_static_metadata_slice_table[81]) +#define GRPC_MDSTR_MAX_FORWARDS (::grpc_core::g_static_metadata_slice_table[74]) /* "proxy-authenticate" */ #define GRPC_MDSTR_PROXY_AUTHENTICATE \ - (::grpc_core::g_static_metadata_slice_table[82]) + (::grpc_core::g_static_metadata_slice_table[75]) /* "proxy-authorization" */ #define GRPC_MDSTR_PROXY_AUTHORIZATION \ - (::grpc_core::g_static_metadata_slice_table[83]) + (::grpc_core::g_static_metadata_slice_table[76]) /* "range" */ -#define GRPC_MDSTR_RANGE (::grpc_core::g_static_metadata_slice_table[84]) +#define GRPC_MDSTR_RANGE (::grpc_core::g_static_metadata_slice_table[77]) /* "referer" */ -#define GRPC_MDSTR_REFERER (::grpc_core::g_static_metadata_slice_table[85]) +#define GRPC_MDSTR_REFERER (::grpc_core::g_static_metadata_slice_table[78]) /* "refresh" */ -#define GRPC_MDSTR_REFRESH (::grpc_core::g_static_metadata_slice_table[86]) +#define GRPC_MDSTR_REFRESH (::grpc_core::g_static_metadata_slice_table[79]) /* "retry-after" */ -#define GRPC_MDSTR_RETRY_AFTER (::grpc_core::g_static_metadata_slice_table[87]) +#define GRPC_MDSTR_RETRY_AFTER (::grpc_core::g_static_metadata_slice_table[80]) /* "server" */ -#define GRPC_MDSTR_SERVER (::grpc_core::g_static_metadata_slice_table[88]) +#define GRPC_MDSTR_SERVER (::grpc_core::g_static_metadata_slice_table[81]) /* "set-cookie" */ -#define GRPC_MDSTR_SET_COOKIE (::grpc_core::g_static_metadata_slice_table[89]) +#define GRPC_MDSTR_SET_COOKIE (::grpc_core::g_static_metadata_slice_table[82]) /* "strict-transport-security" */ #define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY \ - (::grpc_core::g_static_metadata_slice_table[90]) + (::grpc_core::g_static_metadata_slice_table[83]) /* "transfer-encoding" */ #define GRPC_MDSTR_TRANSFER_ENCODING \ - (::grpc_core::g_static_metadata_slice_table[91]) + (::grpc_core::g_static_metadata_slice_table[84]) +/* "user-agent" */ +#define GRPC_MDSTR_USER_AGENT (::grpc_core::g_static_metadata_slice_table[85]) /* "vary" */ -#define GRPC_MDSTR_VARY (::grpc_core::g_static_metadata_slice_table[92]) +#define GRPC_MDSTR_VARY (::grpc_core::g_static_metadata_slice_table[86]) /* "via" */ -#define GRPC_MDSTR_VIA (::grpc_core::g_static_metadata_slice_table[93]) +#define GRPC_MDSTR_VIA (::grpc_core::g_static_metadata_slice_table[87]) /* "www-authenticate" */ #define GRPC_MDSTR_WWW_AUTHENTICATE \ - (::grpc_core::g_static_metadata_slice_table[94]) + (::grpc_core::g_static_metadata_slice_table[88]) /* "0" */ -#define GRPC_MDSTR_0 (::grpc_core::g_static_metadata_slice_table[95]) +#define GRPC_MDSTR_0 (::grpc_core::g_static_metadata_slice_table[89]) /* "identity" */ -#define GRPC_MDSTR_IDENTITY (::grpc_core::g_static_metadata_slice_table[96]) +#define GRPC_MDSTR_IDENTITY (::grpc_core::g_static_metadata_slice_table[90]) /* "application/grpc" */ #define GRPC_MDSTR_APPLICATION_SLASH_GRPC \ - (::grpc_core::g_static_metadata_slice_table[97]) + (::grpc_core::g_static_metadata_slice_table[91]) /* "grpc" */ -#define GRPC_MDSTR_GRPC (::grpc_core::g_static_metadata_slice_table[98]) +#define GRPC_MDSTR_GRPC (::grpc_core::g_static_metadata_slice_table[92]) /* "PUT" */ -#define GRPC_MDSTR_PUT (::grpc_core::g_static_metadata_slice_table[99]) +#define GRPC_MDSTR_PUT (::grpc_core::g_static_metadata_slice_table[93]) /* "lb-cost-bin" */ -#define GRPC_MDSTR_LB_COST_BIN (::grpc_core::g_static_metadata_slice_table[100]) +#define GRPC_MDSTR_LB_COST_BIN (::grpc_core::g_static_metadata_slice_table[94]) /* "identity,deflate" */ #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE \ - (::grpc_core::g_static_metadata_slice_table[101]) + (::grpc_core::g_static_metadata_slice_table[95]) /* "identity,gzip" */ #define GRPC_MDSTR_IDENTITY_COMMA_GZIP \ - (::grpc_core::g_static_metadata_slice_table[102]) + (::grpc_core::g_static_metadata_slice_table[96]) /* "deflate,gzip" */ #define GRPC_MDSTR_DEFLATE_COMMA_GZIP \ - (::grpc_core::g_static_metadata_slice_table[103]) + (::grpc_core::g_static_metadata_slice_table[97]) /* "identity,deflate,gzip" */ #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \ - (::grpc_core::g_static_metadata_slice_table[104]) + (::grpc_core::g_static_metadata_slice_table[98]) namespace grpc_core { extern StaticSliceRefcount diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 309c5b7c0ee..bb5a115ca11 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -899,7 +899,6 @@ static grpc_metadata* get_md_elem(grpc_metadata* metadata, static int prepare_application_metadata(grpc_call* call, int count, grpc_metadata* metadata, int is_trailing, - int prepend_extra_metadata, grpc_metadata* additional_metadata, int additional_metadata_count) { int total_count = count + additional_metadata_count; @@ -932,16 +931,6 @@ static int prepare_application_metadata(grpc_call* call, int count, } return 0; } - if (prepend_extra_metadata) { - if (call->send_extra_metadata_count == 0) { - prepend_extra_metadata = 0; - } else { - for (i = 0; i < call->send_extra_metadata_count; i++) { - GRPC_LOG_IF_ERROR("prepare_application_metadata", - batch->LinkTail(&call->send_extra_metadata[i])); - } - } - } for (i = 0; i < total_count; i++) { grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count); grpc_linked_mdelem* l = linked_from_md(md); @@ -951,7 +940,6 @@ static int prepare_application_metadata(grpc_call* call, int count, } GRPC_LOG_IF_ERROR("prepare_application_metadata", error); } - call->send_extra_metadata_count = 0; return 1; } @@ -1089,12 +1077,10 @@ static void recv_trailing_filter(void* args, grpc_metadata_batch* b, static_cast(status_code)); gpr_free(peer); } - if (b->legacy_index()->named.grpc_message != nullptr) { - error = grpc_error_set_str( - error, GRPC_ERROR_STR_GRPC_MESSAGE, - grpc_core::StringViewFromSlice( - GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md))); - b->Remove(GRPC_BATCH_GRPC_MESSAGE); + auto grpc_message = b->Take(grpc_core::GrpcMessageMetadata()); + if (grpc_message.has_value()) { + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_message->as_string_view()); } else if (error != GRPC_ERROR_NONE) { error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, ""); } @@ -1675,10 +1661,20 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, } stream_op->send_initial_metadata = true; call->sent_initial_metadata = true; + if (call->is_client) { + // TODO(ctiller): this will turn into explicit Set() calls once we + // migrate :path, :authority. + for (int i = 0; i < call->send_extra_metadata_count; i++) { + GRPC_LOG_IF_ERROR("prepare_client_metadata", + call->send_initial_metadata.LinkTail( + &call->send_extra_metadata[i])); + } + call->send_extra_metadata_count = 0; + } if (!prepare_application_metadata( call, static_cast(op->data.send_initial_metadata.count), - op->data.send_initial_metadata.metadata, 0, call->is_client, - &compression_md, static_cast(additional_metadata_count))) { + op->data.send_initial_metadata.metadata, 0, &compression_md, + static_cast(additional_metadata_count))) { error = GRPC_CALL_ERROR_INVALID_METADATA; goto done_with_error; } @@ -1770,10 +1766,17 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, } stream_op->send_trailing_metadata = true; call->sent_final_op = true; - GPR_ASSERT(call->send_extra_metadata_count == 0); - call->send_extra_metadata_count = 1; - call->send_extra_metadata[0].md = grpc_get_reffed_status_elem( - op->data.send_status_from_server.status); + + if (!prepare_application_metadata( + call, + static_cast( + op->data.send_status_from_server.trailing_metadata_count), + op->data.send_status_from_server.trailing_metadata, 1, nullptr, + 0)) { + error = GRPC_CALL_ERROR_INVALID_METADATA; + goto done_with_error; + } + grpc_error_handle status_error = op->data.send_status_from_server.status == GRPC_STATUS_OK ? GRPC_ERROR_NONE @@ -1784,36 +1787,26 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops, static_cast( op->data.send_status_from_server.status)); if (op->data.send_status_from_server.status_details != nullptr) { - call->send_extra_metadata[1].md = grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_MESSAGE, - grpc_slice_copy( - *op->data.send_status_from_server.status_details)); - call->send_extra_metadata_count++; + call->send_trailing_metadata.Set( + grpc_core::GrpcMessageMetadata(), + grpc_core::Slice(grpc_slice_copy( + *op->data.send_status_from_server.status_details))); if (status_error != GRPC_ERROR_NONE) { - char* msg = grpc_slice_to_c_string( - GRPC_MDVALUE(call->send_extra_metadata[1].md)); - status_error = grpc_error_set_str(status_error, - GRPC_ERROR_STR_GRPC_MESSAGE, msg); - gpr_free(msg); + status_error = grpc_error_set_str( + status_error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_core::StringViewFromSlice( + *op->data.send_status_from_server.status_details)); } } call->status_error.set(status_error); GRPC_ERROR_UNREF(status_error); - if (!prepare_application_metadata( - call, - static_cast( - op->data.send_status_from_server.trailing_metadata_count), - op->data.send_status_from_server.trailing_metadata, 1, 1, - nullptr, 0)) { - for (int n = 0; n < call->send_extra_metadata_count; n++) { - GRPC_MDELEM_UNREF(call->send_extra_metadata[n].md); - } - call->send_extra_metadata_count = 0; - error = GRPC_CALL_ERROR_INVALID_METADATA; - goto done_with_error; - } + GRPC_LOG_IF_ERROR( + "set call status", + call->send_trailing_metadata.Append(grpc_get_reffed_status_elem( + op->data.send_status_from_server.status))); + stream_op_payload->send_trailing_metadata.send_trailing_metadata = &call->send_trailing_metadata; stream_op_payload->send_trailing_metadata.sent = diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h index d2b8de6b03c..6ea4ae30db8 100644 --- a/src/core/lib/transport/metadata_batch.h +++ b/src/core/lib/transport/metadata_batch.h @@ -138,11 +138,9 @@ struct TeMetadata { } }; -// user-agent metadata trait. -struct UserAgentMetadata { +struct SimpleSliceBasedMetadata { using ValueType = Slice; using MementoType = Slice; - static absl::string_view key() { return "user-agent"; } static MementoType ParseMemento(Slice value) { return value.TakeOwned(); } static ValueType MementoToValue(MementoType value) { return value; } static Slice Encode(const ValueType& x) { return x.Ref(); } @@ -151,68 +149,139 @@ struct UserAgentMetadata { } }; +// user-agent metadata trait. +struct UserAgentMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "user-agent"; } +}; + +// grpc-message metadata trait. +struct GrpcMessageMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "grpc-message"; } +}; + +// host metadata trait. +struct HostMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "host"; } +}; + +// x-endpoint-load-metrics-bin metadata trait. +struct XEndpointLoadMetricsBinMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "x-endpoint-load-metrics-bin"; } +}; + +// grpc-server-stats-bin metadata trait. +struct GrpcServerStatsBinMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "grpc-server-stats-bin"; } +}; + +// grpc-trace-bin metadata trait. +struct GrpcTraceBinMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "grpc-trace-bin"; } +}; + +// grpc-tags-bin metadata trait. +struct GrpcTagsBinMetadata : public SimpleSliceBasedMetadata { + static absl::string_view key() { return "grpc-tags-bin"; } +}; + namespace metadata_detail { -// Inner implementation of MetadataMap::Parse() -// Recursive in terms of metadata trait, tries each known type in order by doing -// a string comparison on key, and if that key is found parses it. If not found, -// calls not_found to generate the result value. -template -struct ParseHelper; - -template -struct ParseHelper { - template - static ParsedMetadata Parse(absl::string_view key, Slice value, - uint32_t transport_size, - NotFound not_found) { +// Helper type - maps a string name to a trait. +template +struct NameLookup; + +template +struct NameLookup { + // Call op->Found(Trait()) if op->name == Trait::key() for some Trait in + // Traits. If not found, call op->NotFount(). + template + static auto Lookup(absl::string_view key, Op* op) + -> decltype(op->Found(Trait())) { if (key == Trait::key()) { - return ParsedMetadata( - Trait(), Trait::ParseMemento(value.TakeOwned()), transport_size); + return op->Found(Trait()); } - return ParseHelper::Parse(key, std::move(value), - transport_size, not_found); + return NameLookup::Lookup(key, op); } }; -template -struct ParseHelper { - template - static ParsedMetadata Parse(absl::string_view, Slice value, - uint32_t, NotFound not_found) { - return not_found(std::move(value)); +template <> +struct NameLookup<> { + template + static auto Lookup(absl::string_view key, Op* op) + -> decltype(op->NotFound(key)) { + return op->NotFound(key); } }; -// Inner implementation of MetadataMap::Append() -// Recursive in terms of metadata trait, tries each known type in order by doing -// a string comparison on key, and if that key is found sets it. If not found, -// calls not_found to append generically. -template -struct AppendHelper; - -template -struct AppendHelper { - template - static void Append(Container* container, absl::string_view key, Slice value, - NotFound not_found) { - if (key == Trait::key()) { - container->Set(Trait(), Trait::MementoToValue( - Trait::ParseMemento(value.TakeOwned()))); - return; - } - AppendHelper::Append(container, key, std::move(value), - not_found); +// Helper to take a slice to a memento to a value. +// By splitting this part out we can scale code size as the number of (memento, +// value) types, rather than as the number of traits. +template +struct ParseValue { + template + static GPR_ATTRIBUTE_NOINLINE auto Parse(Slice* value) + -> decltype(memento_to_value(parse_memento(std::move(*value)))) { + return memento_to_value(parse_memento(std::move(*value))); } }; +// This is an "Op" type for NameLookup. +// Used for MetadataMap::Parse, its Found/NotFound methods turn a slice into a +// ParsedMetadata object. template -struct AppendHelper { - template - static void Append(Container*, absl::string_view, Slice value, - NotFound not_found) { - not_found(std::move(value)); +class ParseHelper { + public: + ParseHelper(Slice value, size_t transport_size) + : value_(std::move(value)), transport_size_(transport_size) {} + + template + ParsedMetadata Found(Trait trait) { + return ParsedMetadata( + trait, Trait::ParseMemento(std::move(value_)), transport_size_); + } + + GPR_ATTRIBUTE_NOINLINE ParsedMetadata NotFound( + absl::string_view key) { + return ParsedMetadata( + grpc_mdelem_from_slices(grpc_slice_intern(grpc_slice_from_static_buffer( + key.data(), key.size())), + value_.TakeCSlice())); } + + private: + Slice value_; + const size_t transport_size_; +}; + +// This is an "Op" type for NameLookup. +// Used for MetadataMap::Parse, its Found/NotFound methods turn a slice into a +// value and add it to a container. +template +class AppendHelper { + public: + AppendHelper(Container* container, Slice value) + : container_(container), value_(std::move(value)) {} + + template + GPR_ATTRIBUTE_NOINLINE void Found(Trait trait) { + container_->Set( + trait, ParseValue:: + template Parse( + &value_)); + } + + void NotFound(absl::string_view key) { + GPR_ASSERT(GRPC_ERROR_NONE == + container_->Append(grpc_mdelem_from_slices( + grpc_slice_intern( + grpc_slice_from_static_buffer(key.data(), key.length())), + value_.TakeCSlice()))); + } + + private: + Container* const container_; + Slice value_; }; } // namespace metadata_detail @@ -239,7 +308,7 @@ struct AppendHelper { // // The type that's stored in compression/decompression tables // using MementoType = ...; // // The string key for this metadata type (for transports that require it) -// static constexpr absl::string_view key() { return "grpc-xyz"; } +// static absl::string_view key() { return "grpc-xyz"; } // // Parse a memento from a slice // // Takes ownership of value // static MementoType ParseMemento(Slice value) { ... } @@ -352,9 +421,12 @@ class MetadataMap { // m.Remove(T()); template absl::optional Take(Which which) { - auto value = get(which); - Remove(which); - return value; + if (auto* p = get_pointer(which)) { + absl::optional value(std::move(*p)); + Remove(which); + return value; + } + return {}; } // Parse metadata from a key/value pair, and return an object representing @@ -363,16 +435,9 @@ class MetadataMap { // Once we don't care about interning anymore, make that change! static ParsedMetadata Parse(absl::string_view key, Slice value, uint32_t transport_size) { - bool parsed = true; - auto out = metadata_detail::ParseHelper::Parse( - key, std::move(value), transport_size, [&](Slice value) { - parsed = false; - return ParsedMetadata(grpc_mdelem_from_slices( - grpc_slice_intern( - grpc_slice_from_static_buffer(key.data(), key.size())), - value.TakeCSlice())); - }); - return out; + metadata_detail::ParseHelper helper(value.TakeOwned(), + transport_size); + return metadata_detail::NameLookup::Lookup(key, &helper); } // Set a value from a parsed metadata object. @@ -383,14 +448,8 @@ class MetadataMap { // Append a key/value pair - takes ownership of value void Append(absl::string_view key, Slice value) { - metadata_detail::AppendHelper::Append( - this, key, std::move(value), [this, key](Slice value) { - GPR_ASSERT(GRPC_ERROR_NONE == - Append(grpc_mdelem_from_slices( - grpc_slice_intern(grpc_slice_from_static_buffer( - key.data(), key.length())), - value.TakeCSlice()))); - }); + metadata_detail::AppendHelper helper(this, value.TakeOwned()); + metadata_detail::NameLookup::Lookup(key, &helper); } // @@ -908,9 +967,12 @@ bool MetadataMap::ReplaceIfExists(grpc_slice key, grpc_slice value) { } // namespace grpc_core -using grpc_metadata_batch = - grpc_core::MetadataMap; +using grpc_metadata_batch = grpc_core::MetadataMap< + grpc_core::GrpcTimeoutMetadata, grpc_core::TeMetadata, + grpc_core::UserAgentMetadata, grpc_core::GrpcMessageMetadata, + grpc_core::HostMetadata, grpc_core::XEndpointLoadMetricsBinMetadata, + grpc_core::GrpcServerStatsBinMetadata, grpc_core::GrpcTraceBinMetadata, + grpc_core::GrpcTagsBinMetadata>; inline void grpc_metadata_batch_clear(grpc_metadata_batch* batch) { batch->Clear(); diff --git a/src/core/lib/transport/parsed_metadata.cc b/src/core/lib/transport/parsed_metadata.cc new file mode 100644 index 00000000000..d819393eac5 --- /dev/null +++ b/src/core/lib/transport/parsed_metadata.cc @@ -0,0 +1,35 @@ +// Copyright 2021 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "src/core/lib/transport/parsed_metadata.h" + +namespace grpc_core { +namespace metadata_detail { + +std::string MakeDebugString(absl::string_view key, absl::string_view value) { + return absl::StrCat(key, ": ", value); +} + +Slice SliceFromBuffer(const Buffer& buffer) { + return Slice(grpc_slice_ref_internal(buffer.slice)); +} + +void DestroySliceValue(const Buffer& value) { + grpc_slice_unref_internal(value.slice); +} + +} // namespace metadata_detail +} // namespace grpc_core diff --git a/src/core/lib/transport/parsed_metadata.h b/src/core/lib/transport/parsed_metadata.h index 366dc3d0fe2..5a2ca1e7e90 100644 --- a/src/core/lib/transport/parsed_metadata.h +++ b/src/core/lib/transport/parsed_metadata.h @@ -41,6 +41,51 @@ struct HasSimpleMemento { sizeof(typename Which::MementoType) <= sizeof(uint64_t); }; +// Storage type for a single metadata entry. +union Buffer { + uint64_t trivial; + void* pointer; + grpc_slice slice; + grpc_mdelem mdelem; +}; + +// Given a key and a value, concatenate together to make a debug string. +// Split out to avoid template bloat. +std::string MakeDebugString(absl::string_view key, absl::string_view value); + +// Wrapper around MakeDebugString. +// For the value part, use two functions - one to extract a typed field from +// Buffer, and a second (sourced from the trait) to generate a displayable debug +// string from the field value. We try to maximize indirection/code sharing here +// as this is not critical path code and we'd like to avoid some code bloat - +// better to scale by number of types than then number of metadata traits! +template +GPR_ATTRIBUTE_NOINLINE std::string MakeDebugStringPipeline( + absl::string_view key, const Buffer& value, + Field (*field_from_buffer)(const Buffer&), + Display (*display_from_field)(CompatibleWithField)) { + return MakeDebugString( + key, absl::StrCat(display_from_field(field_from_buffer(value)))); +} + +// Extract a trivial field value from a Buffer - for MakeDebugStringPipeline. +template +Field FieldFromTrivial(const Buffer& value) { + return static_cast(value.trivial); +} + +// Extract a pointer field value from a Buffer - for MakeDebugStringPipeline. +template +Field FieldFromPointer(const Buffer& value) { + return *static_cast(value.pointer); +} + +// Extract a Slice from a Buffer. +Slice SliceFromBuffer(const Buffer& buffer); + +// Unref the grpc_slice part of a Buffer (assumes it is in fact a grpc_slice). +void DestroySliceValue(const Buffer& value); + } // namespace metadata_detail // A parsed metadata value. @@ -77,6 +122,7 @@ class ParsedMetadata { transport_size_(transport_size) { value_.pointer = new typename Which::MementoType(std::move(value)); } + // Construct metadata from a Slice typed value. template ParsedMetadata(Which, Slice value, uint32_t transport_size) : vtable_(ParsedMetadata::template SliceTraitVTable()), @@ -123,7 +169,13 @@ class ParsedMetadata { uint32_t transport_size() const { return transport_size_; } // Create a new parsed metadata with the same key but a different value. ParsedMetadata WithNewValue(Slice value) const { - return vtable_->with_new_value(value_, &value); + ParsedMetadata result; + result.vtable_ = vtable_; + result.value_ = value_; + result.transport_size_ = + TransportSize(vtable_->key_length(value_), value.length()); + vtable_->with_new_value(&value, &result); + return result; } std::string DebugString() const { return vtable_->debug_string(value_); } @@ -134,24 +186,19 @@ class ParsedMetadata { } private: - union Buffer { - uint64_t trivial; - void* pointer; - grpc_slice slice; - grpc_mdelem mdelem; - }; + using Buffer = metadata_detail::Buffer; struct VTable { const bool is_binary_header; void (*const destroy)(const Buffer& value); grpc_error_handle (*const set)(const Buffer& value, MetadataContainer* container); - // TODO(ctiller): ideally we'd pass new_value by value here, but there was - // an apparent miscompile with gcc-4.9 and WithNewValue - passing a pointer - // here fixed it. - ParsedMetadata (*const with_new_value)(const Buffer& value, - Slice* new_value); - std::string (*debug_string)(const Buffer& value); + // result is a bitwise copy of the originating ParsedMetadata. + void (*const with_new_value)(Slice* new_value, ParsedMetadata* result); + std::string (*const debug_string)(const Buffer& value); + // TODO(ctiller): when we delete mdelem, make this a simple integer constant + // on the vtable + size_t (*const key_length)(const Buffer& value); }; static const VTable* EmptyVTable(); @@ -164,11 +211,18 @@ class ParsedMetadata { template static const VTable* MdelemVtable(); + template + GPR_ATTRIBUTE_NOINLINE void WithNewValueSetSlice(Slice* slice) { + value_.slice = ParseMemento(std::move(*slice)).TakeCSlice(); + } + const VTable* vtable_; Buffer value_; uint32_t transport_size_; }; +namespace metadata_detail {} // namespace metadata_detail + template const typename ParsedMetadata::VTable* ParsedMetadata::EmptyVTable() { @@ -179,9 +233,12 @@ ParsedMetadata::EmptyVTable() { // set [](const Buffer&, MetadataContainer*) { return GRPC_ERROR_NONE; }, // with_new_value - [](const Buffer&, Slice*) { return ParsedMetadata(); }, + [](Slice*, ParsedMetadata*) {}, // debug_string - [](const Buffer&) -> std::string { return "empty"; }}; + [](const Buffer&) -> std::string { return "empty"; }, + // key_length + [](const Buffer&) -> size_t { return 0; }, + }; return &vtable; } @@ -201,18 +258,19 @@ ParsedMetadata::TrivialTraitVTable() { return GRPC_ERROR_NONE; }, // with_new_value - [](const Buffer&, Slice* value) { - const auto length = value->length(); - return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)), - TransportSize(Which::key().length(), length)); + [](Slice* value, ParsedMetadata* result) { + result->value_.trivial = Which::ParseMemento(std::move(*value)); }, // debug_string [](const Buffer& value) { - return absl::StrCat( - Which::key(), ": ", - Which::DisplayValue( - static_cast(value.trivial))); - }}; + return metadata_detail::MakeDebugStringPipeline( + Which::key(), value, + metadata_detail::FieldFromTrivial, + Which::DisplayValue); + }, + // key_length + [](const Buffer&) { return Which::key().size(); }, + }; return &vtable; } @@ -233,16 +291,20 @@ ParsedMetadata::NonTrivialTraitVTable() { return GRPC_ERROR_NONE; }, // with_new_value - [](const Buffer&, Slice* value) { - const auto length = value->length(); - return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)), - TransportSize(Which::key().length(), length)); + [](Slice* value, ParsedMetadata* result) { + result->value_.pointer = new + typename Which::MementoType(Which::ParseMemento(std::move(*value))); }, // debug_string [](const Buffer& value) { - auto* p = static_cast(value.pointer); - return absl::StrCat(Which::key(), ": ", Which::DisplayValue(*p)); - }}; + return metadata_detail::MakeDebugStringPipeline( + Which::key(), value, + metadata_detail::FieldFromPointer, + Which::DisplayValue); + }, + // key_length + [](const Buffer&) { return Which::key().size(); }, + }; return &vtable; } @@ -253,24 +315,26 @@ ParsedMetadata::SliceTraitVTable() { static const VTable vtable = { absl::EndsWith(Which::key(), "-bin"), // destroy - [](const Buffer& value) { grpc_slice_unref_internal(value.slice); }, + metadata_detail::DestroySliceValue, // set [](const Buffer& value, MetadataContainer* map) { - map->Set(Which(), Slice(grpc_slice_ref_internal(value.slice))); + map->Set(Which(), Which::MementoToValue( + metadata_detail::SliceFromBuffer(value))); return GRPC_ERROR_NONE; }, // with_new_value - [](const Buffer&, Slice* value) { - const auto length = value->length(); - return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)), - TransportSize(Which::key().length(), length)); + [](Slice* value, ParsedMetadata* result) { + result->WithNewValueSetSlice(value); }, // debug_string [](const Buffer& value) { - return absl::StrCat( - Which::key(), ": ", - Which::DisplayValue(Slice(grpc_slice_ref_internal(value.slice)))); - }}; + return metadata_detail::MakeDebugStringPipeline( + Which::key(), value, metadata_detail::SliceFromBuffer, + Which::DisplayValue); + }, + // key_length + [](const Buffer&) { return Which::key().size(); }, + }; return &vtable; } @@ -294,16 +358,21 @@ ParsedMetadata::MdelemVtable() { return err; }, // with_new_value - [](const Buffer& value, Slice* value_slice) { - return ParsedMetadata(grpc_mdelem_from_slices( + [](Slice* value_slice, ParsedMetadata* result) { + result->value_.mdelem = grpc_mdelem_from_slices( static_cast( - grpc_slice_ref_internal(GRPC_MDKEY(value.mdelem))), - value_slice->TakeCSlice())); + grpc_slice_ref_internal(GRPC_MDKEY(result->value_.mdelem))), + value_slice->TakeCSlice()); }, // debug_string [](const Buffer& value) { - return absl::StrCat(StringViewFromSlice(GRPC_MDKEY(value.mdelem)), ": ", - StringViewFromSlice(GRPC_MDVALUE(value.mdelem))); + return metadata_detail::MakeDebugString( + StringViewFromSlice(GRPC_MDKEY(value.mdelem)), + StringViewFromSlice(GRPC_MDVALUE(value.mdelem))); + }, + // key_length + [](const Buffer& value) { + return GRPC_SLICE_LENGTH(GRPC_MDKEY(value.mdelem)); }}; return &vtable; } diff --git a/src/core/lib/transport/static_metadata.cc b/src/core/lib/transport/static_metadata.cc index 6bc50f769bf..0ea4b614a7d 100644 --- a/src/core/lib/transport/static_metadata.cc +++ b/src/core/lib/transport/static_metadata.cc @@ -35,506 +35,506 @@ StaticMetadata g_static_mdelem_table[GRPC_STATIC_MDELEM_COUNT] = { StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[3].base, 10, g_static_metadata_bytes + 19), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 0), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7, g_static_metadata_bytes + 5), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3, - g_static_metadata_bytes + 720), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 3, + g_static_metadata_bytes + 603), 1), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7, g_static_metadata_bytes + 5), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 4, - g_static_metadata_bytes + 723), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 4, + g_static_metadata_bytes + 606), 2), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[0].base, 5, g_static_metadata_bytes + 0), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 1, - g_static_metadata_bytes + 727), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 1, + g_static_metadata_bytes + 610), 3), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[0].base, 5, g_static_metadata_bytes + 0), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 11, - g_static_metadata_bytes + 728), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 11, + g_static_metadata_bytes + 611), 4), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7, g_static_metadata_bytes + 29), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 4, - g_static_metadata_bytes + 739), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, + g_static_metadata_bytes + 622), 5), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7, g_static_metadata_bytes + 29), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 5, - g_static_metadata_bytes + 743), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5, + g_static_metadata_bytes + 626), 6), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 3, - g_static_metadata_bytes + 748), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 3, + g_static_metadata_bytes + 631), 7), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 3, - g_static_metadata_bytes + 751), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 3, + g_static_metadata_bytes + 634), 8), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 3, - g_static_metadata_bytes + 754), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3, + g_static_metadata_bytes + 637), 9), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 3, - g_static_metadata_bytes + 757), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 3, + g_static_metadata_bytes + 640), 10), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 3, - g_static_metadata_bytes + 760), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 3, + g_static_metadata_bytes + 643), 11), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3, - g_static_metadata_bytes + 763), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 3, + g_static_metadata_bytes + 646), 12), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7, g_static_metadata_bytes + 12), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 3, - g_static_metadata_bytes + 766), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 3, + g_static_metadata_bytes + 649), 13), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 14, - g_static_metadata_bytes + 769), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 14, + g_static_metadata_bytes + 652), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 14), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13, - g_static_metadata_bytes + 783), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, + g_static_metadata_bytes + 108), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 13, + g_static_metadata_bytes + 666), 15), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 15, - g_static_metadata_bytes + 796), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 15, + g_static_metadata_bytes + 679), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 16), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13, - g_static_metadata_bytes + 811), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 13, + g_static_metadata_bytes + 694), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 17), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 6, - g_static_metadata_bytes + 824), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 6, + g_static_metadata_bytes + 707), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 18), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 27, - g_static_metadata_bytes + 830), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 27, + g_static_metadata_bytes + 713), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 19), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 3, - g_static_metadata_bytes + 857), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3, + g_static_metadata_bytes + 740), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 20), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 5, - g_static_metadata_bytes + 860), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 5, + g_static_metadata_bytes + 743), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 21), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 13, - g_static_metadata_bytes + 865), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 13, + g_static_metadata_bytes + 748), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 22), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 13, - g_static_metadata_bytes + 878), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13, + g_static_metadata_bytes + 761), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 23), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 19, - g_static_metadata_bytes + 891), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 19, + g_static_metadata_bytes + 774), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 24), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16, - g_static_metadata_bytes + 168), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16, + g_static_metadata_bytes + 92), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 25), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 16, - g_static_metadata_bytes + 910), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 16, + g_static_metadata_bytes + 793), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 26), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 14, - g_static_metadata_bytes + 926), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 14, + g_static_metadata_bytes + 809), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 27), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 16, - g_static_metadata_bytes + 940), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 16, + g_static_metadata_bytes + 823), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 28), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 13, - g_static_metadata_bytes + 956), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13, + g_static_metadata_bytes + 839), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 29), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12, - g_static_metadata_bytes + 156), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12, + g_static_metadata_bytes + 80), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 30), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 6, - g_static_metadata_bytes + 969), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 6, + g_static_metadata_bytes + 852), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 31), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 4, - g_static_metadata_bytes + 975), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 4, + g_static_metadata_bytes + 858), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 32), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 4, - g_static_metadata_bytes + 979), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 4, + g_static_metadata_bytes + 862), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 33), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 6, - g_static_metadata_bytes + 983), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 6, + g_static_metadata_bytes + 866), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 34), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 7, - g_static_metadata_bytes + 989), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 7, + g_static_metadata_bytes + 872), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 35), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4, - g_static_metadata_bytes + 996), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 4, + g_static_metadata_bytes + 879), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 36), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 4, - g_static_metadata_bytes + 229), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 4, + g_static_metadata_bytes + 883), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 37), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8, - g_static_metadata_bytes + 1000), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 8, + g_static_metadata_bytes + 887), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 38), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 17, - g_static_metadata_bytes + 1008), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 17, + g_static_metadata_bytes + 895), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 39), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 13, - g_static_metadata_bytes + 1025), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 13, + g_static_metadata_bytes + 912), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 40), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 8, - g_static_metadata_bytes + 1038), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 8, + g_static_metadata_bytes + 925), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 41), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 19, - g_static_metadata_bytes + 1046), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 19, + g_static_metadata_bytes + 933), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 42), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 13, - g_static_metadata_bytes + 1065), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 13, + g_static_metadata_bytes + 952), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 43), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 4, - g_static_metadata_bytes + 1078), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4, + g_static_metadata_bytes + 965), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 44), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 8, - g_static_metadata_bytes + 1082), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8, + g_static_metadata_bytes + 969), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 45), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 12, - g_static_metadata_bytes + 1090), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 12, + g_static_metadata_bytes + 977), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 46), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 18, - g_static_metadata_bytes + 1102), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 18, + g_static_metadata_bytes + 989), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 47), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 19, - g_static_metadata_bytes + 1120), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 19, + g_static_metadata_bytes + 1007), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 48), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 5, - g_static_metadata_bytes + 1139), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 5, + g_static_metadata_bytes + 1026), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 49), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 7, - g_static_metadata_bytes + 1144), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 7, + g_static_metadata_bytes + 1031), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 50), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 7, - g_static_metadata_bytes + 1151), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 7, + g_static_metadata_bytes + 1038), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 51), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 11, - g_static_metadata_bytes + 1158), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 11, + g_static_metadata_bytes + 1045), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 52), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 6, - g_static_metadata_bytes + 1169), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 6, + g_static_metadata_bytes + 1056), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 53), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 10, - g_static_metadata_bytes + 1175), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 10, + g_static_metadata_bytes + 1062), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 54), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 25, - g_static_metadata_bytes + 1185), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 25, + g_static_metadata_bytes + 1072), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 55), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 17, - g_static_metadata_bytes + 1210), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 17, + g_static_metadata_bytes + 1097), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 56), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 10, - g_static_metadata_bytes + 320), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 10, + g_static_metadata_bytes + 1114), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 57), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4, - g_static_metadata_bytes + 1227), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 4, + g_static_metadata_bytes + 1124), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 58), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3, - g_static_metadata_bytes + 1231), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 3, + g_static_metadata_bytes + 1128), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 59), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 16, - g_static_metadata_bytes + 1234), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 16, + g_static_metadata_bytes + 1131), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 60), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11, - g_static_metadata_bytes + 48), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 1, - g_static_metadata_bytes + 1250), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11, + g_static_metadata_bytes + 36), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 1, + g_static_metadata_bytes + 1147), 61), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11, - g_static_metadata_bytes + 48), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 1, - g_static_metadata_bytes + 330), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11, + g_static_metadata_bytes + 36), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1, + g_static_metadata_bytes + 213), 62), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11, - g_static_metadata_bytes + 48), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 1, - g_static_metadata_bytes + 331), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11, + g_static_metadata_bytes + 36), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 1, + g_static_metadata_bytes + 214), 63), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13, - g_static_metadata_bytes + 75), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8, - g_static_metadata_bytes + 1251), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13, + g_static_metadata_bytes + 47), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8, + g_static_metadata_bytes + 1148), 64), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13, - g_static_metadata_bytes + 75), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, - g_static_metadata_bytes + 695), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13, + g_static_metadata_bytes + 47), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4, + g_static_metadata_bytes + 578), 65), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13, - g_static_metadata_bytes + 75), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7, - g_static_metadata_bytes + 688), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13, + g_static_metadata_bytes + 47), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7, + g_static_metadata_bytes + 571), 66), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12, - g_static_metadata_bytes + 156), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 16, - g_static_metadata_bytes + 1259), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12, + g_static_metadata_bytes + 80), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 16, + g_static_metadata_bytes + 1156), 67), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7, g_static_metadata_bytes + 29), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 4, - g_static_metadata_bytes + 1275), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4, + g_static_metadata_bytes + 1172), 68), StaticMetadata( StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7, g_static_metadata_bytes + 5), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[99].base, 3, - g_static_metadata_bytes + 1279), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3, + g_static_metadata_bytes + 1176), 69), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, + g_static_metadata_bytes + 108), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 70), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16, - g_static_metadata_bytes + 168), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8, - g_static_metadata_bytes + 1251), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16, + g_static_metadata_bytes + 92), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8, + g_static_metadata_bytes + 1148), 71), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16, - g_static_metadata_bytes + 168), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, - g_static_metadata_bytes + 695), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16, + g_static_metadata_bytes + 92), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4, + g_static_metadata_bytes + 578), 72), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[100].base, 11, - g_static_metadata_bytes + 1282), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0, - g_static_metadata_bytes + 334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 11, + g_static_metadata_bytes + 1179), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0, + g_static_metadata_bytes + 217), 73), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8, - g_static_metadata_bytes + 1251), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8, + g_static_metadata_bytes + 1148), 74), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7, - g_static_metadata_bytes + 688), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7, + g_static_metadata_bytes + 571), 75), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[101].base, 16, - g_static_metadata_bytes + 1293), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 16, + g_static_metadata_bytes + 1190), 76), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, - g_static_metadata_bytes + 695), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4, + g_static_metadata_bytes + 578), 77), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13, - g_static_metadata_bytes + 1309), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13, + g_static_metadata_bytes + 1206), 78), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[103].base, 12, - g_static_metadata_bytes + 1322), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 12, + g_static_metadata_bytes + 1219), 79), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20, - g_static_metadata_bytes + 88), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[104].base, 21, - g_static_metadata_bytes + 1334), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20, + g_static_metadata_bytes + 60), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 21, + g_static_metadata_bytes + 1231), 80), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8, - g_static_metadata_bytes + 1251), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, + g_static_metadata_bytes + 108), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8, + g_static_metadata_bytes + 1148), 81), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4, - g_static_metadata_bytes + 695), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, + g_static_metadata_bytes + 108), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4, + g_static_metadata_bytes + 578), 82), StaticMetadata( - StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15, - g_static_metadata_bytes + 184), - StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13, - g_static_metadata_bytes + 1309), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15, + g_static_metadata_bytes + 108), + StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13, + g_static_metadata_bytes + 1206), 83), }; @@ -978,17 +978,17 @@ uintptr_t grpc_static_mdelem_user_data[GRPC_STATIC_MDELEM_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4}; static const int8_t elems_r[] = { - 15, 10, -8, 0, 2, -77, -42, 0, 9, -4, 0, 0, 0, 11, 0, - -7, 0, 5, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -63, 0, -47, -68, -48, -71, -72, 0, - 30, 29, 28, 27, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, - 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, - 3, 2, 1, 1, 2, 1, 0, 0, 0, 0, 0, -10, 0}; + 18, 11, -8, 0, -1, -46, 11, 0, 13, 10, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -51, 0, -54, -55, -56, -57, -58, -59, -60, -61, -62, -63, + 0, 33, 32, 31, 30, 29, 29, 28, 27, 26, 25, 24, 23, 22, + 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, + 7, 6, 5, 4, 4, 3, 0, 0, 0, 0, 0, -8, 0}; static uint32_t elems_phash(uint32_t i) { - i -= 41; - uint32_t x = i % 103; - uint32_t y = i / 103; + i -= 33; + uint32_t x = i % 97; + uint32_t y = i / 97; uint32_t h = x; if (y < GPR_ARRAY_SIZE(elems_r)) { uint32_t delta = static_cast(elems_r[y]); @@ -998,25 +998,25 @@ static uint32_t elems_phash(uint32_t i) { } static const uint16_t elem_keys[] = { - 255, 256, 257, 258, 259, 260, 261, 979, 980, 1602, 144, 145, - 463, 464, 1497, 41, 42, 1610, 874, 875, 653, 654, 1505, 1392, - 725, 1812, 2337, 5487, 5802, 6012, 6117, 6222, 6327, 6432, 6537, 1628, - 6642, 6747, 6852, 6957, 7062, 7167, 7272, 7377, 7482, 7587, 7692, 5697, - 7797, 7902, 5907, 8007, 8112, 8217, 8322, 8427, 8532, 8637, 8742, 8847, - 8952, 9057, 9162, 9267, 9372, 9477, 9582, 518, 9687, 1041, 204, 9792, - 9897, 10527, 1046, 1047, 1048, 1049, 1671, 0, 936, 0, 0, 1566, - 1677, 0, 0, 342, 0, 0, 0, 0, 0, 1462}; + 235, 236, 237, 238, 239, 240, 241, 719, 720, 431, 432, 130, + 131, 1009, 910, 811, 620, 621, 33, 34, 584, 1017, 918, 4375, + 4573, 4672, 4771, 4870, 4969, 5068, 5167, 5266, 5365, 5464, 5563, 5662, + 5761, 5860, 5959, 1035, 6058, 6157, 6256, 6355, 6454, 6553, 6652, 6751, + 6850, 6949, 7048, 7147, 7246, 7345, 7444, 7543, 7642, 7741, 7840, 7939, + 8038, 8137, 8236, 8335, 8434, 8533, 488, 8632, 8731, 9325, 0, 783, + 0, 192, 0, 0, 788, 789, 790, 791, 684, 316, 0, 0, + 1080, 981, 0, 883, 510, 511, 1086}; static const uint8_t elem_idxs[] = { - 7, 8, 9, 10, 11, 12, 13, 75, 77, 70, 1, 2, 5, 6, 25, 3, - 4, 82, 66, 65, 62, 63, 72, 30, 61, 37, 57, 14, 17, 19, 20, 21, - 22, 23, 24, 15, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 38, 16, - 39, 40, 18, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 68, 58, 74, 69, 59, 60, 73, 76, 78, 79, 80, 81, 255, - 64, 255, 255, 71, 83, 255, 255, 0, 255, 255, 255, 255, 255, 67}; + 7, 8, 9, 10, 11, 12, 13, 75, 77, 5, 6, 1, 2, 70, 25, 30, + 66, 65, 3, 4, 61, 82, 72, 14, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 26, 27, 28, 29, 31, 32, 15, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 68, 59, 60, 73, 255, 74, 255, 69, 255, 255, 76, 78, 79, 80, + 64, 0, 255, 255, 81, 71, 255, 67, 62, 63, 83}; grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b) { if (a == -1 || b == -1) return GRPC_MDNULL; - uint32_t k = static_cast(a * 105 + b); + uint32_t k = static_cast(a * 99 + b); uint32_t h = elems_phash(k); return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k && elem_idxs[h] != 255 diff --git a/src/core/lib/transport/static_metadata.h b/src/core/lib/transport/static_metadata.h index accf46e0c7f..488e5ec49b5 100644 --- a/src/core/lib/transport/static_metadata.h +++ b/src/core/lib/transport/static_metadata.h @@ -264,22 +264,15 @@ typedef enum { GRPC_BATCH_STATUS, GRPC_BATCH_AUTHORITY, GRPC_BATCH_SCHEME, - GRPC_BATCH_GRPC_MESSAGE, GRPC_BATCH_GRPC_STATUS, - GRPC_BATCH_GRPC_PAYLOAD_BIN, GRPC_BATCH_GRPC_ENCODING, GRPC_BATCH_GRPC_ACCEPT_ENCODING, - GRPC_BATCH_GRPC_SERVER_STATS_BIN, - GRPC_BATCH_GRPC_TAGS_BIN, - GRPC_BATCH_GRPC_TRACE_BIN, GRPC_BATCH_CONTENT_TYPE, GRPC_BATCH_CONTENT_ENCODING, GRPC_BATCH_ACCEPT_ENCODING, GRPC_BATCH_GRPC_INTERNAL_ENCODING_REQUEST, - GRPC_BATCH_HOST, GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS, GRPC_BATCH_GRPC_RETRY_PUSHBACK_MS, - GRPC_BATCH_X_ENDPOINT_LOAD_METRICS_BIN, GRPC_BATCH_CALLOUTS_COUNT } grpc_metadata_batch_callouts_index; @@ -291,22 +284,15 @@ typedef union { struct grpc_linked_mdelem* status; struct grpc_linked_mdelem* authority; struct grpc_linked_mdelem* scheme; - struct grpc_linked_mdelem* grpc_message; struct grpc_linked_mdelem* grpc_status; - struct grpc_linked_mdelem* grpc_payload_bin; struct grpc_linked_mdelem* grpc_encoding; struct grpc_linked_mdelem* grpc_accept_encoding; - struct grpc_linked_mdelem* grpc_server_stats_bin; - struct grpc_linked_mdelem* grpc_tags_bin; - struct grpc_linked_mdelem* grpc_trace_bin; struct grpc_linked_mdelem* content_type; struct grpc_linked_mdelem* content_encoding; struct grpc_linked_mdelem* accept_encoding; struct grpc_linked_mdelem* grpc_internal_encoding_request; - struct grpc_linked_mdelem* host; struct grpc_linked_mdelem* grpc_previous_rpc_attempts; struct grpc_linked_mdelem* grpc_retry_pushback_ms; - struct grpc_linked_mdelem* x_endpoint_load_metrics_bin; } named; } grpc_metadata_batch_callouts; diff --git a/src/cpp/ext/filters/census/client_filter.cc b/src/cpp/ext/filters/census/client_filter.cc index 7fec2fa1568..08fda59c620 100644 --- a/src/cpp/ext/filters/census/client_filter.cc +++ b/src/cpp/ext/filters/census/client_filter.cc @@ -100,19 +100,16 @@ void OpenCensusCallTracer::OpenCensusCallAttemptTracer:: size_t tracing_len = TraceContextSerialize(context_.Context(), tracing_buf, kMaxTraceContextLen); if (tracing_len > 0) { - GRPC_LOG_IF_ERROR( - "census grpc_filter", - send_initial_metadata->Append(grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_TRACE_BIN, - grpc_core::UnmanagedMemorySlice(tracing_buf, tracing_len)))); + send_initial_metadata->Set(grpc_core::GrpcTraceBinMetadata(), + grpc_core::Slice(grpc_core::UnmanagedMemorySlice( + tracing_buf, tracing_len))); } grpc_slice tags = grpc_empty_slice(); // TODO(unknown): Add in tagging serialization. size_t encoded_tags_len = StatsContextSerialize(kMaxTagsLen, &tags); if (encoded_tags_len > 0) { - GRPC_LOG_IF_ERROR("census grpc_filter", - send_initial_metadata->Append(grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_TAGS_BIN, tags))); + send_initial_metadata->Set(grpc_core::GrpcTagsBinMetadata(), + grpc_core::Slice(tags)); } } @@ -129,14 +126,12 @@ void OpenCensusCallTracer::OpenCensusCallAttemptTracer::RecordReceivedMessage( namespace { void FilterTrailingMetadata(grpc_metadata_batch* b, uint64_t* elapsed_time) { - if (b->legacy_index()->named.grpc_server_stats_bin != nullptr) { + absl::optional grpc_server_stats_bin = + b->Take(grpc_core::GrpcServerStatsBinMetadata()); + if (grpc_server_stats_bin.has_value()) { ServerStatsDeserialize( - reinterpret_cast(GRPC_SLICE_START_PTR( - GRPC_MDVALUE(b->legacy_index()->named.grpc_server_stats_bin->md))), - GRPC_SLICE_LENGTH( - GRPC_MDVALUE(b->legacy_index()->named.grpc_server_stats_bin->md)), - elapsed_time); - b->Remove(b->legacy_index()->named.grpc_server_stats_bin); + reinterpret_cast(grpc_server_stats_bin->data()), + grpc_server_stats_bin->size(), elapsed_time); } } diff --git a/src/cpp/ext/filters/census/server_filter.cc b/src/cpp/ext/filters/census/server_filter.cc index 0a84680b9de..3d2a5c81219 100644 --- a/src/cpp/ext/filters/census/server_filter.cc +++ b/src/cpp/ext/filters/census/server_filter.cc @@ -39,8 +39,8 @@ namespace { // server metadata elements struct ServerMetadataElements { grpc_slice path; - grpc_slice tracing_slice; - grpc_slice census_proto; + grpc_core::Slice tracing_slice; + grpc_core::Slice census_proto; }; void FilterInitialMetadata(grpc_metadata_batch* b, @@ -49,15 +49,13 @@ void FilterInitialMetadata(grpc_metadata_batch* b, sml->path = grpc_slice_ref_internal( GRPC_MDVALUE(b->legacy_index()->named.path->md)); } - if (b->legacy_index()->named.grpc_trace_bin != nullptr) { - sml->tracing_slice = grpc_slice_ref_internal( - GRPC_MDVALUE(b->legacy_index()->named.grpc_trace_bin->md)); - b->Remove(GRPC_BATCH_GRPC_TRACE_BIN); + auto grpc_trace_bin = b->Take(grpc_core::GrpcTraceBinMetadata()); + if (grpc_trace_bin.has_value()) { + sml->tracing_slice = std::move(*grpc_trace_bin); } - if (b->legacy_index()->named.grpc_tags_bin != nullptr) { - sml->census_proto = grpc_slice_ref_internal( - GRPC_MDVALUE(b->legacy_index()->named.grpc_tags_bin->md)); - b->Remove(GRPC_BATCH_GRPC_TAGS_BIN); + auto grpc_tags_bin = b->Take(grpc_core::GrpcTagsBinMetadata()); + if (grpc_tags_bin.has_value()) { + sml->census_proto = std::move(*grpc_tags_bin); } } @@ -91,24 +89,12 @@ void CensusServerCallData::OnDoneRecvInitialMetadataCb( GPR_ASSERT(initial_metadata != nullptr); ServerMetadataElements sml; sml.path = grpc_empty_slice(); - sml.tracing_slice = grpc_empty_slice(); - sml.census_proto = grpc_empty_slice(); FilterInitialMetadata(initial_metadata, &sml); calld->path_ = grpc_slice_ref_internal(sml.path); calld->method_ = GetMethod(&calld->path_); calld->qualified_method_ = absl::StrCat("Recv.", calld->method_); - const char* tracing_str = - GRPC_SLICE_IS_EMPTY(sml.tracing_slice) - ? "" - : reinterpret_cast( - GRPC_SLICE_START_PTR(sml.tracing_slice)); - size_t tracing_str_len = GRPC_SLICE_IS_EMPTY(sml.tracing_slice) - ? 0 - : GRPC_SLICE_LENGTH(sml.tracing_slice); - GenerateServerContext(absl::string_view(tracing_str, tracing_str_len), + GenerateServerContext(sml.tracing_slice.as_string_view(), calld->qualified_method_, &calld->context_); - grpc_slice_unref_internal(sml.tracing_slice); - grpc_slice_unref_internal(sml.census_proto); grpc_slice_unref_internal(sml.path); grpc_census_call_set_context( calld->gc_, reinterpret_cast(&calld->context_)); @@ -142,14 +128,9 @@ void CensusServerCallData::StartTransportStreamOpBatch( size_t len = ServerStatsSerialize(absl::ToInt64Nanoseconds(elapsed_time_), stats_buf_, kMaxServerStatsLen); if (len > 0) { - GRPC_LOG_IF_ERROR( - "census grpc_filter", - grpc_metadata_batch_add_tail( - op->send_trailing_metadata()->batch(), &census_bin_, - grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_SERVER_STATS_BIN, - grpc_core::UnmanagedMemorySlice(stats_buf_, len)), - GRPC_BATCH_GRPC_SERVER_STATS_BIN)); + op->send_trailing_metadata()->batch()->Set( + grpc_core::GrpcServerStatsBinMetadata(), + grpc_core::Slice(grpc_core::UnmanagedMemorySlice(stats_buf_, len))); } } // Call next op. diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 4bd2952e404..b439665d6a2 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -617,6 +617,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/metadata.cc', 'src/core/lib/transport/metadata_batch.cc', + 'src/core/lib/transport/parsed_metadata.cc', 'src/core/lib/transport/pid_controller.cc', 'src/core/lib/transport/static_metadata.cc', 'src/core/lib/transport/status_conversion.cc', diff --git a/test/core/bad_client/tests/large_metadata.cc b/test/core/bad_client/tests/large_metadata.cc index 5b4561725a3..ebcf50e8ee9 100644 --- a/test/core/bad_client/tests/large_metadata.cc +++ b/test/core/bad_client/tests/large_metadata.cc @@ -69,6 +69,15 @@ ((sizeof(PFX_TOO_MUCH_METADATA_FROM_CLIENT_REQUEST) - 1) + \ (NUM_HEADERS * PFX_TOO_MUCH_METADATA_FROM_CLIENT_HEADER_SIZE) + 1) +static void verifier_fails(grpc_server* server, grpc_completion_queue* cq, + void* /*registered_method*/) { + while (grpc_core::Server::FromC(server)->HasOpenConnections()) { + GPR_ASSERT(grpc_completion_queue_next( + cq, grpc_timeout_milliseconds_to_deadline(20), nullptr) + .type == GRPC_QUEUE_TIMEOUT); + } +} + int main(int argc, char** argv) { int i; grpc_init(); @@ -92,7 +101,7 @@ int main(int argc, char** argv) { args[1].client_payload = client_payload; args[1].client_payload_length = sizeof(client_payload) - 1; - grpc_run_bad_client_test(server_verifier_request_call, args, 2, 0); + grpc_run_bad_client_test(verifier_fails, args, 2, 0); grpc_shutdown(); return 0; diff --git a/test/core/end2end/fuzzers/hpack.dictionary b/test/core/end2end/fuzzers/hpack.dictionary index a87c2188846..a86c2f5c72a 100644 --- a/test/core/end2end/fuzzers/hpack.dictionary +++ b/test/core/end2end/fuzzers/hpack.dictionary @@ -4,24 +4,16 @@ "\x07:status" "\x0A:authority" "\x07:scheme" -"\x0Cgrpc-message" "\x0Bgrpc-status" -"\x10grpc-payload-bin" "\x0Dgrpc-encoding" "\x14grpc-accept-encoding" -"\x15grpc-server-stats-bin" -"\x0Dgrpc-tags-bin" -"\x0Egrpc-trace-bin" "\x0Ccontent-type" "\x10content-encoding" "\x0Faccept-encoding" "\x1Egrpc-internal-encoding-request" -"\x04host" "\x1Agrpc-previous-rpc-attempts" "\x16grpc-retry-pushback-ms" -"\x1Bx-endpoint-load-metrics-bin" "\x0Cgrpc-timeout" -"\x0Auser-agent" "\x011" "\x012" "\x013" @@ -72,6 +64,7 @@ "\x06expect" "\x07expires" "\x04from" +"\x04host" "\x08if-match" "\x11if-modified-since" "\x0Dif-none-match" @@ -91,6 +84,7 @@ "\x0Aset-cookie" "\x19strict-transport-security" "\x11transfer-encoding" +"\x0Auser-agent" "\x04vary" "\x03via" "\x10www-authenticate" diff --git a/test/core/security/evaluate_args_test.cc b/test/core/security/evaluate_args_test.cc index a8df9b30030..b57d76d53f5 100644 --- a/test/core/security/evaluate_args_test.cc +++ b/test/core/security/evaluate_args_test.cc @@ -35,7 +35,6 @@ TEST_F(EvaluateArgsTest, EmptyMetadata) { EXPECT_EQ(args.GetPath(), nullptr); EXPECT_EQ(args.GetMethod(), nullptr); EXPECT_EQ(args.GetHost(), nullptr); - EXPECT_THAT(args.GetHeaders(), ::testing::ElementsAre()); EXPECT_EQ(args.GetHeaderValue("some_key", nullptr), absl::nullopt); } @@ -57,16 +56,6 @@ TEST_F(EvaluateArgsTest, GetMethodSuccess) { EXPECT_EQ(args.GetMethod(), "GET"); } -TEST_F(EvaluateArgsTest, GetHeadersSuccess) { - util_.AddPairToMetadata("host", "host123"); - util_.AddPairToMetadata(":path", "/expected/path"); - EvaluateArgs args = util_.MakeEvaluateArgs(); - EXPECT_THAT(args.GetHeaders(), - ::testing::UnorderedElementsAre( - ::testing::Pair("host", "host123"), - ::testing::Pair(":path", "/expected/path"))); -} - TEST_F(EvaluateArgsTest, GetHeaderValueSuccess) { util_.AddPairToMetadata("key123", "value123"); EvaluateArgs args = util_.MakeEvaluateArgs(); diff --git a/test/core/slice/percent_decode_fuzzer.cc b/test/core/slice/percent_decode_fuzzer.cc index 25d90a343e6..afaae3adf50 100644 --- a/test/core/slice/percent_decode_fuzzer.cc +++ b/test/core/slice/percent_decode_fuzzer.cc @@ -31,20 +31,8 @@ bool leak_check = true; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_init(); - grpc_slice input = grpc_slice_from_copied_buffer((const char*)data, size); - absl::optional output; - output = - grpc_core::PercentDecodeSlice(input, grpc_core::PercentEncodingType::URL); - if (output.has_value()) { - grpc_slice_unref(*output); - } - output = grpc_core::PercentDecodeSlice( - input, grpc_core::PercentEncodingType::Compatible); - if (output.has_value()) { - grpc_slice_unref(*output); - } - grpc_slice_unref(grpc_core::PermissivePercentDecodeSlice(input)); - grpc_slice_unref(input); + grpc_core::PermissivePercentDecodeSlice( + grpc_core::Slice::FromCopiedBuffer((const char*)data, size)); grpc_shutdown(); return 0; } diff --git a/test/core/slice/percent_encode_fuzzer.cc b/test/core/slice/percent_encode_fuzzer.cc index 782d1f97bdb..e145d1511bf 100644 --- a/test/core/slice/percent_encode_fuzzer.cc +++ b/test/core/slice/percent_encode_fuzzer.cc @@ -32,22 +32,13 @@ bool leak_check = true; static void test(const uint8_t* data, size_t size, grpc_core::PercentEncodingType type) { grpc_init(); - grpc_slice input = - grpc_slice_from_copied_buffer(reinterpret_cast(data), size); - grpc_slice output = grpc_core::PercentEncodeSlice(input, type); - absl::optional decoded_output = - grpc_core::PercentDecodeSlice(output, type); - // encoder must always produce decodable output - GPR_ASSERT(decoded_output.has_value()); - grpc_slice permissive_decoded_output = - grpc_core::PermissivePercentDecodeSlice(output); - // and decoded output must always match the input - GPR_ASSERT(grpc_slice_eq(input, *decoded_output)); - GPR_ASSERT(grpc_slice_eq(input, permissive_decoded_output)); - grpc_slice_unref(input); - grpc_slice_unref(output); - grpc_slice_unref(*decoded_output); - grpc_slice_unref(permissive_decoded_output); + auto input = grpc_core::Slice::FromCopiedBuffer( + reinterpret_cast(data), size); + auto output = grpc_core::PercentEncodeSlice(input.Ref(), type); + auto permissive_decoded_output = + grpc_core::PermissivePercentDecodeSlice(std::move(output)); + // decoded output must always match the input + GPR_ASSERT(input == permissive_decoded_output); grpc_shutdown(); } diff --git a/test/core/slice/percent_encoding_test.cc b/test/core/slice/percent_encoding_test.cc index d756637e44c..bdc877ae8df 100644 --- a/test/core/slice/percent_encoding_test.cc +++ b/test/core/slice/percent_encoding_test.cc @@ -29,10 +29,10 @@ #define TEST_VECTOR(raw, encoded, dict) \ test_vector(raw, sizeof(raw) - 1, encoded, sizeof(encoded) - 1, dict) -#define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded, dict) \ - test_nonconformant_vector(encoded, sizeof(encoded) - 1, \ - permissive_unencoded, \ - sizeof(permissive_unencoded) - 1, dict) +#define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded) \ + test_nonconformant_vector(encoded, sizeof(encoded) - 1, \ + permissive_unencoded, \ + sizeof(permissive_unencoded) - 1) static void test_vector(const char* raw, size_t raw_length, const char* encoded, size_t encoded_length, @@ -44,46 +44,32 @@ static void test_vector(const char* raw, size_t raw_length, const char* encoded, gpr_free(raw_msg); gpr_free(encoded_msg); - grpc_slice raw_slice = grpc_slice_from_copied_buffer(raw, raw_length); - grpc_slice encoded_slice = - grpc_slice_from_copied_buffer(encoded, encoded_length); - grpc_slice raw2encoded_slice = grpc_core::PercentEncodeSlice(raw_slice, type); - absl::optional encoded2raw_slice = - grpc_core::PercentDecodeSlice(encoded_slice, type); - GPR_ASSERT(encoded2raw_slice.has_value()); - grpc_slice encoded2raw_permissive_slice = - grpc_core::PermissivePercentDecodeSlice(encoded_slice); + auto raw_slice = grpc_core::Slice::FromCopiedBuffer(raw, raw_length); + auto encoded_slice = + grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length); + auto raw2encoded_slice = grpc_core::PercentEncodeSlice(raw_slice.Ref(), type); + auto encoded2raw_permissive_slice = + grpc_core::PermissivePercentDecodeSlice(encoded_slice.Ref()); - char* raw2encoded_msg = - grpc_dump_slice(raw2encoded_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); - char* encoded2raw_msg = - grpc_dump_slice(*encoded2raw_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); + char* raw2encoded_msg = grpc_dump_slice(raw2encoded_slice.c_slice(), + GPR_DUMP_HEX | GPR_DUMP_ASCII); char* encoded2raw_permissive_msg = grpc_dump_slice( - encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); + encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII); gpr_log(GPR_DEBUG, - "Result:\nraw2encoded = %s\nencoded2raw = %s\nencoded2raw_permissive " + "Result:\nraw2encoded = %s\nencoded2raw_permissive " "= %s", - raw2encoded_msg, encoded2raw_msg, encoded2raw_permissive_msg); + raw2encoded_msg, encoded2raw_permissive_msg); gpr_free(raw2encoded_msg); - gpr_free(encoded2raw_msg); gpr_free(encoded2raw_permissive_msg); - GPR_ASSERT(grpc_slice_eq(raw_slice, *encoded2raw_slice)); - GPR_ASSERT(grpc_slice_eq(raw_slice, encoded2raw_permissive_slice)); - GPR_ASSERT(grpc_slice_eq(encoded_slice, raw2encoded_slice)); - - grpc_slice_unref(*encoded2raw_slice); - grpc_slice_unref(encoded2raw_permissive_slice); - grpc_slice_unref(raw2encoded_slice); - grpc_slice_unref(raw_slice); - grpc_slice_unref(encoded_slice); + GPR_ASSERT(raw_slice == encoded2raw_permissive_slice); + GPR_ASSERT(encoded_slice == raw2encoded_slice); } static void test_nonconformant_vector(const char* encoded, size_t encoded_length, const char* permissive_unencoded, - size_t permissive_unencoded_length, - grpc_core::PercentEncodingType type) { + size_t permissive_unencoded_length) { char* permissive_unencoded_msg = gpr_dump(permissive_unencoded, permissive_unencoded_length, GPR_DUMP_HEX | GPR_DUMP_ASCII); @@ -94,28 +80,20 @@ static void test_nonconformant_vector(const char* encoded, gpr_free(permissive_unencoded_msg); gpr_free(encoded_msg); - grpc_slice permissive_unencoded_slice = grpc_slice_from_copied_buffer( + auto permissive_unencoded_slice = grpc_core::Slice::FromCopiedBuffer( permissive_unencoded, permissive_unencoded_length); - grpc_slice encoded_slice = - grpc_slice_from_copied_buffer(encoded, encoded_length); - absl::optional encoded2raw_slice = - grpc_core::PercentDecodeSlice(encoded_slice, type); - GPR_ASSERT(!encoded2raw_slice.has_value()); - grpc_slice encoded2raw_permissive_slice = - grpc_core::PermissivePercentDecodeSlice(encoded_slice); + auto encoded_slice = + grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length); + auto encoded2raw_permissive_slice = + grpc_core::PermissivePercentDecodeSlice(std::move(encoded_slice)); char* encoded2raw_permissive_msg = grpc_dump_slice( - encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); + encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII); gpr_log(GPR_DEBUG, "Result:\nencoded2raw_permissive = %s", encoded2raw_permissive_msg); gpr_free(encoded2raw_permissive_msg); - GPR_ASSERT( - grpc_slice_eq(permissive_unencoded_slice, encoded2raw_permissive_slice)); - - grpc_slice_unref(permissive_unencoded_slice); - grpc_slice_unref(encoded2raw_permissive_slice); - grpc_slice_unref(encoded_slice); + GPR_ASSERT(permissive_unencoded_slice == encoded2raw_permissive_slice); } int main(int argc, char** argv) { @@ -135,10 +113,10 @@ int main(int argc, char** argv) { TEST_VECTOR("\xff", "%FF", grpc_core::PercentEncodingType::URL); TEST_VECTOR("\xee", "%EE", grpc_core::PercentEncodingType::URL); TEST_VECTOR("%2", "%252", grpc_core::PercentEncodingType::URL); - TEST_NONCONFORMANT_VECTOR("%", "%", grpc_core::PercentEncodingType::URL); - TEST_NONCONFORMANT_VECTOR("%A", "%A", grpc_core::PercentEncodingType::URL); - TEST_NONCONFORMANT_VECTOR("%AG", "%AG", grpc_core::PercentEncodingType::URL); - TEST_NONCONFORMANT_VECTOR("\0", "\0", grpc_core::PercentEncodingType::URL); + TEST_NONCONFORMANT_VECTOR("%", "%"); + TEST_NONCONFORMANT_VECTOR("%A", "%A"); + TEST_NONCONFORMANT_VECTOR("%AG", "%AG"); + TEST_NONCONFORMANT_VECTOR("\0", "\0"); grpc_shutdown(); return 0; } diff --git a/test/core/util/evaluate_args_test_util.h b/test/core/util/evaluate_args_test_util.h index f7b0b5c2b2a..ab12dc5d043 100644 --- a/test/core/util/evaluate_args_test_util.h +++ b/test/core/util/evaluate_args_test_util.h @@ -33,14 +33,8 @@ class EvaluateArgsTestUtil { ~EvaluateArgsTestUtil() { delete channel_args_; } void AddPairToMetadata(const char* key, const char* value) { - metadata_storage_.emplace_back(); - auto& storage = metadata_storage_.back(); - ASSERT_EQ(grpc_metadata_batch_add_tail( - &metadata_, &storage, - grpc_mdelem_from_slices( - grpc_slice_intern(grpc_slice_from_static_string(key)), - grpc_slice_intern(grpc_slice_from_static_string(value)))), - GRPC_ERROR_NONE); + metadata_.Append( + key, Slice(grpc_slice_intern(grpc_slice_from_static_string(value)))); } void SetLocalEndpoint(absl::string_view local_uri) { @@ -63,7 +57,6 @@ class EvaluateArgsTestUtil { private: ScopedArenaPtr arena_ = MakeScopedArena(1024); - std::list metadata_storage_; grpc_metadata_batch metadata_{arena_.get()}; MockAuthorizationEndpoint endpoint_{/*local_uri=*/"", /*peer_uri=*/""}; grpc_auth_context auth_context_{nullptr}; diff --git a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc index 529f41eeb7c..96ecb6482da 100644 --- a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc +++ b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc @@ -303,24 +303,20 @@ class MoreRepresentativeClientInitialMetadata { GRPC_MDSTR_AUTHORITY, grpc_slice_intern(grpc_slice_from_static_string( "foo.test.google.fr:1234")))))); - GPR_ASSERT(GRPC_LOG_IF_ERROR( - "addmd", - b->Append(grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_TRACE_BIN, - grpc_slice_from_static_string("\x00\x01\x02\x03\x04\x05\x06\x07\x08" - "\x09\x0a\x0b\x0c\x0d\x0e\x0f" - "\x10\x11\x12\x13\x14\x15\x16\x17\x18" - "\x19\x1a\x1b\x1c\x1d\x1e\x1f" - "\x20\x21\x22\x23\x24\x25\x26\x27\x28" - "\x29\x2a\x2b\x2c\x2d\x2e\x2f" - "\x30"))))); - GPR_ASSERT(GRPC_LOG_IF_ERROR( - "addmd", - b->Append(grpc_mdelem_from_slices( - GRPC_MDSTR_GRPC_TAGS_BIN, - grpc_slice_from_static_string("\x00\x01\x02\x03\x04\x05\x06\x07\x08" - "\x09\x0a\x0b\x0c\x0d\x0e\x0f" - "\x10\x11\x12\x13"))))); + b->Set(grpc_core::GrpcTraceBinMetadata(), + grpc_core::Slice(grpc_core::StaticSlice::FromStaticString( + "\x00\x01\x02\x03\x04\x05\x06\x07\x08" + "\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18" + "\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x21\x22\x23\x24\x25\x26\x27\x28" + "\x29\x2a\x2b\x2c\x2d\x2e\x2f" + "\x30"))); + b->Set(grpc_core::GrpcTagsBinMetadata(), + grpc_core::Slice(grpc_core::StaticSlice::FromStaticString( + "\x00\x01\x02\x03\x04\x05\x06\x07\x08" + "\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13"))); GPR_ASSERT(GRPC_LOG_IF_ERROR( "addmd", b->Append( diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc index 9dec8a22bf4..8a52b81fe62 100644 --- a/test/cpp/util/grpc_tool_test.cc +++ b/test/cpp/util/grpc_tool_test.cc @@ -937,10 +937,11 @@ TEST_F(GrpcToolTest, CallCommandWithTimeoutDeadlineUpperBound) { std::bind(PrintStream, &output_stream, std::placeholders::_1))); + std::string output = output_stream.str(); + // Expected output: "message: "true"" // deadline not greater than timeout + current time - EXPECT_TRUE(nullptr != - strstr(output_stream.str().c_str(), "message: \"true\"")); + EXPECT_TRUE(nullptr != strstr(output.c_str(), "message: \"true\"")) << output; ShutdownServer(); } diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py index 71e69b70181..f89d9610f4b 100755 --- a/tools/codegen/core/gen_static_metadata.py +++ b/tools/codegen/core/gen_static_metadata.py @@ -35,28 +35,20 @@ import perfection CONFIG = [ # metadata strings - 'host', - 'grpc-timeout', 'grpc-internal-encoding-request', - 'grpc-payload-bin', ':path', 'grpc-encoding', 'grpc-accept-encoding', - 'user-agent', ':authority', - 'grpc-message', 'grpc-status', - 'grpc-server-stats-bin', - 'grpc-tags-bin', - 'grpc-trace-bin', 'grpc-previous-rpc-attempts', 'grpc-retry-pushback-ms', + 'grpc-timeout', '1', '2', '3', '4', '', - 'x-endpoint-load-metrics-bin', # well known method names '/grpc.lb.v1.LoadBalancer/BalanceLoad', '/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats', @@ -158,22 +150,15 @@ METADATA_BATCH_CALLOUTS = [ ':status', ':authority', ':scheme', - 'grpc-message', 'grpc-status', - 'grpc-payload-bin', 'grpc-encoding', 'grpc-accept-encoding', - 'grpc-server-stats-bin', - 'grpc-tags-bin', - 'grpc-trace-bin', 'content-type', 'content-encoding', 'accept-encoding', 'grpc-internal-encoding-request', - 'host', 'grpc-previous-rpc-attempts', 'grpc-retry-pushback-ms', - 'x-endpoint-load-metrics-bin', ] COMPRESSION_ALGORITHMS = [ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 6234711106e..5e20ff4a1a9 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2240,6 +2240,7 @@ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata.h \ src/core/lib/transport/metadata_batch.cc \ src/core/lib/transport/metadata_batch.h \ +src/core/lib/transport/parsed_metadata.cc \ src/core/lib/transport/parsed_metadata.h \ src/core/lib/transport/pid_controller.cc \ src/core/lib/transport/pid_controller.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index b9549a8ac30..31012bdbd1a 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -2041,6 +2041,7 @@ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata.h \ src/core/lib/transport/metadata_batch.cc \ src/core/lib/transport/metadata_batch.h \ +src/core/lib/transport/parsed_metadata.cc \ src/core/lib/transport/parsed_metadata.h \ src/core/lib/transport/pid_controller.cc \ src/core/lib/transport/pid_controller.h \