diff options
Diffstat (limited to 'libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp')
-rw-r--r-- | libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp b/libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp new file mode 100644 index 0000000000..7fe27dd81e --- /dev/null +++ b/libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp @@ -0,0 +1,111 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/net/SessionMultiProxy.h" + +#include "td/telegram/net/SessionProxy.h" + +#include "td/utils/format.h" +#include "td/utils/logging.h" +#include "td/utils/Slice.h" + +namespace td { + +SessionMultiProxy::SessionMultiProxy() = default; +SessionMultiProxy::~SessionMultiProxy() = default; + +SessionMultiProxy::SessionMultiProxy(int32 session_count, std::shared_ptr<AuthDataShared> shared_auth_data, + bool is_main, bool use_pfs, bool allow_media_only, bool is_media, bool is_cdn) + : session_count_(session_count) + , auth_data_(std::move(shared_auth_data)) + , is_main_(is_main) + , use_pfs_(use_pfs) + , allow_media_only_(allow_media_only) + , is_media_(is_media) + , is_cdn_(is_cdn) { + if (allow_media_only_) { + CHECK(is_media_); + } +} + +void SessionMultiProxy::send(NetQueryPtr query) { + size_t pos = 0; + // TODO temporary hack with total_timeout_limit + if (query->auth_flag() == NetQuery::AuthFlag::On && query->total_timeout_limit > 50) { + if (query->session_rand()) { + pos = query->session_rand() % sessions_.size(); + } else { + pos = pos_++ % sessions_.size(); + } + } + query->debug(PSTRING() << get_name() << ": send to proxy #" << pos); + send_closure(sessions_[pos], &SessionProxy::send, std::move(query)); +} + +void SessionMultiProxy::update_main_flag(bool is_main) { + LOG(INFO) << "Update " << get_name() << " is_main to " << is_main; + is_main_ = is_main; + for (auto &session : sessions_) { + send_closure(session, &SessionProxy::update_main_flag, is_main); + } +} +void SessionMultiProxy::update_session_count(int32 session_count) { + update_options(session_count, use_pfs_); +} +void SessionMultiProxy::update_use_pfs(bool use_pfs) { + update_options(session_count_, use_pfs); +} + +void SessionMultiProxy::update_options(int32 session_count, bool use_pfs) { + bool changed = false; + + if (session_count != session_count_) { + session_count_ = session_count; + if (session_count_ <= 0) { + session_count_ = 1; + } + if (session_count_ > 100) { + session_count_ = 100; + } + LOG(INFO) << "Update " << get_name() << " session_count to " << session_count_; + changed = true; + } + + if (use_pfs != use_pfs_) { + bool old_pfs_flag = get_pfs_flag(); + use_pfs_ = use_pfs; + if (old_pfs_flag != get_pfs_flag()) { + LOG(INFO) << "Update " << get_name() << " use_pfs to " << use_pfs_; + changed = true; + } + } + if (changed) { + init(); + } +} + +void SessionMultiProxy::start_up() { + init(); +} + +bool SessionMultiProxy::get_pfs_flag() const { + return (!allow_media_only_ && use_pfs_); // pfs is not supported in media only DCs +} + +void SessionMultiProxy::init() { + sessions_.clear(); + if (is_main_) { + LOG(WARNING) << tag("session_count", session_count_); + } + for (int32 i = 0; i < session_count_; i++) { + string name = PSTRING() << "Session" << get_name().substr(Slice("SessionMulti").size()) + << format::cond(session_count_ > 1, format::concat("#", i)); + sessions_.push_back(create_actor<SessionProxy>(name, auth_data_, is_main_, allow_media_only_, is_media_, + get_pfs_flag(), is_main_ && i != 0, is_cdn_)); + } +} + +} // namespace td |