aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/filters/client_channel
diff options
context:
space:
mode:
authorGravatar Soheil Hassas Yeganeh <soheil@google.com>2018-11-13 13:02:18 -0500
committerGravatar GitHub <noreply@github.com>2018-11-13 13:02:18 -0500
commitfda941a60c1bf6b8c6d9abb238fc653e070b56fb (patch)
treede5ad8abb238d98b7d282b220a63f3902b67e4aa /src/core/ext/filters/client_channel
parent1a4286df98e44d69aac07fa6dc93f49efed3311d (diff)
parent1f6d3189a9386cae59cb89f8e2eba9604a9c637e (diff)
Merge pull request #17202 from soheilhy/worktree-clientchannel-tsan
Fix data race in client_channel.
Diffstat (limited to 'src/core/ext/filters/client_channel')
-rw-r--r--src/core/ext/filters/client_channel/client_channel.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc
index d42961fc60..8e9ee889e1 100644
--- a/src/core/ext/filters/client_channel/client_channel.cc
+++ b/src/core/ext/filters/client_channel/client_channel.cc
@@ -1023,13 +1023,17 @@ struct subchannel_call_retry_state {
bool completed_recv_initial_metadata : 1;
bool started_recv_trailing_metadata : 1;
bool completed_recv_trailing_metadata : 1;
- // State for callback processing.
- bool retry_dispatched : 1;
subchannel_batch_data* recv_initial_metadata_ready_deferred_batch = nullptr;
grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
subchannel_batch_data* recv_message_ready_deferred_batch = nullptr;
grpc_error* recv_message_error = GRPC_ERROR_NONE;
subchannel_batch_data* recv_trailing_metadata_internal_batch = nullptr;
+ // State for callback processing.
+ // NOTE: Do not move this next to the metadata bitfields above. That would
+ // save space but will also result in a data race because compiler will
+ // generate a 2 byte store which overwrites the meta-data fields upon
+ // setting this field.
+ bool retry_dispatched : 1;
};
// Pending batches stored in call data.