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:
honghaiz 2016-05-25 12:48:31 -07:00 committed by Commit bot
parent 0e9b06aa1b
commit 524ecc29dd
5 changed files with 51 additions and 4 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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;