Skip to content
Snippets Groups Projects
Commit c6276645 authored by Craig Tiller's avatar Craig Tiller
Browse files

Merge github.com:grpc/grpc into call_arena

parents 2ccd502e 597f51c0
Branches
Tags
No related merge requests found
...@@ -13,7 +13,7 @@ settings: ...@@ -13,7 +13,7 @@ settings:
'#09': Per-language overrides are possible with (eg) ruby_version tag here '#09': Per-language overrides are possible with (eg) ruby_version tag here
'#10': See the expand_version.py for all the quirks here '#10': See the expand_version.py for all the quirks here
core_version: 3.0.0-dev core_version: 3.0.0-dev
g_stands_for: green g_stands_for: gentle
version: 1.3.0-dev version: 1.3.0-dev
filegroups: filegroups:
- name: census - name: census
......
...@@ -7,3 +7,4 @@ future), and the corresponding version numbers that used them: ...@@ -7,3 +7,4 @@ future), and the corresponding version numbers that used them:
- 1.0 'g' stands for 'gRPC' - 1.0 'g' stands for 'gRPC'
- 1.1 'g' stands for 'good' - 1.1 'g' stands for 'good'
- 1.2 'g' stands for 'green' - 1.2 'g' stands for 'green'
- 1.3 'g' stands for 'gentle'
...@@ -273,7 +273,7 @@ static void maybe_flush_read(stream_obj *s) { ...@@ -273,7 +273,7 @@ static void maybe_flush_read(stream_obj *s) {
/* Whenever the evaluation of any of the two condition is changed, we check /* Whenever the evaluation of any of the two condition is changed, we check
* whether we should enter the flush read state. */ * whether we should enter the flush read state. */
if (s->state.pending_recv_trailing_metadata && s->state.fail_state) { if (s->state.pending_recv_trailing_metadata && s->state.fail_state) {
if (!s->state.flush_read) { if (!s->state.flush_read && !s->state.rs.read_stream_closed) {
CRONET_LOG(GPR_DEBUG, "%p: Flush read", s); CRONET_LOG(GPR_DEBUG, "%p: Flush read", s);
s->state.flush_read = true; s->state.flush_read = true;
null_and_maybe_free_read_buffer(s); null_and_maybe_free_read_buffer(s);
......
...@@ -38,4 +38,4 @@ ...@@ -38,4 +38,4 @@
const char *grpc_version_string(void) { return "3.0.0-dev"; } const char *grpc_version_string(void) { return "3.0.0-dev"; }
const char *grpc_g_stands_for(void) { return "green"; } const char *grpc_g_stands_for(void) { return "gentle"; }
...@@ -54,28 +54,50 @@ auto& force_library_initialization = Library::get(); ...@@ -54,28 +54,50 @@ auto& force_library_initialization = Library::get();
static void* tag(intptr_t x) { return reinterpret_cast<void*>(x); } static void* tag(intptr_t x) { return reinterpret_cast<void*>(x); }
template <class Fixture> // Repeatedly makes Streaming Bidi calls (exchanging a configurable number of
static void BM_PumpStreamClientToServer(benchmark::State& state) { // messages in each call) in a loop on a single channel
//
// First parmeter (i.e state.range(0)): Message size (in bytes) to use
// Second parameter (i.e state.range(1)): Number of ping pong messages.
// Note: One ping-pong means two messages (one from client to server and
// the other from server to client):
template <class Fixture, class ClientContextMutator, class ServerContextMutator>
static void BM_StreamingPingPong(benchmark::State& state) {
TrackCounters track_counters;
const int msg_size = state.range(0);
const int max_ping_pongs = state.range(1);
EchoTestService::AsyncService service; EchoTestService::AsyncService service;
std::unique_ptr<Fixture> fixture(new Fixture(&service)); std::unique_ptr<Fixture> fixture(new Fixture(&service));
{ {
EchoResponse send_response;
EchoResponse recv_response;
EchoRequest send_request; EchoRequest send_request;
EchoRequest recv_request; EchoRequest recv_request;
if (state.range(0) > 0) {
send_request.set_message(std::string(state.range(0), 'a')); if (msg_size > 0) {
send_request.set_message(std::string(msg_size, 'a'));
send_response.set_message(std::string(msg_size, 'b'));
} }
Status recv_status;
std::unique_ptr<EchoTestService::Stub> stub(
EchoTestService::NewStub(fixture->channel()));
while (state.KeepRunning()) {
ServerContext svr_ctx; ServerContext svr_ctx;
ServerContextMutator svr_ctx_mut(&svr_ctx);
ServerAsyncReaderWriter<EchoResponse, EchoRequest> response_rw(&svr_ctx); ServerAsyncReaderWriter<EchoResponse, EchoRequest> response_rw(&svr_ctx);
service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(), service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(),
fixture->cq(), tag(0)); fixture->cq(), tag(0));
std::unique_ptr<EchoTestService::Stub> stub(
EchoTestService::NewStub(fixture->channel()));
ClientContext cli_ctx; ClientContext cli_ctx;
ClientContextMutator cli_ctx_mut(&cli_ctx);
auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1)); auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1));
int need_tags = (1 << 0) | (1 << 1);
// Establish async stream between client side and server side
void* t; void* t;
bool ok; bool ok;
int need_tags = (1 << 0) | (1 << 1);
while (need_tags) { while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
GPR_ASSERT(ok); GPR_ASSERT(ok);
...@@ -83,57 +105,93 @@ static void BM_PumpStreamClientToServer(benchmark::State& state) { ...@@ -83,57 +105,93 @@ static void BM_PumpStreamClientToServer(benchmark::State& state) {
GPR_ASSERT(need_tags & (1 << i)); GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i); need_tags &= ~(1 << i);
} }
response_rw.Read(&recv_request, tag(0));
while (state.KeepRunning()) { // Send 'max_ping_pongs' number of ping pong messages
GPR_TIMER_SCOPE("BenchmarkCycle", 0); int ping_pong_cnt = 0;
request_rw->Write(send_request, tag(1)); while (ping_pong_cnt < max_ping_pongs) {
while (true) { request_rw->Write(send_request, tag(0)); // Start client send
response_rw.Read(&recv_request, tag(1)); // Start server recv
request_rw->Read(&recv_response, tag(2)); // Start client recv
need_tags = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
if (t == tag(0)) { GPR_ASSERT(ok);
response_rw.Read(&recv_request, tag(0)); int i = (int)(intptr_t)t;
} else if (t == tag(1)) {
break; // If server recv is complete, start the server send operation
} else { if (i == 1) {
GPR_ASSERT(false); response_rw.Write(send_response, tag(3));
} }
GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i);
} }
ping_pong_cnt++;
} }
request_rw->WritesDone(tag(1));
need_tags = (1 << 0) | (1 << 1); request_rw->WritesDone(tag(0));
response_rw.Finish(Status::OK, tag(1));
Status recv_status;
request_rw->Finish(&recv_status, tag(2));
need_tags = (1 << 0) | (1 << 1) | (1 << 2);
while (need_tags) { while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
int i = (int)(intptr_t)t; int i = (int)(intptr_t)t;
GPR_ASSERT(need_tags & (1 << i)); GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i); need_tags &= ~(1 << i);
} }
GPR_ASSERT(recv_status.ok());
}
} }
fixture->Finish(state); fixture->Finish(state);
fixture.reset(); fixture.reset();
state.SetBytesProcessed(state.range(0) * state.iterations()); state.SetBytesProcessed(msg_size * state.iterations() * max_ping_pongs * 2);
track_counters.Finish(state);
} }
template <class Fixture> // Repeatedly sends ping pong messages in a single streaming Bidi call in a loop
static void BM_PumpStreamServerToClient(benchmark::State& state) { // First parmeter (i.e state.range(0)): Message size (in bytes) to use
template <class Fixture, class ClientContextMutator, class ServerContextMutator>
static void BM_StreamingPingPongMsgs(benchmark::State& state) {
TrackCounters track_counters;
const int msg_size = state.range(0);
EchoTestService::AsyncService service; EchoTestService::AsyncService service;
std::unique_ptr<Fixture> fixture(new Fixture(&service)); std::unique_ptr<Fixture> fixture(new Fixture(&service));
{ {
EchoResponse send_response; EchoResponse send_response;
EchoResponse recv_response; EchoResponse recv_response;
if (state.range(0) > 0) { EchoRequest send_request;
send_response.set_message(std::string(state.range(0), 'a')); EchoRequest recv_request;
if (msg_size > 0) {
send_request.set_message(std::string(msg_size, 'a'));
send_response.set_message(std::string(msg_size, 'b'));
} }
Status recv_status;
std::unique_ptr<EchoTestService::Stub> stub(
EchoTestService::NewStub(fixture->channel()));
ServerContext svr_ctx; ServerContext svr_ctx;
ServerContextMutator svr_ctx_mut(&svr_ctx);
ServerAsyncReaderWriter<EchoResponse, EchoRequest> response_rw(&svr_ctx); ServerAsyncReaderWriter<EchoResponse, EchoRequest> response_rw(&svr_ctx);
service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(), service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(),
fixture->cq(), tag(0)); fixture->cq(), tag(0));
std::unique_ptr<EchoTestService::Stub> stub(
EchoTestService::NewStub(fixture->channel()));
ClientContext cli_ctx; ClientContext cli_ctx;
ClientContextMutator cli_ctx_mut(&cli_ctx);
auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1)); auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1));
int need_tags = (1 << 0) | (1 << 1);
// Establish async stream between client side and server side
void* t; void* t;
bool ok; bool ok;
int need_tags = (1 << 0) | (1 << 1);
while (need_tags) { while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
GPR_ASSERT(ok); GPR_ASSERT(ok);
...@@ -141,54 +199,79 @@ static void BM_PumpStreamServerToClient(benchmark::State& state) { ...@@ -141,54 +199,79 @@ static void BM_PumpStreamServerToClient(benchmark::State& state) {
GPR_ASSERT(need_tags & (1 << i)); GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i); need_tags &= ~(1 << i);
} }
request_rw->Read(&recv_response, tag(0));
while (state.KeepRunning()) { while (state.KeepRunning()) {
GPR_TIMER_SCOPE("BenchmarkCycle", 0); GPR_TIMER_SCOPE("BenchmarkCycle", 0);
response_rw.Write(send_response, tag(1)); request_rw->Write(send_request, tag(0)); // Start client send
while (true) { response_rw.Read(&recv_request, tag(1)); // Start server recv
request_rw->Read(&recv_response, tag(2)); // Start client recv
need_tags = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3);
while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
if (t == tag(0)) { GPR_ASSERT(ok);
request_rw->Read(&recv_response, tag(0)); int i = (int)(intptr_t)t;
} else if (t == tag(1)) {
break; // If server recv is complete, start the server send operation
} else { if (i == 1) {
GPR_ASSERT(false); response_rw.Write(send_response, tag(3));
} }
GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i);
} }
} }
request_rw->WritesDone(tag(0));
response_rw.Finish(Status::OK, tag(1)); response_rw.Finish(Status::OK, tag(1));
need_tags = (1 << 0) | (1 << 1); Status recv_status;
request_rw->Finish(&recv_status, tag(2));
need_tags = (1 << 0) | (1 << 1) | (1 << 2);
while (need_tags) { while (need_tags) {
GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(fixture->cq()->Next(&t, &ok));
int i = (int)(intptr_t)t; int i = (int)(intptr_t)t;
GPR_ASSERT(need_tags & (1 << i)); GPR_ASSERT(need_tags & (1 << i));
need_tags &= ~(1 << i); need_tags &= ~(1 << i);
} }
GPR_ASSERT(recv_status.ok());
} }
fixture->Finish(state); fixture->Finish(state);
fixture.reset(); fixture.reset();
state.SetBytesProcessed(state.range(0) * state.iterations()); state.SetBytesProcessed(msg_size * state.iterations() * 2);
track_counters.Finish(state);
} }
/******************************************************************************* /*******************************************************************************
* CONFIGURATIONS * CONFIGURATIONS
*/ */
BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, TCP) // Generate Args for StreamingPingPong benchmarks. Currently generates args for
->Range(0, 128 * 1024 * 1024); // only "small streams" (i.e streams with 0, 1 or 2 messages)
BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, UDS) static void StreamingPingPongArgs(benchmark::internal::Benchmark* b) {
->Range(0, 128 * 1024 * 1024); int msg_size = 0;
BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, SockPair)
->Range(0, 128 * 1024 * 1024); b->Args({0, 0}); // spl case: 0 ping-pong msgs (msg_size doesn't matter here)
BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, InProcessCHTTP2)
->Range(0, 128 * 1024 * 1024); for (msg_size = 0; msg_size <= 128 * 1024 * 1024;
BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, TCP) msg_size == 0 ? msg_size++ : msg_size *= 8) {
->Range(0, 128 * 1024 * 1024); b->Args({msg_size, 1});
BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, UDS) b->Args({msg_size, 2});
->Range(0, 128 * 1024 * 1024); }
BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, SockPair) }
BENCHMARK_TEMPLATE(BM_StreamingPingPong, InProcessCHTTP2, NoOpMutator,
NoOpMutator)
->Apply(StreamingPingPongArgs);
BENCHMARK_TEMPLATE(BM_StreamingPingPong, TCP, NoOpMutator, NoOpMutator)
->Apply(StreamingPingPongArgs);
BENCHMARK_TEMPLATE(BM_StreamingPingPongMsgs, InProcessCHTTP2, NoOpMutator,
NoOpMutator)
->Range(0, 128 * 1024 * 1024); ->Range(0, 128 * 1024 * 1024);
BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, InProcessCHTTP2) BENCHMARK_TEMPLATE(BM_StreamingPingPongMsgs, TCP, NoOpMutator, NoOpMutator)
->Range(0, 128 * 1024 * 1024); ->Range(0, 128 * 1024 * 1024);
} // namespace testing } // namespace testing
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment