Line data Source code
1 : #include "source/common/http/http3_status_tracker_impl.h" 2 : 3 : namespace Envoy { 4 : namespace Http { 5 : 6 : namespace { 7 : 8 : // Initially, HTTP/3 is be marked broken for 5 minutes. 9 : const std::chrono::minutes DefaultExpirationTime{5}; 10 : // Cap the broken period at just under 1 day. 11 : const int MaxConsecutiveBrokenCount = 8; 12 : } // namespace 13 : 14 : Http3StatusTrackerImpl::Http3StatusTrackerImpl(Event::Dispatcher& dispatcher) 15 0 : : expiration_timer_(dispatcher.createTimer([this]() -> void { onExpirationTimeout(); })) {} 16 : 17 0 : bool Http3StatusTrackerImpl::isHttp3Broken() const { return state_ == State::Broken; } 18 : 19 0 : bool Http3StatusTrackerImpl::isHttp3Confirmed() const { return state_ == State::Confirmed; } 20 : 21 0 : bool Http3StatusTrackerImpl::hasHttp3FailedRecently() const { 22 0 : return state_ == State::FailedRecently; 23 0 : } 24 : 25 0 : void Http3StatusTrackerImpl::markHttp3Broken() { 26 0 : state_ = State::Broken; 27 0 : if (!expiration_timer_->enabled()) { 28 0 : std::chrono::minutes expiration_in_min = 29 0 : DefaultExpirationTime * (1 << consecutive_broken_count_); 30 0 : expiration_timer_->enableTimer( 31 0 : std::chrono::duration_cast<std::chrono::milliseconds>(expiration_in_min)); 32 0 : if (consecutive_broken_count_ < MaxConsecutiveBrokenCount) { 33 0 : ++consecutive_broken_count_; 34 0 : } 35 0 : } 36 0 : } 37 : 38 0 : void Http3StatusTrackerImpl::markHttp3Confirmed() { 39 0 : state_ = State::Confirmed; 40 0 : consecutive_broken_count_ = 0; 41 0 : if (expiration_timer_->enabled()) { 42 0 : expiration_timer_->disableTimer(); 43 0 : } 44 0 : } 45 : 46 0 : void Http3StatusTrackerImpl::markHttp3FailedRecently() { state_ = State::FailedRecently; } 47 : 48 0 : void Http3StatusTrackerImpl::onExpirationTimeout() { 49 0 : if (state_ != State::Broken) { 50 0 : return; 51 0 : } 52 0 : state_ = State::FailedRecently; 53 0 : } 54 : 55 : } // namespace Http 56 : } // namespace Envoy