mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Reinit ADNL (#586)
* Fix dht queries in AdnlPeerPair * Don't use adnl channel if peer does not respond --------- Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
parent
9835ac8af2
commit
adf67aa869
2 changed files with 15 additions and 4 deletions
|
@ -113,6 +113,8 @@ void AdnlPeerPairImpl::discover() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdnlPeerPairImpl::receive_packet_checked(AdnlPacket packet) {
|
void AdnlPeerPairImpl::receive_packet_checked(AdnlPacket packet) {
|
||||||
|
last_received_packet_ = td::Timestamp::now();
|
||||||
|
try_reinit_at_ = td::Timestamp::never();
|
||||||
request_reverse_ping_after_ = td::Timestamp::in(15.0);
|
request_reverse_ping_after_ = td::Timestamp::in(15.0);
|
||||||
auto d = Adnl::adnl_start_time();
|
auto d = Adnl::adnl_start_time();
|
||||||
if (packet.dst_reinit_date() > d) {
|
if (packet.dst_reinit_date() > d) {
|
||||||
|
@ -307,7 +309,9 @@ void AdnlPeerPairImpl::send_messages_in(std::vector<OutboundAdnlMessage> message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!channel_ready_) {
|
bool try_reinit = try_reinit_at_ && try_reinit_at_.is_in_past();
|
||||||
|
bool via_channel = channel_ready_ && !try_reinit;
|
||||||
|
if (!via_channel) {
|
||||||
packet.set_reinit_date(Adnl::adnl_start_time(), reinit_date_);
|
packet.set_reinit_date(Adnl::adnl_start_time(), reinit_date_);
|
||||||
packet.set_source(local_id_);
|
packet.set_source(local_id_);
|
||||||
}
|
}
|
||||||
|
@ -330,7 +334,7 @@ void AdnlPeerPairImpl::send_messages_in(std::vector<OutboundAdnlMessage> message
|
||||||
|
|
||||||
packet.run_basic_checks().ensure();
|
packet.run_basic_checks().ensure();
|
||||||
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), conn, id = print_id(),
|
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), conn, id = print_id(),
|
||||||
via_channel = channel_ready_](td::Result<AdnlPacket> res) {
|
via_channel](td::Result<AdnlPacket> res) {
|
||||||
if (res.is_error()) {
|
if (res.is_error()) {
|
||||||
LOG(ERROR) << id << ": dropping OUT message: error while creating packet: " << res.move_as_error();
|
LOG(ERROR) << id << ": dropping OUT message: error while creating packet: " << res.move_as_error();
|
||||||
} else {
|
} else {
|
||||||
|
@ -339,9 +343,9 @@ void AdnlPeerPairImpl::send_messages_in(std::vector<OutboundAdnlMessage> message
|
||||||
});
|
});
|
||||||
|
|
||||||
td::actor::send_closure(local_actor_, &AdnlLocalId::update_packet, std::move(packet),
|
td::actor::send_closure(local_actor_, &AdnlLocalId::update_packet, std::move(packet),
|
||||||
!channel_ready_ && ack_seqno_ == 0 && in_seqno_ == 0, !channel_ready_,
|
(!channel_ready_ && ack_seqno_ == 0 && in_seqno_ == 0) || try_reinit, !via_channel,
|
||||||
(first || s + addr_list_max_size() <= AdnlNetworkManager::get_mtu())
|
(first || s + addr_list_max_size() <= AdnlNetworkManager::get_mtu())
|
||||||
? peer_recv_addr_list_version_
|
? (try_reinit ? 0 : peer_recv_addr_list_version_)
|
||||||
: 0x7fffffff,
|
: 0x7fffffff,
|
||||||
(first || s + 2 * addr_list_max_size() <= AdnlNetworkManager::get_mtu())
|
(first || s + 2 * addr_list_max_size() <= AdnlNetworkManager::get_mtu())
|
||||||
? peer_recv_priority_addr_list_version_
|
? peer_recv_priority_addr_list_version_
|
||||||
|
@ -388,6 +392,9 @@ void AdnlPeerPairImpl::send_messages(std::vector<OutboundAdnlMessage> messages)
|
||||||
|
|
||||||
void AdnlPeerPairImpl::send_packet_continue(AdnlPacket packet, td::actor::ActorId<AdnlNetworkConnection> conn,
|
void AdnlPeerPairImpl::send_packet_continue(AdnlPacket packet, td::actor::ActorId<AdnlNetworkConnection> conn,
|
||||||
bool via_channel) {
|
bool via_channel) {
|
||||||
|
if (!try_reinit_at_ && last_received_packet_ < td::Timestamp::in(-5.0)) {
|
||||||
|
try_reinit_at_ = td::Timestamp::in(10.0);
|
||||||
|
}
|
||||||
packet.run_basic_checks().ensure();
|
packet.run_basic_checks().ensure();
|
||||||
auto B = serialize_tl_object(packet.tl(), true);
|
auto B = serialize_tl_object(packet.tl(), true);
|
||||||
if (via_channel) {
|
if (via_channel) {
|
||||||
|
@ -933,6 +940,7 @@ void AdnlPeerPairImpl::got_data_from_dht(td::Result<AdnlNode> R) {
|
||||||
CHECK(dht_query_active_);
|
CHECK(dht_query_active_);
|
||||||
dht_query_active_ = false;
|
dht_query_active_ = false;
|
||||||
next_dht_query_at_ = td::Timestamp::in(td::Random::fast(60.0, 120.0));
|
next_dht_query_at_ = td::Timestamp::in(td::Random::fast(60.0, 120.0));
|
||||||
|
alarm_timestamp().relax(next_dht_query_at_);
|
||||||
if (R.is_error()) {
|
if (R.is_error()) {
|
||||||
VLOG(ADNL_INFO) << this << ": dht query failed: " << R.move_as_error();
|
VLOG(ADNL_INFO) << this << ": dht query failed: " << R.move_as_error();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -254,6 +254,9 @@ class AdnlPeerPairImpl : public AdnlPeerPair {
|
||||||
td::Timestamp next_db_update_at_ = td::Timestamp::never();
|
td::Timestamp next_db_update_at_ = td::Timestamp::never();
|
||||||
td::Timestamp retry_send_at_ = td::Timestamp::never();
|
td::Timestamp retry_send_at_ = td::Timestamp::never();
|
||||||
|
|
||||||
|
td::Timestamp last_received_packet_ = td::Timestamp::never();
|
||||||
|
td::Timestamp try_reinit_at_ = td::Timestamp::never();
|
||||||
|
|
||||||
bool has_reverse_addr_ = false;
|
bool has_reverse_addr_ = false;
|
||||||
td::Timestamp request_reverse_ping_after_ = td::Timestamp::now();
|
td::Timestamp request_reverse_ping_after_ = td::Timestamp::now();
|
||||||
bool request_reverse_ping_active_ = false;
|
bool request_reverse_ping_active_ = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue