From 759f59a18354beefa75ffa1f31172121bbf255f2 Mon Sep 17 00:00:00 2001 From: yang-g Date: Fri, 2 Oct 2015 10:38:22 -0700 Subject: [PATCH 1/3] handle closed transport at the end of a read --- src/core/transport/chttp2_transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c index 0202d53abdb..58d5bdc7850 100644 --- a/src/core/transport/chttp2_transport.c +++ b/src/core/transport/chttp2_transport.c @@ -1136,7 +1136,7 @@ static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, int success) { grpc_chttp2_publish_reads(exec_ctx, &t->global, &t->parsing); t->parsing_active = 0; } - if (!success || i != t->read_buffer.count) { + if (!success || i != t->read_buffer.count || t->closed) { drop_connection(exec_ctx, t); read_error_locked(exec_ctx, t); } else if (!t->closed) { From 2c1c00055b11bf9d54998ec2ac98e2464e4b07bd Mon Sep 17 00:00:00 2001 From: yang-g Date: Fri, 2 Oct 2015 16:15:05 -0700 Subject: [PATCH 2/3] Pollset can be destroyed again in pollset_work if the called_shutdown is not set here --- src/core/iomgr/pollset_posix.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 82a82cc0644..418502d1c6d 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -354,6 +354,7 @@ static void basic_do_promote(grpc_exec_ctx *exec_ctx, void *args, int success) { if (pollset->shutting_down) { /* We don't care about this pollset anymore. */ if (pollset->in_flight_cbs == 0 && !pollset->called_shutdown) { + pollset->called_shutdown = 1; finish_shutdown(exec_ctx, pollset); } } else if (grpc_fd_is_orphaned(fd)) { From c04610357ca9c7bfc993849a150c40872a13f50a Mon Sep 17 00:00:00 2001 From: yang-g Date: Fri, 2 Oct 2015 16:22:43 -0700 Subject: [PATCH 3/3] The Writes may return false after the server cancels the stream --- test/cpp/end2end/end2end_test.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index 0322b2dabef..4ba1ee0c056 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -683,10 +683,14 @@ TEST_P(End2endTest, RequestStreamServerEarlyCancelTest) { auto stream = stub_->RequestStream(&context, &response); request.set_message("hello"); int send_messages = 20; - while (send_messages > 0) { + while (send_messages > 10) { EXPECT_TRUE(stream->Write(request)); send_messages--; } + while (send_messages > 0) { + stream->Write(request); + send_messages--; + } stream->WritesDone(); Status s = stream->Finish(); EXPECT_EQ(s.error_code(), StatusCode::CANCELLED);