Improve warning on long RawConnection::flush.

This commit is contained in:
levlam 2022-09-20 17:46:10 +03:00
parent bed08625f0
commit 3a579dd5cb
4 changed files with 33 additions and 11 deletions

View File

@ -49,11 +49,13 @@ class RawConnectionDefault final : public RawConnection {
bool can_send() const final { bool can_send() const final {
return transport_->can_write(); return transport_->can_write();
} }
TransportType get_transport_type() const final { TransportType get_transport_type() const final {
return transport_->get_type(); return transport_->get_type();
} }
void send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key,
uint64 quick_ack_token) final { size_t send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key,
uint64 quick_ack_token) final {
PacketInfo info; PacketInfo info;
info.version = 2; info.version = 2;
info.no_crypto_flag = false; info.no_crypto_flag = false;
@ -76,7 +78,9 @@ class RawConnectionDefault final : public RawConnection {
} }
} }
auto packet_size = packet.size();
transport_->write(std::move(packet), use_quick_ack); transport_->write(std::move(packet), use_quick_ack);
return packet_size;
} }
uint64 send_no_crypto(const Storer &storer) final { uint64 send_no_crypto(const Storer &storer) final {
@ -280,11 +284,13 @@ class RawConnectionHttp final : public RawConnection {
bool can_send() const final { bool can_send() const final {
return mode_ == Send; return mode_ == Send;
} }
TransportType get_transport_type() const final { TransportType get_transport_type() const final {
return mtproto::TransportType{mtproto::TransportType::Http, 0, mtproto::ProxySecret()}; return mtproto::TransportType{mtproto::TransportType::Http, 0, mtproto::ProxySecret()};
} }
void send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key,
uint64 quick_ack_token) final { size_t send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key,
uint64 quick_ack_token) final {
PacketInfo info; PacketInfo info;
info.version = 2; info.version = 2;
info.no_crypto_flag = false; info.no_crypto_flag = false;
@ -295,7 +301,9 @@ class RawConnectionHttp final : public RawConnection {
auto packet = BufferWriter{Transport::write(storer, auth_key, &info), 0, 0}; auto packet = BufferWriter{Transport::write(storer, auth_key, &info), 0, 0};
Transport::write(storer, auth_key, &info, packet.as_slice()); Transport::write(storer, auth_key, &info, packet.as_slice());
auto packet_size = packet.size();
send_packet(packet.as_buffer_slice()); send_packet(packet.as_buffer_slice());
return packet_size;
} }
uint64 send_no_crypto(const Storer &storer) final { uint64 send_no_crypto(const Storer &storer) final {

View File

@ -48,8 +48,8 @@ class RawConnection {
virtual bool can_send() const = 0; virtual bool can_send() const = 0;
virtual TransportType get_transport_type() const = 0; virtual TransportType get_transport_type() const = 0;
virtual void send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key, virtual size_t send_crypto(const Storer &storer, int64 session_id, int64 salt, const AuthKey &auth_key,
uint64 quick_ack_token) = 0; uint64 quick_ack_token) = 0;
virtual uint64 send_no_crypto(const Storer &storer) = 0; virtual uint64 send_no_crypto(const Storer &storer) = 0;
virtual PollableFdInfo &get_poll_info() = 0; virtual PollableFdInfo &get_poll_info() = 0;

View File

@ -26,7 +26,6 @@
#include "td/utils/ScopeGuard.h" #include "td/utils/ScopeGuard.h"
#include "td/utils/SliceBuilder.h" #include "td/utils/SliceBuilder.h"
#include "td/utils/Time.h" #include "td/utils/Time.h"
#include "td/utils/Timer.h"
#include "td/utils/tl_parsers.h" #include "td/utils/tl_parsers.h"
#include "td/utils/TlDowncastHelper.h" #include "td/utils/TlDowncastHelper.h"
@ -718,6 +717,7 @@ Status SessionConnection::on_quick_ack(uint64 quick_ack_token) {
void SessionConnection::on_read(size_t size) { void SessionConnection::on_read(size_t size) {
last_read_at_ = Time::now_cached(); last_read_at_ = Time::now_cached();
last_read_size_ += size;
} }
SessionConnection::SessionConnection(Mode mode, unique_ptr<RawConnection> raw_connection, AuthData *auth_data) SessionConnection::SessionConnection(Mode mode, unique_ptr<RawConnection> raw_connection, AuthData *auth_data)
@ -768,8 +768,9 @@ void SessionConnection::do_close(Status status) {
void SessionConnection::send_crypto(const Storer &storer, uint64 quick_ack_token) { void SessionConnection::send_crypto(const Storer &storer, uint64 quick_ack_token) {
CHECK(state_ != Closed); CHECK(state_ != Closed);
raw_connection_->send_crypto(storer, auth_data_->get_session_id(), auth_data_->get_server_salt(Time::now_cached()), last_write_size_ += raw_connection_->send_crypto(storer, auth_data_->get_session_id(),
auth_data_->get_auth_key(), quick_ack_token); auth_data_->get_server_salt(Time::now_cached()),
auth_data_->get_auth_key(), quick_ack_token);
} }
Result<uint64> SessionConnection::send_query(BufferSlice buffer, bool gzip_flag, int64 message_id, Result<uint64> SessionConnection::send_query(BufferSlice buffer, bool gzip_flag, int64 message_id,
@ -1028,7 +1029,6 @@ Status SessionConnection::do_flush() {
<< connected_flag_ << ' ' << is_main_ << ' ' << need_destroy_auth_key_ << ' ' << connected_flag_ << ' ' << is_main_ << ' ' << need_destroy_auth_key_ << ' '
<< sent_destroy_auth_key_ << ' ' << callback_ << ' ' << (Time::now() - created_at_) << ' ' << sent_destroy_auth_key_ << ' ' << callback_ << ' ' << (Time::now() - created_at_) << ' '
<< (Time::now() - last_read_at_); << (Time::now() - last_read_at_);
PerfWarningTimer timer("SessionConnection::do_flush", 0.01);
CHECK(state_ != Closed); CHECK(state_ != Closed);
if (state_ == Init) { if (state_ == Init) {
TRY_STATUS(init()); TRY_STATUS(init());
@ -1037,7 +1037,18 @@ Status SessionConnection::do_flush() {
return Status::Error("No auth key"); return Status::Error("No auth key");
} }
TRY_STATUS(raw_connection_->flush(auth_data_->get_auth_key(), *this)); last_read_size_ = 0;
last_write_size_ = 0;
auto start_time = Time::now();
auto result = raw_connection_->flush(auth_data_->get_auth_key(), *this);
auto elapsed_time = Time::now() - start_time;
if (elapsed_time >= 0.01) {
LOG(ERROR) << "RawConnection::flush took " << elapsed_time << " seconds, written " << last_write_size_
<< " bytes, read " << last_read_size_ << " bytes and returned " << result;
}
if (result.is_error()) {
return result;
}
if (last_pong_at_ + ping_disconnect_delay() < Time::now_cached()) { if (last_pong_at_ + ping_disconnect_delay() < Time::now_cached()) {
auto stats_callback = raw_connection_->stats_callback(); auto stats_callback = raw_connection_->stats_callback();

View File

@ -189,6 +189,9 @@ class SessionConnection final
uint64 last_ping_message_id_ = 0; uint64 last_ping_message_id_ = 0;
uint64 last_ping_container_id_ = 0; uint64 last_ping_container_id_ = 0;
uint64 last_read_size_ = 0;
uint64 last_write_size_ = 0;
bool need_destroy_auth_key_ = false; bool need_destroy_auth_key_ = false;
bool sent_destroy_auth_key_ = false; bool sent_destroy_auth_key_ = false;