Skip to content
Snippets Groups Projects
Commit fd7199f6 authored by Yang Gao's avatar Yang Gao
Browse files

Add client side WaitForInitialMetadata for streaming.

parent 1fe817ff
No related branches found
No related tags found
No related merge requests found
......@@ -134,7 +134,16 @@ class Call final {
grpc_call *call() { return call_; }
CompletionQueue *cq() { return cq_; }
// TODO(yangg) change it to a general state query function.
bool initial_metadata_received() {
return initial_metadata_received_;
}
void set_initial_metadata_received() {
initial_metadata_received_ = true;
}
private:
bool initial_metadata_received_ = false;
CallHook *call_hook_;
CompletionQueue *cq_;
grpc_call* call_;
......
......@@ -98,7 +98,22 @@ class ClientReader final : public ClientStreamingInterface,
cq_.Pluck(&buf);
}
// Blocking wait for initial metadata from server. The received metadata
// can only be accessed after this call returns. Calling this method is
// optional as it will be called internally before the first Read.
void WaitForInitialMetadata() {
if (!call_.initial_metadata_received()) {
CallOpBuffer buf;
buf.AddRecvInitialMetadata(&context_->recv_initial_metadata_);
call_.PerformOps(&buf);
GPR_ASSERT(cq_.Pluck(&buf));
call_.set_initial_metadata_received();
}
}
virtual bool Read(R *msg) override {
WaitForInitialMetadata();
CallOpBuffer buf;
bool got_message;
buf.AddRecvMessage(msg, &got_message);
......@@ -186,7 +201,21 @@ class ClientReaderWriter final : public ClientStreamingInterface,
GPR_ASSERT(cq_.Pluck(&buf));
}
// Blocking wait for initial metadata from server. The received metadata
// can only be accessed after this call returns. Calling this method is
// optional as it will be called internally before the first Read.
void WaitForInitialMetadata() {
if (!call_.initial_metadata_received()) {
CallOpBuffer buf;
buf.AddRecvInitialMetadata(&context_->recv_initial_metadata_);
call_.PerformOps(&buf);
GPR_ASSERT(cq_.Pluck(&buf));
call_.set_initial_metadata_received();
}
}
virtual bool Read(R *msg) override {
WaitForInitialMetadata();
CallOpBuffer buf;
bool got_message;
buf.AddRecvMessage(msg, &got_message);
......
......@@ -121,6 +121,12 @@ void CallOpBuffer::AddSendInitialMetadata(
initial_metadata_ = FillMetadataArray(metadata);
}
void CallOpBuffer::AddRecvInitialMetadata(
std::multimap<grpc::string, grpc::string>* metadata) {
recv_initial_metadata_ = metadata;
}
void CallOpBuffer::AddSendInitialMetadata(ClientContext *ctx) {
AddSendInitialMetadata(&ctx->send_initial_metadata_);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment