diff options
author | Craig Tiller <ctiller@google.com> | 2016-02-03 16:02:49 -0800 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2016-02-03 16:02:49 -0800 |
commit | a44cbfc11c7d018785ef5699b900453090df07e3 (patch) | |
tree | c8eb84e843f112bc5da0db0e9381d56e0c2cb0a6 /src/core/census | |
parent | 4253522c76fd7694a621dc62a7092ffa6e802e15 (diff) |
Fix race condition in transport API
Specifically:
Receiving trailing and initial metadata had to be published in
lock-step.
=> If we wanted trailing metadata, we might not get initial metadata processed
until messages arrived.
=> Compression code had no idea what codec to use.
To fix it, publish initial metadata as soon as it's ready (this is a
transport API change).
Requires changes to grpc_call to ensure ordering in processing initial
metadata and messages (one may be delayed).
Exposed at least some bugs in C++ where we never read initial metadata.
I expect at least one more similar bug.
Diffstat (limited to 'src/core/census')
-rw-r--r-- | src/core/census/grpc_filter.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/core/census/grpc_filter.c b/src/core/census/grpc_filter.c index a8db32b9d5..c8aaf31e2d 100644 --- a/src/core/census/grpc_filter.c +++ b/src/core/census/grpc_filter.c @@ -107,8 +107,8 @@ static void server_mutate_op(grpc_call_element *elem, if (op->recv_initial_metadata) { /* substitute our callback for the op callback */ calld->recv_initial_metadata = op->recv_initial_metadata; - calld->on_done_recv = op->on_complete; - op->on_complete = &calld->finish_recv; + calld->on_done_recv = op->recv_initial_metadata_ready; + op->recv_initial_metadata_ready = &calld->finish_recv; } } |