diff options
author | Hope Casey-Allen <hcaseyal@google.com> | 2018-09-08 17:48:42 -0700 |
---|---|---|
committer | Hope Casey-Allen <hcaseyal@google.com> | 2018-09-08 17:48:42 -0700 |
commit | 97cbec1c98b8660e6fd7ba2c1a2d23dff8e9030d (patch) | |
tree | 8c6a9946a9e12ab2dc529cfdb32329a510f82534 | |
parent | 4181c8cd37d95421a7521b5d7ce382966c13c0c6 (diff) |
WIP. Setting md_index to 0 on grpc_linked_mdelem creation
-rw-r--r-- | src/core/lib/surface/call.cc | 1 | ||||
-rw-r--r-- | src/core/lib/transport/metadata_batch.cc | 24 | ||||
-rw-r--r-- | test/core/transport/chttp2/hpack_encoder_test.cc | 2 |
3 files changed, 19 insertions, 8 deletions
diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index def99f5a22..a72a3ce57c 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -374,6 +374,7 @@ grpc_error* grpc_call_create(const grpc_call_create_args* args, MAX_SEND_EXTRA_METADATA_COUNT); for (i = 0; i < args->add_initial_metadata_count; i++) { call->send_extra_metadata[i].md = args->add_initial_metadata[i]; + call->send_extra_metadata[i].md_index = 0; if (grpc_slice_eq(GRPC_MDKEY(args->add_initial_metadata[i]), GRPC_MDSTR_PATH)) { path = grpc_slice_ref_internal( diff --git a/src/core/lib/transport/metadata_batch.cc b/src/core/lib/transport/metadata_batch.cc index 788681f006..2e19071fb2 100644 --- a/src/core/lib/transport/metadata_batch.cc +++ b/src/core/lib/transport/metadata_batch.cc @@ -264,6 +264,7 @@ grpc_error* grpc_metadata_batch_add_head(grpc_metadata_batch* batch, grpc_linked_mdelem* storage, grpc_mdelem elem_to_add) { GPR_ASSERT(!GRPC_MDISNULL(elem_to_add)); + storage->md_index = 0; storage->md = elem_to_add; return grpc_metadata_batch_link_head(batch, storage); } @@ -310,6 +311,7 @@ grpc_error* grpc_metadata_batch_add_tail(grpc_metadata_batch* batch, grpc_mdelem elem_to_add) { GPR_ASSERT(!GRPC_MDISNULL(elem_to_add)); storage->md = elem_to_add; + storage->md_index = 0; return grpc_metadata_batch_link_tail(batch, storage); } @@ -459,12 +461,15 @@ grpc_error* grpc_metadata_batch_filter(grpc_metadata_batch* batch, grpc_error* error = GRPC_ERROR_NONE; while (l) { grpc_linked_mdelem* next = l->next; - grpc_filtered_mdelem new_mdelem = func(user_data, l->md); - add_error(&error, new_mdelem.error, composite_error_string); - if (GRPC_MDISNULL(new_mdelem.md)) { - grpc_metadata_batch_remove(batch, l); - } else if (new_mdelem.md.payload != l->md.payload) { - grpc_metadata_batch_substitute(batch, l, new_mdelem.md); + //TODO(hcaseyal): provide a mechanism to filter mdelems with indices + if (!is_mdelem_index_used(l->md_index)) { + grpc_filtered_mdelem new_mdelem = func(user_data, l->md); + add_error(&error, new_mdelem.error, composite_error_string); + if (GRPC_MDISNULL(new_mdelem.md)) { + grpc_metadata_batch_remove(batch, l); + } else if (new_mdelem.md.payload != l->md.payload) { + grpc_metadata_batch_substitute(batch, l, new_mdelem.md); + } } l = next; } @@ -479,8 +484,13 @@ void grpc_metadata_batch_copy(grpc_metadata_batch* src, size_t i = 0; for (grpc_linked_mdelem* elem = src->list.head; elem != nullptr; elem = elem->next) { - grpc_error* error = grpc_metadata_batch_add_tail(dst, &storage[i++], + grpc_error* error = nullptr; + if (is_mdelem_index_used(elem->md_index)) { + error = grpc_metadata_batch_add_tail_index(dst, &storage[i++], elem->md_index); + } else { + error = grpc_metadata_batch_add_tail(dst, &storage[i++], GRPC_MDELEM_REF(elem->md)); + } // The only way that grpc_metadata_batch_add_tail() can fail is if // there's a duplicate entry for a callout. However, that can't be // the case here, because we would not have been allowed to create diff --git a/test/core/transport/chttp2/hpack_encoder_test.cc b/test/core/transport/chttp2/hpack_encoder_test.cc index 39a7973da9..ab59ee9c5b 100644 --- a/test/core/transport/chttp2/hpack_encoder_test.cc +++ b/test/core/transport/chttp2/hpack_encoder_test.cc @@ -205,7 +205,7 @@ static void verify_table_size_change_match_elem_size(const char* key, size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem, use_true_binary); size_t initial_table_size = g_compressor.table_size; grpc_linked_mdelem* e = - static_cast<grpc_linked_mdelem*>(gpr_malloc(sizeof(*e))); + static_cast<grpc_linked_mdelem*>(gpr_zalloc(sizeof(*e))); grpc_metadata_batch b; grpc_metadata_batch_init(&b); e[0].md = elem; |