|
|
|
@ -117,7 +117,9 @@ auto ChaoticGoodClientTransport::PushFrameIntoCall(ServerFragmentFrame frame, |
|
|
|
|
}); |
|
|
|
|
// Wrap the actual sequence with something that owns the call handler so that
|
|
|
|
|
// its lifetime extends until the push completes.
|
|
|
|
|
return [call_handler, push = std::move(push)]() mutable { return push(); }; |
|
|
|
|
return GRPC_LATENT_SEE_PROMISE( |
|
|
|
|
"PushFrameIntoCall", |
|
|
|
|
([call_handler, push = std::move(push)]() mutable { return push(); })); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
auto ChaoticGoodClientTransport::TransportReadLoop( |
|
|
|
@ -205,10 +207,14 @@ ChaoticGoodClientTransport::ChaoticGoodClientTransport( |
|
|
|
|
party_arena->SetContext<grpc_event_engine::experimental::EventEngine>( |
|
|
|
|
event_engine.get()); |
|
|
|
|
party_ = Party::Make(std::move(party_arena)); |
|
|
|
|
party_->Spawn("client-chaotic-writer", TransportWriteLoop(transport), |
|
|
|
|
party_->Spawn("client-chaotic-writer", |
|
|
|
|
GRPC_LATENT_SEE_PROMISE("ClientTransportWriteLoop", |
|
|
|
|
TransportWriteLoop(transport)), |
|
|
|
|
OnTransportActivityDone("write_loop")); |
|
|
|
|
party_->Spawn("client-chaotic-reader", |
|
|
|
|
TransportReadLoop(std::move(transport)), |
|
|
|
|
party_->Spawn( |
|
|
|
|
"client-chaotic-reader", |
|
|
|
|
GRPC_LATENT_SEE_PROMISE("ClientTransportReadLoop", |
|
|
|
|
TransportReadLoop(std::move(transport))), |
|
|
|
|
OnTransportActivityDone("read_loop")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -265,24 +271,28 @@ auto ChaoticGoodClientTransport::CallOutboundLoop(uint32_t stream_id, |
|
|
|
|
return absl::OkStatus(); |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
return TrySeq( |
|
|
|
|
return GRPC_LATENT_SEE_PROMISE( |
|
|
|
|
"CallOutboundLoop", |
|
|
|
|
TrySeq( |
|
|
|
|
// Wait for initial metadata then send it out.
|
|
|
|
|
call_handler.PullClientInitialMetadata(), |
|
|
|
|
[send_fragment](ClientMetadataHandle md) mutable { |
|
|
|
|
GRPC_TRACE_LOG(chaotic_good, INFO) |
|
|
|
|
<< "CHAOTIC_GOOD: Sending initial metadata: " << md->DebugString(); |
|
|
|
|
<< "CHAOTIC_GOOD: Sending initial metadata: " |
|
|
|
|
<< md->DebugString(); |
|
|
|
|
ClientFragmentFrame frame; |
|
|
|
|
frame.headers = std::move(md); |
|
|
|
|
return send_fragment(std::move(frame)); |
|
|
|
|
}, |
|
|
|
|
// Continuously send client frame with client to server messages.
|
|
|
|
|
ForEach(OutgoingMessages(call_handler), |
|
|
|
|
[send_fragment, |
|
|
|
|
aligned_bytes = aligned_bytes_](MessageHandle message) mutable { |
|
|
|
|
[send_fragment, aligned_bytes = aligned_bytes_]( |
|
|
|
|
MessageHandle message) mutable { |
|
|
|
|
ClientFragmentFrame frame; |
|
|
|
|
// Construct frame header (flags, header_length and
|
|
|
|
|
// trailer_length will be added in serialization).
|
|
|
|
|
const uint32_t message_length = message->payload()->Length(); |
|
|
|
|
const uint32_t message_length = |
|
|
|
|
message->payload()->Length(); |
|
|
|
|
const uint32_t padding = |
|
|
|
|
message_length % aligned_bytes == 0 |
|
|
|
|
? 0 |
|
|
|
@ -296,7 +306,7 @@ auto ChaoticGoodClientTransport::CallOutboundLoop(uint32_t stream_id, |
|
|
|
|
ClientFragmentFrame frame; |
|
|
|
|
frame.end_of_stream = true; |
|
|
|
|
return send_fragment(std::move(frame)); |
|
|
|
|
}); |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ChaoticGoodClientTransport::StartCall(CallHandler call_handler) { |
|
|
|
|