Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(613)

Unified Diff: webrtc/p2p/base/p2ptransportchannel.cc

Issue 1455033004: Ping backup connection at a slower rate (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/p2p/base/p2ptransportchannel.cc
diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
index ab7c32277f9f920c667b25c8f977998b5665b83d..b89c8d556f43dbc0efac42874db577b925b95dcc 100644
--- a/webrtc/p2p/base/p2ptransportchannel.cc
+++ b/webrtc/p2p/base/p2ptransportchannel.cc
@@ -201,6 +201,10 @@ static const uint32_t MAX_CURRENT_STRONG_DELAY = 900;
static const int MIN_CHECK_RECEIVING_DELAY = 50; // ms
+// This is 5 seconds shorter than DEAD_CONNECTION_RECEIVE_TIMEOUT in port.h,
+// so there are 5 seconds to retry pinging the backup connection before it
+// becomes dead.
+static const int BACKUP_CONNECTION_PING_INTERVAL = 25000; // ms
P2PTransportChannel::P2PTransportChannel(const std::string& transport_name,
int component,
@@ -221,7 +225,8 @@ P2PTransportChannel::P2PTransportChannel(const std::string& transport_name,
remote_candidate_generation_(0),
gathering_state_(kIceGatheringNew),
check_receiving_delay_(MIN_CHECK_RECEIVING_DELAY * 5),
- receiving_timeout_(MIN_CHECK_RECEIVING_DELAY * 50) {
+ receiving_timeout_(MIN_CHECK_RECEIVING_DELAY * 50),
+ backup_connection_ping_interval_(BACKUP_CONNECTION_PING_INTERVAL) {
pthatcher1 2015/11/20 05:34:38 We call one "delay" and the other "interval". It
honghaiz3 2015/11/20 20:10:06 I agree that the interval sounds better. I will ch
uint32_t weak_ping_delay = ::strtoul(
webrtc::field_trial::FindFullName("WebRTC-StunInterPacketDelay").c_str(),
nullptr, 10);
@@ -296,9 +301,13 @@ void P2PTransportChannel::SetIceTiebreaker(uint64_t tiebreaker) {
tiebreaker_ = tiebreaker;
}
+TransportChannelState P2PTransportChannel::GetState() const {
+ return channel_state_;
pthatcher1 2015/11/20 05:34:37 Why not just state_?
honghaiz3 2015/11/20 20:10:06 Done.
+}
+
// A channel is considered ICE completed once there is at most one active
// connection per network and at least one active connection.
-TransportChannelState P2PTransportChannel::GetState() const {
+TransportChannelState P2PTransportChannel::GetStateInternal() const {
if (!had_connection_) {
return TransportChannelState::STATE_INIT;
}
@@ -372,18 +381,23 @@ void P2PTransportChannel::SetIceConfig(const IceConfig& config) {
gather_continually_ = config.gather_continually;
LOG(LS_INFO) << "Set gather_continually to " << gather_continually_;
- if (config.receiving_timeout_ms < 0) {
- return;
+ if (config.backup_connection_ping_interval >= 0) {
+ backup_connection_ping_interval_ = config.backup_connection_ping_interval;
+ LOG(LS_INFO) << "Set backup connection ping interval to "
+ << backup_connection_ping_interval_ << " milliseconds.";
pthatcher1 2015/11/20 05:34:37 You probably only want to log this it if it change
honghaiz3 2015/11/20 20:10:06 Done. Only set and log this if the value changes.
}
- receiving_timeout_ = config.receiving_timeout_ms;
- check_receiving_delay_ =
- std::max(MIN_CHECK_RECEIVING_DELAY, receiving_timeout_ / 10);
- for (Connection* connection : connections_) {
- connection->set_receiving_timeout(receiving_timeout_);
+ if (config.receiving_timeout_ms >= 0) {
+ receiving_timeout_ = config.receiving_timeout_ms;
+ check_receiving_delay_ =
+ std::max(MIN_CHECK_RECEIVING_DELAY, receiving_timeout_ / 10);
+
+ for (Connection* connection : connections_) {
+ connection->set_receiving_timeout(receiving_timeout_);
+ }
+ LOG(LS_INFO) << "Set ICE receiving timeout to " << receiving_timeout_
+ << " milliseconds";
pthatcher1 2015/11/20 05:34:38 Same here.
honghaiz3 2015/11/20 20:10:06 Done.
}
- LOG(LS_INFO) << "Set ICE receiving timeout to " << receiving_timeout_
- << " milliseconds";
}
// Go into the state of processing candidates, and running in general
@@ -1051,6 +1065,8 @@ void P2PTransportChannel::SwitchBestConnectionTo(Connection* conn) {
}
void P2PTransportChannel::UpdateChannelState() {
+ channel_state_ = GetStateInternal();
pthatcher1 2015/11/20 05:34:37 So what's the advantage of cacheing the state and
honghaiz3 2015/11/20 20:10:06 Basically I want to avoid too much unnecessary com
+
bool writable = best_connection_ && best_connection_->writable();
set_writable(writable);
@@ -1153,7 +1169,7 @@ void P2PTransportChannel::OnCheckAndPing() {
// Is the connection in a state for us to even consider pinging the other side?
// We consider a connection pingable even if it's not connected because that's
// how a TCP connection is kicked into reconnecting on the active side.
-bool P2PTransportChannel::IsPingable(Connection* conn) {
+bool P2PTransportChannel::IsPingable(Connection* conn, uint32_t now) {
const Candidate& remote = conn->remote_candidate();
// We should never get this far with an empty remote ufrag.
ASSERT(!remote.username().empty());
@@ -1169,9 +1185,21 @@ bool P2PTransportChannel::IsPingable(Connection* conn) {
return false;
}
- // If the channel is weak, ping all candidates. Otherwise, we only
- // want to ping connections that have not timed out on writing.
- return weak() || conn->write_state() != Connection::STATE_WRITE_TIMEOUT;
+ // If the channel is weakly connected, ping all connections.
+ if (weak()) {
+ return true;
+ }
+
+ // If the channel is not COMPLETED,
pthatcher1 2015/11/20 05:34:37 Might be more readable as "If the channel is stron
honghaiz3 2015/11/20 20:10:06 Done.
+ // ping connections that have not timed out on writing.
pthatcher1 2015/11/20 05:34:38 To match the code, you should say "ping all active
honghaiz3 2015/11/20 20:10:06 Done.
+ if (channel_state_ != STATE_COMPLETED) {
+ return conn->active();
+ }
+ // If the channel is strongly connected and it is COMPLETED, ping the backup
+ // connection once every |backup_connection_ping_interval_| milliseconds.
pthatcher1 2015/11/20 05:34:38 The comment says "ping the backup connection", but
honghaiz3 2015/11/20 20:10:06 Thanks. made a small change, requiring that backup
+ return conn == best_connection_ ||
+ now >= (conn->last_ping_response_received() +
+ backup_connection_ping_interval_);
}
// Returns the next pingable connection to ping. This will be the oldest
@@ -1195,7 +1223,7 @@ Connection* P2PTransportChannel::FindNextPingableConnection() {
Connection* oldest_needing_triggered_check = nullptr;
Connection* oldest = nullptr;
for (Connection* conn : connections_) {
- if (!IsPingable(conn)) {
+ if (!IsPingable(conn, now)) {
continue;
}
bool needs_triggered_check =
@@ -1307,6 +1335,8 @@ void P2PTransportChannel::OnConnectionDestroyed(Connection* connection) {
RequestSort();
}
+ UpdateChannelState();
pthatcher1 2015/11/20 05:34:38 This kind of thing makes me worry that we won't re
honghaiz3 2015/11/20 20:10:06 I am pretty sure this is the only place we need to
+
SignalConnectionRemoved(this);
}

Powered by Google App Engine
This is Rietveld 408576698