Disable ConfigRecoverer if there are a lot of pending auth keys.

This commit is contained in:
levlam 2022-08-10 17:03:38 +03:00
parent 17a18e8def
commit 148ded0620
3 changed files with 32 additions and 0 deletions

View File

@ -781,6 +781,11 @@ class ConfigRecoverer final : public Actor {
if (close_flag_) {
return;
}
if (Session::is_high_loaded()) {
VLOG(config_recoverer) << "Skip config recoverer under high load";
set_timeout_in(Random::fast(200, 300));
return;
}
if (is_connecting_) {
VLOG(config_recoverer) << "Failed to connect for " << Time::now() - connecting_since_;

View File

@ -44,6 +44,7 @@
#include "td/utils/utf8.h"
#include "td/utils/VectorQueue.h"
#include <atomic>
#include <memory>
#include <tuple>
#include <utility>
@ -109,6 +110,22 @@ class GenAuthKeyActor final : public Actor {
, connection_promise_(std::move(connection_promise))
, handshake_promise_(std::move(handshake_promise))
, callback_(std::move(callback)) {
if (actor_count_.fetch_add(1, std::memory_order_relaxed) == MIN_HIGH_LOAD_ACTOR_COUNT - 1) {
LOG(WARNING) << "Number of GenAuthKeyActor exceeded high-load threshold";
}
}
GenAuthKeyActor(const GenAuthKeyActor &) = delete;
GenAuthKeyActor &operator=(const GenAuthKeyActor &) = delete;
GenAuthKeyActor(GenAuthKeyActor &&) = delete;
GenAuthKeyActor &operator=(GenAuthKeyActor &&) = delete;
~GenAuthKeyActor() final {
if (actor_count_.fetch_sub(1, std::memory_order_relaxed) == MIN_HIGH_LOAD_ACTOR_COUNT) {
LOG(WARNING) << "Number of GenAuthKeyActor became lower than high-load threshold";
}
}
static bool is_high_loaded() {
return actor_count_.load(std::memory_order_relaxed) >= MIN_HIGH_LOAD_ACTOR_COUNT;
}
void on_network(uint32 network_generation) {
@ -130,6 +147,9 @@ class GenAuthKeyActor final : public Actor {
ActorOwn<mtproto::HandshakeActor> child_;
Promise<Unit> finish_promise_;
static constexpr size_t MIN_HIGH_LOAD_ACTOR_COUNT = 100;
static std::atomic<size_t> actor_count_;
static TD_THREAD_LOCAL Semaphore *semaphore_;
Semaphore &get_handshake_semaphore() {
auto old_context = set_context(std::make_shared<ActorContext>());
@ -187,6 +207,7 @@ class GenAuthKeyActor final : public Actor {
}
};
std::atomic<size_t> GenAuthKeyActor::actor_count_;
TD_THREAD_LOCAL Semaphore *GenAuthKeyActor::semaphore_{};
} // namespace detail
@ -258,6 +279,10 @@ Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared>
last_bind_success_timestamp_ = Time::now() - 366 * 86400;
}
bool Session::is_high_loaded() {
return detail::GenAuthKeyActor::is_high_loaded();
}
bool Session::can_destroy_auth_key() const {
return need_destroy_;
}

View File

@ -74,6 +74,8 @@ class Session final
void close();
static bool is_high_loaded();
private:
struct Query final : private ListNode {
uint64 container_id;