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

Unified Diff: remoting/host/heartbeat_sender.cc

Issue 2915193003: Add heartbeat timeout. (Closed)
Patch Set: 30 seconds Created 3 years, 7 months 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
« no previous file with comments | « remoting/host/heartbeat_sender.h ('k') | remoting/host/heartbeat_sender_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/heartbeat_sender.cc
diff --git a/remoting/host/heartbeat_sender.cc b/remoting/host/heartbeat_sender.cc
index d5d38a57b2e8e108965c558169756d2684c0072f..3c54ea56ebfb1409d8830e4e2e841bbf09badce0 100644
--- a/remoting/host/heartbeat_sender.cc
+++ b/remoting/host/heartbeat_sender.cc
@@ -48,10 +48,16 @@ const char kHeartbeatResultTag[] = "heartbeat-result";
const char kSetIntervalTag[] = "set-interval";
const char kExpectedSequenceIdTag[] = "expected-sequence-id";
-const int64_t kDefaultHeartbeatIntervalMs = 5 * 60 * 1000; // 5 minutes.
-const int64_t kResendDelayMs = 10 * 1000; // 10 seconds.
-const int64_t kResendDelayOnHostNotFoundMs = 10 * 1000; // 10 seconds.
+constexpr base::TimeDelta kDefaultHeartbeatInterval =
+ base::TimeDelta::FromMinutes(5);
+constexpr base::TimeDelta kHeartbeatResponseTimeout =
+ base::TimeDelta::FromSeconds(30);
+constexpr base::TimeDelta kResendDelay = base::TimeDelta::FromSeconds(10);
+constexpr base::TimeDelta kResendDelayOnHostNotFound =
+ base::TimeDelta::FromSeconds(10);
+
const int kMaxResendOnHostNotFoundCount = 12; // 2 minutes (12 x 10 seconds).
+const int kMaxHeartbeatTimeouts = 2;
} // namespace
@@ -68,12 +74,7 @@ HeartbeatSender::HeartbeatSender(
signal_strategy_(signal_strategy),
host_key_pair_(host_key_pair),
directory_bot_jid_(directory_bot_jid),
- interval_ms_(kDefaultHeartbeatIntervalMs),
- sequence_id_(0),
- sequence_id_was_set_(false),
- sequence_id_recent_set_num_(0),
- heartbeat_succeeded_(false),
- failed_startup_heartbeat_count_(0) {
+ interval_(kDefaultHeartbeatInterval) {
DCHECK(signal_strategy_);
DCHECK(host_key_pair_.get());
DCHECK(thread_checker_.CalledOnValidThread());
@@ -92,10 +93,9 @@ HeartbeatSender::~HeartbeatSender() {
void HeartbeatSender::OnSignalStrategyStateChange(SignalStrategy::State state) {
DCHECK(thread_checker_.CalledOnValidThread());
if (state == SignalStrategy::CONNECTED) {
- iq_sender_.reset(new IqSender(signal_strategy_));
+ iq_sender_ = base::MakeUnique<IqSender>(signal_strategy_);
SendStanza();
- timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_),
- this, &HeartbeatSender::SendStanza);
+ timer_.Start(FROM_HERE, interval_, this, &HeartbeatSender::SendStanza);
} else if (state == SignalStrategy::DISCONNECTED) {
request_.reset();
iq_sender_.reset();
@@ -169,18 +169,32 @@ void HeartbeatSender::DoSendStanza() {
request_ = iq_sender_->SendIq(
buzz::STR_SET, directory_bot_jid_, CreateHeartbeatMessage(),
- base::Bind(&HeartbeatSender::ProcessResponse,
- base::Unretained(this),
+ base::Bind(&HeartbeatSender::ProcessResponse, base::Unretained(this),
!host_offline_reason_.empty()));
+ request_->SetTimeout(kHeartbeatResponseTimeout);
++sequence_id_;
}
-void HeartbeatSender::ProcessResponse(
- bool is_offline_heartbeat_response,
- IqRequest* request,
- const XmlElement* response) {
+void HeartbeatSender::ProcessResponse(bool is_offline_heartbeat_response,
+ IqRequest* request,
+ const XmlElement* response) {
DCHECK(thread_checker_.CalledOnValidThread());
+ if (!response) {
+ timed_out_heartbeats_count_++;
+ if (timed_out_heartbeats_count_ >= kMaxHeartbeatTimeouts) {
+ LOG(ERROR) << "Heartbeat timed out. Reconnecting XMPP.";
+ timed_out_heartbeats_count_ = 0;
+ // SignalingConnector will reconnect SignalStrategy.
+ signal_strategy_->Disconnect();
+ } else {
+ LOG(ERROR) << "Heartbeat timed out.";
+ }
+ return;
+ } else {
+ timed_out_heartbeats_count_ = 0;
+ }
+
std::string type = response->Attr(buzz::QN_TYPE);
if (type == buzz::STR_ERROR) {
const XmlElement* error_element =
@@ -195,11 +209,8 @@ void HeartbeatSender::ProcessResponse(
// exit.
failed_startup_heartbeat_count_++;
if (!heartbeat_succeeded_ && (failed_startup_heartbeat_count_ <=
- kMaxResendOnHostNotFoundCount)) {
- timer_resend_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(
- kResendDelayOnHostNotFoundMs),
- this,
+ kMaxResendOnHostNotFoundCount)) {
+ timer_resend_.Start(FROM_HERE, kResendDelayOnHostNotFound, this,
&HeartbeatSender::ResendStanza);
return;
}
@@ -224,12 +235,13 @@ void HeartbeatSender::ProcessResponse(
kSetIntervalTag));
if (set_interval_element) {
const std::string& interval_str = set_interval_element->BodyText();
- int interval;
- if (!base::StringToInt(interval_str, &interval) || interval <= 0) {
+ int interval_seconds;
+ if (!base::StringToInt(interval_str, &interval_seconds) ||
+ interval_seconds <= 0) {
LOG(ERROR) << "Received invalid set-interval: "
<< set_interval_element->Str();
} else {
- SetInterval(interval * base::Time::kMillisecondsPerSecond);
+ SetInterval(base::TimeDelta::FromSeconds(interval_seconds));
}
}
@@ -270,15 +282,14 @@ void HeartbeatSender::ProcessResponse(
}
}
-void HeartbeatSender::SetInterval(int interval) {
- if (interval != interval_ms_) {
- interval_ms_ = interval;
+void HeartbeatSender::SetInterval(base::TimeDelta interval) {
+ if (interval != interval_) {
+ interval_ = interval;
// Restart the timer with the new interval.
if (timer_.IsRunning()) {
timer_.Stop();
- timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_),
- this, &HeartbeatSender::SendStanza);
+ timer_.Start(FROM_HERE, interval_, this, &HeartbeatSender::SendStanza);
}
}
}
@@ -296,11 +307,11 @@ void HeartbeatSender::SetSequenceId(int sequence_id) {
} else {
HOST_LOG << "The heartbeat sequence ID has been set more than once: "
<< "the new value is " << sequence_id;
- double delay = pow(2.0, sequence_id_recent_set_num_) *
- (1 + base::RandDouble()) * kResendDelayMs;
- if (delay <= interval_ms_) {
- timer_resend_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(delay),
- this, &HeartbeatSender::ResendStanza);
+ base::TimeDelta delay = pow(2.0, sequence_id_recent_set_num_) *
+ (1 + base::RandDouble()) * kResendDelay;
+ if (delay <= interval_) {
+ timer_resend_.Start(FROM_HERE, delay, this,
+ &HeartbeatSender::ResendStanza);
}
}
sequence_id_was_set_ = true;
« no previous file with comments | « remoting/host/heartbeat_sender.h ('k') | remoting/host/heartbeat_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698