nghttpx: Don't re-enter offline if it is already in offline mode
This commit is contained in:
parent
dce7288658
commit
e26d6a2b27
|
@ -35,7 +35,7 @@ void connect_blocker_cb(struct ev_loop *loop, ev_timer *w, int revents) {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
ConnectBlocker::ConnectBlocker(std::mt19937 &gen, struct ev_loop *loop)
|
ConnectBlocker::ConnectBlocker(std::mt19937 &gen, struct ev_loop *loop)
|
||||||
: gen_(gen), loop_(loop), fail_count_(0) {
|
: gen_(gen), loop_(loop), fail_count_(0), offline_(false) {
|
||||||
ev_timer_init(&timer_, connect_blocker_cb, 0., 0.);
|
ev_timer_init(&timer_, connect_blocker_cb, 0., 0.);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +81,12 @@ void ConnectBlocker::on_failure() {
|
||||||
size_t ConnectBlocker::get_fail_count() const { return fail_count_; }
|
size_t ConnectBlocker::get_fail_count() const { return fail_count_; }
|
||||||
|
|
||||||
void ConnectBlocker::offline() {
|
void ConnectBlocker::offline() {
|
||||||
|
if (offline_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
offline_ = true;
|
||||||
|
|
||||||
ev_timer_stop(loop_, &timer_);
|
ev_timer_stop(loop_, &timer_);
|
||||||
ev_timer_set(&timer_, std::numeric_limits<double>::max(), 0.);
|
ev_timer_set(&timer_, std::numeric_limits<double>::max(), 0.);
|
||||||
ev_timer_start(loop_, &timer_);
|
ev_timer_start(loop_, &timer_);
|
||||||
|
@ -90,6 +96,10 @@ void ConnectBlocker::online() {
|
||||||
ev_timer_stop(loop_, &timer_);
|
ev_timer_stop(loop_, &timer_);
|
||||||
|
|
||||||
fail_count_ = 0;
|
fail_count_ = 0;
|
||||||
|
|
||||||
|
offline_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConnectBlocker::in_offline() const { return offline_; }
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -57,6 +57,9 @@ public:
|
||||||
// Peer is now considered online
|
// Peer is now considered online
|
||||||
void online();
|
void online();
|
||||||
|
|
||||||
|
// Returns true if peer is considered offline.
|
||||||
|
bool in_offline() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::mt19937 gen_;
|
std::mt19937 gen_;
|
||||||
ev_timer timer_;
|
ev_timer timer_;
|
||||||
|
@ -64,6 +67,8 @@ private:
|
||||||
// The number of consecutive connection failure. Reset to 0 on
|
// The number of consecutive connection failure. Reset to 0 on
|
||||||
// success.
|
// success.
|
||||||
size_t fail_count_;
|
size_t fail_count_;
|
||||||
|
// true if peer is considered offline.
|
||||||
|
bool offline_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -478,6 +478,10 @@ size_t match_downstream_addr_group(
|
||||||
void downstream_failure(DownstreamAddr *addr) {
|
void downstream_failure(DownstreamAddr *addr) {
|
||||||
const auto &connect_blocker = addr->connect_blocker;
|
const auto &connect_blocker = addr->connect_blocker;
|
||||||
|
|
||||||
|
if (connect_blocker->in_offline()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
connect_blocker->on_failure();
|
connect_blocker->on_failure();
|
||||||
|
|
||||||
if (addr->fall == 0) {
|
if (addr->fall == 0) {
|
||||||
|
|
Loading…
Reference in New Issue