Ping connections with the fast rate until each connection is pinged at least three times,
or the connection times out or is pruned. BUG=webrtc:5927 Review-Url: https://codereview.webrtc.org/2009763002 Cr-Commit-Position: refs/heads/master@{#12899}
This commit is contained in:
parent
0e9b06aa1b
commit
524ecc29dd
@ -1302,9 +1302,16 @@ void P2PTransportChannel::OnCheckAndPing() {
|
||||
// Make sure the states of the connections are up-to-date (since this affects
|
||||
// which ones are pingable).
|
||||
UpdateConnectionStates();
|
||||
// When the best connection is either not receiving or not writable,
|
||||
// switch to weak ping interval.
|
||||
int ping_interval = weak() ? weak_ping_interval_ : STRONG_PING_INTERVAL;
|
||||
// When the best connection is not receiving or not writable, or any active
|
||||
// connection has not been pinged enough times, use the weak ping interval.
|
||||
bool need_more_pings_at_weak_interval = std::any_of(
|
||||
connections_.begin(), connections_.end(), [](Connection* conn) {
|
||||
return conn->active() &&
|
||||
conn->num_pings_sent() < MIN_PINGS_AT_WEAK_PING_INTERVAL;
|
||||
});
|
||||
int ping_interval = (weak() || need_more_pings_at_weak_interval)
|
||||
? weak_ping_interval_
|
||||
: STRONG_PING_INTERVAL;
|
||||
if (rtc::TimeMillis() >= last_ping_sent_ms_ + ping_interval) {
|
||||
Connection* conn = FindNextPingableConnection();
|
||||
if (conn) {
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
namespace cricket {
|
||||
|
||||
extern const int WEAK_PING_INTERVAL;
|
||||
static const int MIN_PINGS_AT_WEAK_PING_INTERVAL = 3;
|
||||
|
||||
struct IceParameters {
|
||||
std::string ufrag;
|
||||
|
||||
@ -37,6 +37,7 @@ using cricket::kMinimumStepDelay;
|
||||
using cricket::kDefaultStepDelay;
|
||||
using cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET;
|
||||
using cricket::ServerAddresses;
|
||||
using cricket::MIN_PINGS_AT_WEAK_PING_INTERVAL;
|
||||
using rtc::SocketAddress;
|
||||
|
||||
static const int kDefaultTimeout = 1000;
|
||||
@ -2126,6 +2127,29 @@ TEST_F(P2PTransportChannelPingTest, TestTriggeredChecks) {
|
||||
EXPECT_EQ(conn1, FindNextPingableConnectionAndPingIt(&ch));
|
||||
}
|
||||
|
||||
TEST_F(P2PTransportChannelPingTest, TestAllConnectionsPingedSufficiently) {
|
||||
cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
|
||||
cricket::P2PTransportChannel ch("ping sufficiently", 1, &pa);
|
||||
PrepareChannel(&ch);
|
||||
ch.Connect();
|
||||
ch.MaybeStartGathering();
|
||||
ch.AddRemoteCandidate(CreateHostCandidate("1.1.1.1", 1, 1));
|
||||
ch.AddRemoteCandidate(CreateHostCandidate("2.2.2.2", 2, 2));
|
||||
|
||||
cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
|
||||
cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
|
||||
ASSERT_TRUE(conn1 != nullptr);
|
||||
ASSERT_TRUE(conn2 != nullptr);
|
||||
|
||||
// Low-priority connection becomes writable so that the other connection
|
||||
// is not pruned.
|
||||
conn1->ReceivedPingResponse();
|
||||
EXPECT_TRUE_WAIT(
|
||||
conn1->num_pings_sent() >= MIN_PINGS_AT_WEAK_PING_INTERVAL &&
|
||||
conn2->num_pings_sent() >= MIN_PINGS_AT_WEAK_PING_INTERVAL,
|
||||
kDefaultTimeout);
|
||||
}
|
||||
|
||||
TEST_F(P2PTransportChannelPingTest, TestNoTriggeredChecksWhenWritable) {
|
||||
cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr);
|
||||
cricket::P2PTransportChannel ch("trigger checks", 1, &pa);
|
||||
@ -2804,6 +2828,14 @@ TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest,
|
||||
ASSERT_TRUE(conn3->writable());
|
||||
conn3->ReceivedPing();
|
||||
|
||||
/*
|
||||
|
||||
TODO(honghaiz): Re-enable this once we use fake clock for this test to fix
|
||||
the flakiness. The following test becomes flaky because we now ping the
|
||||
connections with fast rates until every connection is pinged at least three
|
||||
times. The best connection may have been pinged before |max_strong_interval|,
|
||||
so it may not be the next connection to be pinged as expected in the test.
|
||||
|
||||
// Verify that conn3 will be the "best connection" since it is readable and
|
||||
// writable. After |MAX_CURRENT_STRONG_INTERVAL|, it should be the next
|
||||
// pingable connection.
|
||||
@ -2812,6 +2844,8 @@ TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest,
|
||||
conn3->ReceivedPingResponse();
|
||||
ASSERT_TRUE(conn3->writable());
|
||||
EXPECT_EQ(conn3, FindNextPingableConnectionAndPingIt(&ch));
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
// Test that Relay/Relay connections will be pinged first when everything has
|
||||
|
||||
@ -1166,6 +1166,7 @@ void Connection::Ping(int64_t now) {
|
||||
<< ", id=" << rtc::hex_encode(req->id());
|
||||
requests_.Send(req);
|
||||
state_ = STATE_INPROGRESS;
|
||||
num_pings_sent_++;
|
||||
}
|
||||
|
||||
void Connection::ReceivedPing() {
|
||||
@ -1384,7 +1385,8 @@ void Connection::MaybeUpdatePeerReflexiveCandidate(
|
||||
|
||||
void Connection::OnMessage(rtc::Message *pmsg) {
|
||||
ASSERT(pmsg->message_id == MSG_DELETE);
|
||||
LOG_J(LS_INFO, this) << "Connection deleted";
|
||||
LOG_J(LS_INFO, this) << "Connection deleted with number of pings sent: "
|
||||
<< num_pings_sent_;
|
||||
SignalDestroyed(this);
|
||||
delete this;
|
||||
}
|
||||
|
||||
@ -562,6 +562,8 @@ class Connection : public CandidatePairInterface,
|
||||
|
||||
State state() const { return state_; }
|
||||
|
||||
int num_pings_sent() const { return num_pings_sent_; }
|
||||
|
||||
IceMode remote_ice_mode() const { return remote_ice_mode_; }
|
||||
|
||||
uint32_t ComputeNetworkCost() const;
|
||||
@ -648,6 +650,7 @@ class Connection : public CandidatePairInterface,
|
||||
// Time duration to switch from receiving to not receiving.
|
||||
int receiving_timeout_;
|
||||
int64_t time_created_ms_;
|
||||
int num_pings_sent_ = 0;
|
||||
|
||||
friend class Port;
|
||||
friend class ConnectionRequest;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user