Don't reset RTT Backoff timeout on route change.

Bug: webrtc:9718
Change-Id: I536733b33c40838cdfc473988581147bec6a358a
Reviewed-on: https://webrtc-review.googlesource.com/c/109927
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25638}
This commit is contained in:
Sebastian Jansson
2018-11-14 14:19:45 +01:00
committed by Commit Bot
parent fdc635d2a8
commit 24643488d4
3 changed files with 87 additions and 37 deletions

View File

@ -104,21 +104,43 @@ bool ReadBweLossExperimentParameters(float* low_loss_threshold,
}
} // namespace
RttBasedBackoffConfig::RttBasedBackoffConfig()
: rtt_limit("limit", TimeDelta::PlusInfinity()),
drop_fraction("fraction", 0.5),
drop_interval("interval", TimeDelta::ms(300)) {
std::string trial_string =
field_trial::FindFullName("WebRTC-Bwe-MaxRttLimit");
ParseFieldTrial({&rtt_limit, &drop_fraction, &drop_interval}, trial_string);
RttBasedBackoff::RttBasedBackoff()
: rtt_limit_("limit", TimeDelta::PlusInfinity()),
drop_fraction_("fraction", 0.5),
drop_interval_("interval", TimeDelta::ms(300)),
persist_on_route_change_("persist"),
// By initializing this to plus infinity, we make sure that we never
// trigger rtt backoff unless packet feedback is enabled.
last_propagation_rtt_update_(Timestamp::PlusInfinity()),
last_propagation_rtt_(TimeDelta::Zero()) {
ParseFieldTrial({&rtt_limit_, &drop_fraction_, &drop_interval_,
&persist_on_route_change_},
field_trial::FindFullName("WebRTC-Bwe-MaxRttLimit"));
}
RttBasedBackoffConfig::RttBasedBackoffConfig(const RttBasedBackoffConfig&) =
default;
RttBasedBackoffConfig::~RttBasedBackoffConfig() = default;
void RttBasedBackoff::OnRouteChange() {
if (!persist_on_route_change_) {
last_propagation_rtt_update_ = Timestamp::PlusInfinity();
last_propagation_rtt_ = TimeDelta::Zero();
}
}
void RttBasedBackoff::UpdatePropagationRtt(Timestamp at_time,
TimeDelta propagation_rtt) {
last_propagation_rtt_update_ = at_time;
last_propagation_rtt_ = propagation_rtt;
}
TimeDelta RttBasedBackoff::RttLowerBound(Timestamp at_time) const {
// TODO(srte): Use time since last unacknowledged packet for this.
TimeDelta time_since_rtt = at_time - last_propagation_rtt_update_;
return time_since_rtt + last_propagation_rtt_;
}
RttBasedBackoff::~RttBasedBackoff() = default;
SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log)
: rtt_backoff_config_(RttBasedBackoffConfig()),
lost_packets_since_last_loss_update_(0),
: lost_packets_since_last_loss_update_(0),
expected_packets_since_last_loss_update_(0),
current_bitrate_(DataRate::Zero()),
min_bitrate_configured_(
@ -132,10 +154,6 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log)
last_fraction_loss_(0),
last_logged_fraction_loss_(0),
last_round_trip_time_(TimeDelta::Zero()),
// By initializing this to plus infinity, we make sure that we never
// trigger rtt backoff unless packet feedback is enabled.
last_propagation_rtt_update_(Timestamp::PlusInfinity()),
last_propagation_rtt_(TimeDelta::Zero()),
bwe_incoming_(DataRate::Zero()),
delay_based_bitrate_(DataRate::Zero()),
time_last_decrease_(Timestamp::MinusInfinity()),
@ -168,6 +186,34 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log)
SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {}
void SendSideBandwidthEstimation::OnRouteChange() {
lost_packets_since_last_loss_update_ = 0;
expected_packets_since_last_loss_update_ = 0;
current_bitrate_ = DataRate::Zero();
min_bitrate_configured_ =
DataRate::bps(congestion_controller::GetMinBitrateBps());
max_bitrate_configured_ = kDefaultMaxBitrate;
last_low_bitrate_log_ = Timestamp::MinusInfinity();
has_decreased_since_last_fraction_loss_ = false;
last_loss_feedback_ = Timestamp::MinusInfinity();
last_loss_packet_report_ = Timestamp::MinusInfinity();
last_timeout_ = Timestamp::MinusInfinity();
last_fraction_loss_ = 0;
last_logged_fraction_loss_ = 0;
last_round_trip_time_ = TimeDelta::Zero();
bwe_incoming_ = DataRate::Zero();
delay_based_bitrate_ = DataRate::Zero();
time_last_decrease_ = Timestamp::MinusInfinity();
first_report_time_ = Timestamp::MinusInfinity();
initially_lost_packets_ = 0;
bitrate_at_2_seconds_ = DataRate::Zero();
uma_update_state_ = kNoUpdate;
uma_rtt_state_ = kNoUpdate;
last_rtc_event_log_ = Timestamp::MinusInfinity();
rtt_backoff_.OnRouteChange();
}
void SendSideBandwidthEstimation::SetBitrates(
absl::optional<DataRate> send_bitrate,
DataRate min_bitrate,
@ -312,11 +358,10 @@ void SendSideBandwidthEstimation::UpdateRtt(TimeDelta rtt, Timestamp at_time) {
void SendSideBandwidthEstimation::UpdateEstimate(Timestamp at_time) {
DataRate new_bitrate = current_bitrate_;
TimeDelta time_since_rtt = at_time - last_propagation_rtt_update_;
if (time_since_rtt + last_propagation_rtt_ > rtt_backoff_config_.rtt_limit) {
if (at_time - time_last_decrease_ >= rtt_backoff_config_.drop_interval) {
if (rtt_backoff_.RttLowerBound(at_time) > rtt_backoff_.rtt_limit_) {
if (at_time - time_last_decrease_ >= rtt_backoff_.drop_interval_) {
time_last_decrease_ = at_time;
new_bitrate = current_bitrate_ * rtt_backoff_config_.drop_fraction;
new_bitrate = current_bitrate_ * rtt_backoff_.drop_fraction_;
}
CapBitrateToThresholds(at_time, new_bitrate);
return;
@ -412,8 +457,7 @@ void SendSideBandwidthEstimation::UpdateEstimate(Timestamp at_time) {
void SendSideBandwidthEstimation::UpdatePropagationRtt(
Timestamp at_time,
TimeDelta propagation_rtt) {
last_propagation_rtt_update_ = at_time;
last_propagation_rtt_ = propagation_rtt;
rtt_backoff_.UpdatePropagationRtt(at_time, propagation_rtt);
}
bool SendSideBandwidthEstimation::IsInStartPhase(Timestamp at_time) const {

View File

@ -29,14 +29,22 @@ namespace webrtc {
class RtcEventLog;
struct RttBasedBackoffConfig {
RttBasedBackoffConfig();
RttBasedBackoffConfig(const RttBasedBackoffConfig&);
RttBasedBackoffConfig& operator=(const RttBasedBackoffConfig&) = default;
~RttBasedBackoffConfig();
FieldTrialParameter<TimeDelta> rtt_limit;
FieldTrialParameter<double> drop_fraction;
FieldTrialParameter<TimeDelta> drop_interval;
class RttBasedBackoff {
public:
RttBasedBackoff();
~RttBasedBackoff();
void OnRouteChange();
void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
TimeDelta RttLowerBound(Timestamp at_time) const;
FieldTrialParameter<TimeDelta> rtt_limit_;
FieldTrialParameter<double> drop_fraction_;
FieldTrialParameter<TimeDelta> drop_interval_;
FieldTrialFlag persist_on_route_change_;
public:
Timestamp last_propagation_rtt_update_;
TimeDelta last_propagation_rtt_;
};
class SendSideBandwidthEstimation {
@ -45,12 +53,13 @@ class SendSideBandwidthEstimation {
explicit SendSideBandwidthEstimation(RtcEventLog* event_log);
~SendSideBandwidthEstimation();
void OnRouteChange();
void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const;
// Call periodically to update estimate.
void UpdateEstimate(Timestamp at_time);
void OnSentPacket(SentPacket sent_packet);
void UpdatePropagationRtt(Timestamp at_time, TimeDelta feedback_rtt);
void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
// Call when we receive a RTCP message with TMMBR or REMB.
void UpdateReceiverEstimate(Timestamp at_time, DataRate bandwidth);
@ -96,7 +105,7 @@ class SendSideBandwidthEstimation {
// set |current_bitrate_| to the capped value and updates the event log.
void CapBitrateToThresholds(Timestamp at_time, DataRate bitrate);
RttBasedBackoffConfig rtt_backoff_config_;
RttBasedBackoff rtt_backoff_;
std::deque<std::pair<Timestamp, DataRate> > min_bitrate_history_;
@ -117,9 +126,6 @@ class SendSideBandwidthEstimation {
uint8_t last_logged_fraction_loss_;
TimeDelta last_round_trip_time_;
Timestamp last_propagation_rtt_update_;
TimeDelta last_propagation_rtt_;
DataRate bwe_incoming_;
DataRate delay_based_bitrate_;
Timestamp time_last_decrease_;

View File

@ -213,8 +213,7 @@ NetworkControlUpdate GoogCcNetworkController::OnNetworkRouteChange(
delay_based_bwe_.reset(new DelayBasedBwe(event_log_));
delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
bandwidth_estimation_ =
absl::make_unique<SendSideBandwidthEstimation>(event_log_);
bandwidth_estimation_->OnRouteChange();
bandwidth_estimation_->SetBitrates(
msg.constraints.starting_rate, DataRate::bps(min_bitrate_bps),
msg.constraints.max_data_rate.value_or(DataRate::Infinity()),
@ -428,6 +427,7 @@ NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback(
const size_t kMaxFeedbackRttWindow = 32;
if (feedback_max_rtts_.size() > kMaxFeedbackRttWindow)
feedback_max_rtts_.pop_front();
// TODO(srte): Use time since last unacknowledged packet.
bandwidth_estimation_->UpdatePropagationRtt(report.feedback_time,
min_propagation_rtt);
}