summaryrefslogtreecommitdiff
path: root/libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp')
-rw-r--r--libs/tdlib/td/td/telegram/net/SessionMultiProxy.cpp111
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