diff --git a/td/telegram/Global.cpp b/td/telegram/Global.cpp index 3ccb0ec2..e14be0c5 100644 --- a/td/telegram/Global.cpp +++ b/td/telegram/Global.cpp @@ -61,6 +61,28 @@ void Global::set_mtproto_header(unique_ptr mtproto_header) { mtproto_header_ = std::move(mtproto_header); } +struct Diff { + double diff; + double system_time; + + template + void store(StorerT &storer) const { + using td::store; + store(diff, storer); + store(system_time, storer); + } + template + void parse(ParserT &parser) { + using td::parse; + parse(diff, parser); + if (parser.get_left_len() != 0) { + parse(system_time, parser); + } else { + system_time = 0; + } + } +}; + Status Global::init(const TdParameters ¶meters, ActorId td, unique_ptr td_db_ptr) { parameters_ = parameters; @@ -70,29 +92,21 @@ Status Global::init(const TdParameters ¶meters, ActorId td, unique_ptrget_binlog_pmc()->get("server_time_difference"); - string save_system_time_str = td_db()->get_binlog_pmc()->get("system_time"); + string saved_diff_str = td_db()->get_binlog_pmc()->get("server_time_difference"); auto system_time = Clocks::system(); auto default_time_difference = system_time - Time::now(); - if (save_diff_str.empty()) { + if (saved_diff_str.empty()) { server_time_difference_ = default_time_difference; server_time_difference_was_updated_ = false; } else { - double save_diff; - unserialize(save_diff, save_diff_str).ensure(); + Diff saved_diff; + unserialize(saved_diff, saved_diff_str).ensure(); - double save_system_time; - if (save_system_time_str.empty()) { - save_system_time = 0; - } else { - unserialize(save_system_time, save_system_time_str).ensure(); - } - - double diff = save_diff + default_time_difference; - if (save_system_time > system_time) { - double time_backwards_fix = save_system_time - system_time; + double diff = saved_diff.diff + default_time_difference; + if (saved_diff.system_time > system_time) { + double time_backwards_fix = saved_diff.system_time - system_time; LOG(WARNING) << "Fix system time which went backwards: " << format::as_time(time_backwards_fix) << " " - << tag("saved_system_time", save_system_time) << tag("system_time", system_time); + << tag("saved_system_time", saved_diff.system_time) << tag("system_time", system_time); diff += time_backwards_fix; } LOG(DEBUG) << "LOAD: " << tag("server_time_difference", diff); @@ -109,13 +123,7 @@ void Global::update_server_time_difference(double diff) { if (!server_time_difference_was_updated_ || server_time_difference_ < diff) { server_time_difference_ = diff; server_time_difference_was_updated_ = true; - - // diff = server_time - Time::now - // save_diff = server_time - Clocks::system - double save_diff = diff + Time::now() - Clocks::system(); - - td_db()->get_binlog_pmc()->set("server_time_difference", serialize(save_diff)); - save_system_time(); + do_save_server_time_difference(); } } @@ -123,12 +131,23 @@ void Global::save_system_time() { auto t = Time::now(); if (system_time_saved_at_.load(std::memory_order_relaxed) + 10 < t) { system_time_saved_at_ = t; - double save_system_time = Clocks::system(); - LOG(INFO) << "Save system time"; - td_db()->get_binlog_pmc()->set("system_time", serialize(save_system_time)); + do_save_server_time_difference(); } } +void Global::do_save_server_time_difference() { + LOG(INFO) << "Save server time difference"; + // diff = server_time - Time::now + // fixed_diff = server_time - Clocks::system + double system_time = Clocks::system(); + double fixed_diff = server_time_difference_ + Time::now() - system_time; + + Diff diff; + diff.diff = fixed_diff; + diff.system_time = system_time; + td_db()->get_binlog_pmc()->set("server_time_difference", serialize(diff)); +} + void Global::update_dns_time_difference(double diff) { dns_time_difference_ = diff; dns_time_difference_was_updated_ = true; diff --git a/td/telegram/Global.h b/td/telegram/Global.h index 93007f77..d0dbfc0b 100644 --- a/td/telegram/Global.h +++ b/td/telegram/Global.h @@ -145,6 +145,7 @@ class Global : public ActorContext { void update_server_time_difference(double diff); void save_system_time(); + void do_save_server_time_difference(); double get_server_time_difference() const { return server_time_difference_.load(std::memory_order_relaxed);