Merge pull request #17197 from vjpai/ctx_clear
Properly clear metadata and other structs when reusing ServerContext in callback API
This commit is contained in:
commit
637e4ea9fb
|
|
@ -32,11 +32,9 @@ const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin";
|
|||
|
||||
class MetadataMap {
|
||||
public:
|
||||
MetadataMap() { memset(&arr_, 0, sizeof(arr_)); }
|
||||
MetadataMap() { Setup(); }
|
||||
|
||||
~MetadataMap() {
|
||||
g_core_codegen_interface->grpc_metadata_array_destroy(&arr_);
|
||||
}
|
||||
~MetadataMap() { Destroy(); }
|
||||
|
||||
grpc::string GetBinaryErrorDetails() {
|
||||
// if filled_, extract from the multimap for O(log(n))
|
||||
|
|
@ -71,11 +69,24 @@ class MetadataMap {
|
|||
}
|
||||
grpc_metadata_array* arr() { return &arr_; }
|
||||
|
||||
void Reset() {
|
||||
filled_ = false;
|
||||
map_.clear();
|
||||
Destroy();
|
||||
Setup();
|
||||
}
|
||||
|
||||
private:
|
||||
bool filled_ = false;
|
||||
grpc_metadata_array arr_;
|
||||
std::multimap<grpc::string_ref, grpc::string_ref> map_;
|
||||
|
||||
void Destroy() {
|
||||
g_core_codegen_interface->grpc_metadata_array_destroy(&arr_);
|
||||
}
|
||||
|
||||
void Setup() { memset(&arr_, 0, sizeof(arr_)); }
|
||||
|
||||
void FillMap() {
|
||||
if (filled_) return;
|
||||
filled_ = true;
|
||||
|
|
|
|||
|
|
@ -247,6 +247,10 @@ void ServerContext::BindDeadlineAndMetadata(gpr_timespec deadline,
|
|||
ServerContext::~ServerContext() { Clear(); }
|
||||
|
||||
void ServerContext::Clear() {
|
||||
auth_context_.reset();
|
||||
initial_metadata_.clear();
|
||||
trailing_metadata_.clear();
|
||||
client_metadata_.Reset();
|
||||
if (call_) {
|
||||
grpc_call_unref(call_);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "test/core/util/test_config.h"
|
||||
#include "test/cpp/end2end/test_service_impl.h"
|
||||
#include "test/cpp/util/byte_buffer_proto_helper.h"
|
||||
#include "test/cpp/util/string_ref_helper.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
|
@ -100,11 +101,13 @@ class ClientCallbackEnd2endTest
|
|||
|
||||
test_string += "Hello world. ";
|
||||
request.set_message(test_string);
|
||||
|
||||
grpc::string val;
|
||||
if (with_binary_metadata) {
|
||||
request.mutable_param()->set_echo_metadata(true);
|
||||
char bytes[8] = {'\0', '\1', '\2', '\3',
|
||||
'\4', '\5', '\6', static_cast<char>(i)};
|
||||
cli_ctx.AddMetadata("custom-bin", grpc::string(bytes, 8));
|
||||
val = grpc::string(bytes, 8);
|
||||
cli_ctx.AddMetadata("custom-bin", val);
|
||||
}
|
||||
|
||||
cli_ctx.set_compression_algorithm(GRPC_COMPRESS_GZIP);
|
||||
|
|
@ -114,10 +117,18 @@ class ClientCallbackEnd2endTest
|
|||
bool done = false;
|
||||
stub_->experimental_async()->Echo(
|
||||
&cli_ctx, &request, &response,
|
||||
[&request, &response, &done, &mu, &cv](Status s) {
|
||||
[&cli_ctx, &request, &response, &done, &mu, &cv, val,
|
||||
with_binary_metadata](Status s) {
|
||||
GPR_ASSERT(s.ok());
|
||||
|
||||
EXPECT_EQ(request.message(), response.message());
|
||||
if (with_binary_metadata) {
|
||||
EXPECT_EQ(
|
||||
1u, cli_ctx.GetServerTrailingMetadata().count("custom-bin"));
|
||||
EXPECT_EQ(val, ToString(cli_ctx.GetServerTrailingMetadata()
|
||||
.find("custom-bin")
|
||||
->second));
|
||||
}
|
||||
std::lock_guard<std::mutex> l(mu);
|
||||
done = true;
|
||||
cv.notify_one();
|
||||
|
|
|
|||
Loading…
Reference in New Issue