Skip to content

Commit b69214b

Browse files
authored
Validator patch: state download, adnl stats (#1257)
* Persistent state download improvements 1) Don't start over on restart 2) Download shards one at a time to reduce RAM usage 3) More logs * Remove old peers from adnl stats
1 parent 1da94e6 commit b69214b

19 files changed

+135
-76
lines changed

adnl/adnl-local-id.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ void AdnlLocalId::update_packet(AdnlPacket packet, bool update_id, bool sign, td
306306
}
307307
}
308308

309-
void AdnlLocalId::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_localId>> promise) {
309+
void AdnlLocalId::get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats_localId>> promise) {
310310
auto stats = create_tl_object<ton_api::adnl_stats_localId>();
311311
stats->short_id_ = short_id_.bits256_value();
312312
for (auto &[ip, x] : inbound_rate_limiter_) {
@@ -317,22 +317,22 @@ void AdnlLocalId::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_localI
317317
}
318318
prepare_packet_stats();
319319
stats->packets_recent_ = packet_stats_prev_.tl();
320-
stats->packets_total_ = packet_stats_total_.tl();
320+
stats->packets_total_ = packet_stats_total_.tl(all);
321321
stats->packets_total_->ts_start_ = (double)Adnl::adnl_start_time();
322322
stats->packets_total_->ts_end_ = td::Clocks::system();
323323
promise.set_result(std::move(stats));
324324
}
325325

326326
void AdnlLocalId::add_decrypted_packet_stats(td::IPAddress addr) {
327327
prepare_packet_stats();
328-
++packet_stats_cur_.decrypted_packets[addr];
329-
++packet_stats_total_.decrypted_packets[addr];
328+
packet_stats_cur_.decrypted_packets[addr].inc();
329+
packet_stats_total_.decrypted_packets[addr].inc();
330330
}
331331

332332
void AdnlLocalId::add_dropped_packet_stats(td::IPAddress addr) {
333333
prepare_packet_stats();
334-
++packet_stats_cur_.dropped_packets[addr];
335-
++packet_stats_total_.dropped_packets[addr];
334+
packet_stats_cur_.dropped_packets[addr].inc();
335+
packet_stats_total_.dropped_packets[addr].inc();
336336
}
337337

338338
void AdnlLocalId::prepare_packet_stats() {
@@ -351,17 +351,22 @@ void AdnlLocalId::prepare_packet_stats() {
351351
}
352352
}
353353

354-
tl_object_ptr<ton_api::adnl_stats_localIdPackets> AdnlLocalId::PacketStats::tl() const {
354+
tl_object_ptr<ton_api::adnl_stats_localIdPackets> AdnlLocalId::PacketStats::tl(bool all) const {
355+
double threshold = all ? -1.0 : td::Clocks::system() - 600.0;
355356
auto obj = create_tl_object<ton_api::adnl_stats_localIdPackets>();
356357
obj->ts_start_ = ts_start;
357358
obj->ts_end_ = ts_end;
358359
for (const auto &[ip, packets] : decrypted_packets) {
359-
obj->decrypted_packets_.push_back(create_tl_object<ton_api::adnl_stats_ipPackets>(
360-
ip.is_valid() ? PSTRING() << ip.get_ip_str() << ":" << ip.get_port() : "", packets));
360+
if (packets.last_packet_ts >= threshold) {
361+
obj->decrypted_packets_.push_back(create_tl_object<ton_api::adnl_stats_ipPackets>(
362+
ip.is_valid() ? PSTRING() << ip.get_ip_str() << ":" << ip.get_port() : "", packets.packets));
363+
}
361364
}
362365
for (const auto &[ip, packets] : dropped_packets) {
363-
obj->dropped_packets_.push_back(create_tl_object<ton_api::adnl_stats_ipPackets>(
364-
ip.is_valid() ? PSTRING() << ip.get_ip_str() << ":" << ip.get_port() : "", packets));
366+
if (packets.last_packet_ts >= threshold) {
367+
obj->dropped_packets_.push_back(create_tl_object<ton_api::adnl_stats_ipPackets>(
368+
ip.is_valid() ? PSTRING() << ip.get_ip_str() << ":" << ip.get_port() : "", packets.packets));
369+
}
365370
}
366371
return obj;
367372
}

adnl/adnl-local-id.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class AdnlLocalId : public td::actor::Actor {
7878
void update_packet(AdnlPacket packet, bool update_id, bool sign, td::int32 update_addr_list_if,
7979
td::int32 update_priority_addr_list_if, td::Promise<AdnlPacket> promise);
8080

81-
void get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_localId>> promise);
81+
void get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats_localId>> promise);
8282

8383
td::uint32 get_mode() {
8484
return mode_;
@@ -111,10 +111,20 @@ class AdnlLocalId : public td::actor::Actor {
111111
std::map<td::IPAddress, InboundRateLimiter> inbound_rate_limiter_;
112112
struct PacketStats {
113113
double ts_start = 0.0, ts_end = 0.0;
114-
std::map<td::IPAddress, td::uint64> decrypted_packets;
115-
std::map<td::IPAddress, td::uint64> dropped_packets;
116114

117-
tl_object_ptr<ton_api::adnl_stats_localIdPackets> tl() const;
115+
struct Counter {
116+
td::uint64 packets = 0;
117+
double last_packet_ts = 0.0;
118+
119+
void inc() {
120+
++packets;
121+
last_packet_ts = td::Clocks::system();
122+
}
123+
};
124+
std::map<td::IPAddress, Counter> decrypted_packets;
125+
std::map<td::IPAddress, Counter> dropped_packets;
126+
127+
tl_object_ptr<ton_api::adnl_stats_localIdPackets> tl(bool all = true) const;
118128
} packet_stats_cur_, packet_stats_prev_, packet_stats_total_;
119129
void add_decrypted_packet_stats(td::IPAddress addr);
120130
void add_dropped_packet_stats(td::IPAddress addr);

adnl/adnl-peer-table.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ void AdnlPeerTableImpl::get_conn_ip_str(AdnlNodeIdShort l_id, AdnlNodeIdShort p_
385385
td::actor::send_closure(it->second, &AdnlPeer::get_conn_ip_str, l_id, std::move(promise));
386386
}
387387

388-
void AdnlPeerTableImpl::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) {
388+
void AdnlPeerTableImpl::get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) {
389389
class Cb : public td::actor::Actor {
390390
public:
391391
explicit Cb(td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) : promise_(std::move(promise)) {
@@ -440,7 +440,7 @@ void AdnlPeerTableImpl::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats>
440440

441441
for (auto &[id, local_id] : local_ids_) {
442442
td::actor::send_closure(callback, &Cb::inc_pending);
443-
td::actor::send_closure(local_id.local_id, &AdnlLocalId::get_stats,
443+
td::actor::send_closure(local_id.local_id, &AdnlLocalId::get_stats, all,
444444
[id = id, callback](td::Result<tl_object_ptr<ton_api::adnl_stats_localId>> R) {
445445
if (R.is_error()) {
446446
VLOG(ADNL_NOTICE)
@@ -454,7 +454,7 @@ void AdnlPeerTableImpl::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats>
454454
for (auto &[id, peer] : peers_) {
455455
td::actor::send_closure(callback, &Cb::inc_pending);
456456
td::actor::send_closure(
457-
peer, &AdnlPeer::get_stats,
457+
peer, &AdnlPeer::get_stats, all,
458458
[id = id, callback](td::Result<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> R) {
459459
if (R.is_error()) {
460460
VLOG(ADNL_NOTICE) << "failed to get stats for peer " << id << " : " << R.move_as_error();

adnl/adnl-peer-table.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
108108
td::Promise<std::pair<td::actor::ActorOwn<AdnlTunnel>, AdnlAddress>> promise) override;
109109
void get_conn_ip_str(AdnlNodeIdShort l_id, AdnlNodeIdShort p_id, td::Promise<td::string> promise) override;
110110

111-
void get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) override;
111+
void get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) override;
112112

113113
struct PrintId {};
114114
PrintId print_id() const {

adnl/adnl-peer.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,15 @@ void AdnlPeerPairImpl::get_conn_ip_str(td::Promise<td::string> promise) {
808808
promise.set_value("undefined");
809809
}
810810

811-
void AdnlPeerPairImpl::get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) {
811+
void AdnlPeerPairImpl::get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) {
812+
if (!all) {
813+
double threshold = td::Clocks::system() - 600.0;
814+
if (last_in_packet_ts_ < threshold && last_out_packet_ts_ < threshold) {
815+
promise.set_value(nullptr);
816+
return;
817+
}
818+
}
819+
812820
auto stats = create_tl_object<ton_api::adnl_stats_peerPair>();
813821
stats->local_id_ = local_id_.bits256_value();
814822
stats->peer_id_ = peer_id_short_.bits256_value();
@@ -993,15 +1001,17 @@ void AdnlPeerImpl::update_addr_list(AdnlNodeIdShort local_id, td::uint32 local_m
9931001
td::actor::send_closure(it->second, &AdnlPeerPair::update_addr_list, std::move(addr_list));
9941002
}
9951003

996-
void AdnlPeerImpl::get_stats(td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) {
1004+
void AdnlPeerImpl::get_stats(bool all, td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) {
9971005
class Cb : public td::actor::Actor {
9981006
public:
9991007
explicit Cb(td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise)
10001008
: promise_(std::move(promise)) {
10011009
}
10021010

10031011
void got_peer_pair_stats(tl_object_ptr<ton_api::adnl_stats_peerPair> peer_pair) {
1004-
result_.push_back(std::move(peer_pair));
1012+
if (peer_pair) {
1013+
result_.push_back(std::move(peer_pair));
1014+
}
10051015
dec_pending();
10061016
}
10071017

@@ -1027,7 +1037,7 @@ void AdnlPeerImpl::get_stats(td::Promise<std::vector<tl_object_ptr<ton_api::adnl
10271037

10281038
for (auto &[local_id, peer_pair] : peer_pairs_) {
10291039
td::actor::send_closure(callback, &Cb::inc_pending);
1030-
td::actor::send_closure(peer_pair, &AdnlPeerPair::get_stats,
1040+
td::actor::send_closure(peer_pair, &AdnlPeerPair::get_stats, all,
10311041
[local_id = local_id, peer_id = peer_id_short_,
10321042
callback](td::Result<tl_object_ptr<ton_api::adnl_stats_peerPair>> R) {
10331043
if (R.is_error()) {

adnl/adnl-peer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class AdnlPeerPair : public td::actor::Actor {
5959
virtual void update_peer_id(AdnlNodeIdFull id) = 0;
6060
virtual void update_addr_list(AdnlAddressList addr_list) = 0;
6161
virtual void get_conn_ip_str(td::Promise<td::string> promise) = 0;
62-
virtual void get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) = 0;
62+
virtual void get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) = 0;
6363

6464
static td::actor::ActorOwn<AdnlPeerPair> create(td::actor::ActorId<AdnlNetworkManager> network_manager,
6565
td::actor::ActorId<AdnlPeerTable> peer_table, td::uint32 local_mode,
@@ -101,7 +101,7 @@ class AdnlPeer : public td::actor::Actor {
101101
td::actor::ActorId<AdnlLocalId> local_actor, AdnlAddressList addr_list) = 0;
102102
virtual void update_dht_node(td::actor::ActorId<dht::Dht> dht_node) = 0;
103103
virtual void get_conn_ip_str(AdnlNodeIdShort l_id, td::Promise<td::string> promise) = 0;
104-
virtual void get_stats(td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) = 0;
104+
virtual void get_stats(bool all, td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) = 0;
105105
};
106106

107107
} // namespace adnl

adnl/adnl-peer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class AdnlPeerPairImpl : public AdnlPeerPair {
9090
void update_peer_id(AdnlNodeIdFull id) override;
9191

9292
void get_conn_ip_str(td::Promise<td::string> promise) override;
93-
void get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) override;
93+
void get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats_peerPair>> promise) override;
9494

9595
void got_data_from_db(td::Result<AdnlDbItem> R);
9696
void got_data_from_static_nodes(td::Result<AdnlNode> R);
@@ -302,7 +302,7 @@ class AdnlPeerImpl : public AdnlPeer {
302302
AdnlAddressList addr_list) override;
303303
void update_dht_node(td::actor::ActorId<dht::Dht> dht_node) override;
304304
void get_conn_ip_str(AdnlNodeIdShort l_id, td::Promise<td::string> promise) override;
305-
void get_stats(td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) override;
305+
void get_stats(bool all, td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) override;
306306
//void check_signature(td::BufferSlice data, td::BufferSlice signature, td::Promise<td::Unit> promise) override;
307307

308308
AdnlPeerImpl(td::actor::ActorId<AdnlNetworkManager> network_manager, td::actor::ActorId<AdnlPeerTable> peer_table,

adnl/adnl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ class Adnl : public AdnlSenderInterface {
121121
virtual void create_tunnel(AdnlNodeIdShort dst, td::uint32 size,
122122
td::Promise<std::pair<td::actor::ActorOwn<AdnlTunnel>, AdnlAddress>> promise) = 0;
123123

124-
virtual void get_stats(td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) = 0;
124+
virtual void get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) = 0;
125125

126126
static td::actor::ActorOwn<Adnl> create(std::string db, td::actor::ActorId<keyring::Keyring> keyring);
127127

tl/generate/scheme/ton_api.tl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ engine.validator.setStateSerializerEnabled enabled:Bool = engine.validator.Succe
764764
engine.validator.setCollatorOptionsJson json:string = engine.validator.Success;
765765
engine.validator.getCollatorOptionsJson = engine.validator.JsonConfig;
766766

767-
engine.validator.getAdnlStats = adnl.Stats;
767+
engine.validator.getAdnlStats all:Bool = adnl.Stats;
768768
engine.validator.getActorTextStats = engine.validator.TextStats;
769769

770770
---types---

tl/generate/scheme/ton_api.tlo

28 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)