Commit efc231cc authored by Steve Anton's avatar Steve Anton Committed by Commit Bot

Fix the P2PQuicTransport getting wedged under load

When the P2PQuicTransport's packet writer gets an error from the
underlying P2PTransportChannel, it will signal write blocked to the
QUIC library. In order to resume sending, the P2PTransportChannel
should indicate when it can start sending again.

This CL fixes two problems:
1) Changes the writable signal from SignalWriteState to
   SignalReadyToSend. SignalReadyToSend is signaled by the
   underlying IPC socket when a Send would no longer cause an
   EAGAIN.
2) Changes the IPC socket to fire SignalReadyToSend only at the
   very end of the IPC handler so that the listener can back in to
   the P2PPacketSocket safely.

Bug: 874296
Change-Id: I8276f60165928f77ca62243f3e5865897aa2cf6f
Reviewed-on: https://chromium-review.googlesource.com/c/1330299
Commit-Queue: Steve Anton <steveanton@chromium.org>
Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609024}
parent f83a74fe
......@@ -613,8 +613,8 @@ void IpcPacketSocket::OnSendComplete(
"IpcPacketSocket: sending is unblocked. %d packets in flight.",
static_cast<int>(in_flight_packet_records_.size())));
SignalReadyToSend(this);
writable_signal_expected_ = false;
SignalReadyToSend(this);
}
}
......
......@@ -19,8 +19,8 @@ class QuicPacketTransportAdapter : public P2PQuicPacketTransport,
DCHECK(p2p_transport_channel_);
p2p_transport_channel_->SignalReadPacket.connect(
this, &QuicPacketTransportAdapter::OnReadPacket);
p2p_transport_channel_->SignalWritableState.connect(
this, &QuicPacketTransportAdapter::OnWritableState);
p2p_transport_channel_->SignalReadyToSend.connect(
this, &QuicPacketTransportAdapter::OnReadyToSend);
}
~QuicPacketTransportAdapter() override {
......@@ -62,14 +62,12 @@ class QuicPacketTransportAdapter : public P2PQuicPacketTransport,
}
receive_delegate_->OnPacketDataReceived(buffer, buffer_length);
}
void OnWritableState(rtc::PacketTransportInternal* packet_transport) {
void OnReadyToSend(rtc::PacketTransportInternal* packet_transport) {
DCHECK_EQ(packet_transport, p2p_transport_channel_);
if (!write_observer_) {
return;
}
if (p2p_transport_channel_->writable()) {
write_observer_->OnCanWrite();
}
write_observer_->OnCanWrite();
}
cricket::P2PTransportChannel* p2p_transport_channel_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment