Skip to content

Commit a6449ab

Browse files
Adnl optimizations (#1620)
* Remove AdnlStaticNodesManager * Remove AdnlPeer --------- Co-authored-by: EmelyanenkoK <[email protected]>
1 parent 9e5109d commit a6449ab

File tree

10 files changed

+140
-466
lines changed

10 files changed

+140
-466
lines changed

adnl/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ set(ADNL_HEADERS
2323
adnl-peer.h
2424
adnl-peer.hpp
2525
adnl-query.h
26-
adnl-static-nodes.h
27-
adnl-static-nodes.hpp
2826
adnl-proxy-types.h
2927
adnl-proxy-types.hpp
3028
adnl.h
@@ -46,7 +44,6 @@ set(ADNL_SOURCE
4644
adnl-peer.cpp
4745
adnl-query.cpp
4846
adnl-channel.cpp
49-
adnl-static-nodes.cpp
5047
adnl-proxy-types.cpp
5148
utils.cpp
5249
${ADNL_HEADERS}

adnl/adnl-peer-table.cpp

Lines changed: 116 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,42 @@ void AdnlPeerTableImpl::receive_packet(td::IPAddress addr, AdnlCategoryMask cat_
8484
<< " (len=" << (data.size() + 32) << ")";
8585
}
8686

87+
void AdnlPeerTableImpl::update_id(AdnlPeerTableImpl::PeerInfo &peer_info, AdnlNodeIdFull &&peer_id) {
88+
if (peer_info.peer_id.empty()) {
89+
peer_info.peer_id = std::move(peer_id);
90+
for (auto &e: peer_info.peers) {
91+
td::actor::send_closure(e.second, &AdnlPeerPair::update_peer_id, peer_info.peer_id);
92+
}
93+
}
94+
}
95+
96+
td::actor::ActorOwn<AdnlPeerPair> &AdnlPeerTableImpl::get_peer_pair(
97+
AdnlNodeIdShort peer_id, AdnlPeerTableImpl::PeerInfo &peer_info,
98+
AdnlNodeIdShort local_id, AdnlPeerTableImpl::LocalIdInfo &local_id_info) {
99+
auto it = peer_info.peers.find(local_id);
100+
if (it == peer_info.peers.end()) {
101+
it = peer_info.peers.emplace(local_id,
102+
AdnlPeerPair::create(network_manager_, actor_id(this),
103+
local_id_info.mode, local_id_info.local_id.get(),
104+
dht_node_, local_id, peer_id))
105+
.first;
106+
if (!peer_info.peer_id.empty()) {
107+
td::actor::send_closure(it->second, &AdnlPeerPair::update_peer_id, peer_info.peer_id);
108+
}
109+
}
110+
return it->second;
111+
}
112+
87113
void AdnlPeerTableImpl::receive_decrypted_packet(AdnlNodeIdShort dst, AdnlPacket packet, td::uint64 serialized_size) {
88114
packet.run_basic_checks().ensure();
89115

90116
if (!packet.inited_from_short()) {
91117
VLOG(ADNL_INFO) << this << ": dropping IN message [?->" << dst << "]: destination not set";
92118
return;
93119
}
120+
AdnlNodeIdShort src = packet.from_short();
94121

95-
auto it = peers_.find(packet.from_short());
122+
auto it = peers_.find(src);
96123
if (it == peers_.end()) {
97124
if (!packet.inited_from()) {
98125
VLOG(ADNL_NOTICE) << this << ": dropping IN message [" << packet.from_short() << "->" << dst
@@ -105,11 +132,7 @@ void AdnlPeerTableImpl::receive_decrypted_packet(AdnlNodeIdShort dst, AdnlPacket
105132
return;
106133
}
107134

108-
it = peers_
109-
.emplace(packet.from_short(),
110-
AdnlPeer::create(network_manager_, actor_id(this), dht_node_, packet.from_short()))
111-
.first;
112-
CHECK(it != peers_.end());
135+
it = peers_.try_emplace(src).first;
113136
}
114137

115138
auto it2 = local_ids_.find(dst);
@@ -118,8 +141,13 @@ void AdnlPeerTableImpl::receive_decrypted_packet(AdnlNodeIdShort dst, AdnlPacket
118141
<< "]: unknown dst (but how did we decrypt message?)";
119142
return;
120143
}
121-
td::actor::send_closure(it->second, &AdnlPeer::receive_packet, dst, it2->second.mode, it2->second.local_id.get(),
122-
std::move(packet), serialized_size);
144+
145+
if (packet.inited_from()) {
146+
update_id(it->second, packet.from());
147+
}
148+
149+
td::actor::send_closure(get_peer_pair(src, it->second, dst, it2->second),
150+
&AdnlPeerPair::receive_packet, std::move(packet), serialized_size);
123151
}
124152

125153
void AdnlPeerTableImpl::add_peer(AdnlNodeIdShort local_id, AdnlNodeIdFull id, AdnlAddressList addr_list) {
@@ -129,40 +157,36 @@ void AdnlPeerTableImpl::add_peer(AdnlNodeIdShort local_id, AdnlNodeIdFull id, Ad
129157
auto it2 = local_ids_.find(local_id);
130158
CHECK(it2 != local_ids_.end());
131159

132-
auto it = peers_.find(id_short);
133-
if (it == peers_.end()) {
134-
it = peers_.emplace(id_short, AdnlPeer::create(network_manager_, actor_id(this), dht_node_, id_short)).first;
135-
CHECK(it != peers_.end());
136-
}
137-
td::actor::send_closure(it->second, &AdnlPeer::update_id, std::move(id));
160+
auto &peer_info = peers_[id_short];
161+
update_id(peer_info, std::move(id));
138162
if (!addr_list.empty()) {
139-
td::actor::send_closure(it->second, &AdnlPeer::update_addr_list, local_id, it2->second.mode,
140-
it2->second.local_id.get(), std::move(addr_list));
163+
td::actor::send_closure(get_peer_pair(id_short, peer_info, local_id, it2->second),
164+
&AdnlPeerPair::update_addr_list, std::move(addr_list));
141165
}
142166
}
143167

144168
void AdnlPeerTableImpl::add_static_nodes_from_config(AdnlNodesList nodes) {
145-
for (auto &it : nodes.nodes()) {
146-
add_static_node(it);
169+
for (auto &node : nodes.nodes()) {
170+
auto id_short = node.compute_short_id();
171+
VLOG(ADNL_INFO) << "[staticnodes] adding static node " << id_short;
172+
static_nodes_.emplace(id_short, std::move(node));
147173
}
148174
}
149175

150176
void AdnlPeerTableImpl::send_message_in(AdnlNodeIdShort src, AdnlNodeIdShort dst, AdnlMessage message,
151177
td::uint32 flags) {
152-
auto it = peers_.find(dst);
153-
154-
if (it == peers_.end()) {
155-
it = peers_.emplace(dst, AdnlPeer::create(network_manager_, actor_id(this), dht_node_, dst)).first;
156-
}
178+
auto &peer_info = peers_[dst];
157179

158180
auto it2 = local_ids_.find(src);
159181
if (it2 == local_ids_.end()) {
160182
LOG(ERROR) << this << ": dropping OUT message [" << src << "->" << dst << "]: unknown src";
161183
return;
162184
}
163185

164-
td::actor::send_closure(it->second, &AdnlPeer::send_one_message, src, it2->second.mode, it2->second.local_id.get(),
165-
OutboundAdnlMessage{std::move(message), flags});
186+
std::vector<OutboundAdnlMessage> messages;
187+
messages.push_back(OutboundAdnlMessage{std::move(message), flags});
188+
td::actor::send_closure(get_peer_pair(dst, peer_info, src, it2->second),
189+
&AdnlPeerPair::send_messages, std::move(messages));
166190
}
167191

168192
void AdnlPeerTableImpl::answer_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, AdnlQueryId query_id,
@@ -182,20 +206,16 @@ void AdnlPeerTableImpl::send_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, std
182206
VLOG(ADNL_WARNING) << "DUMP: " << td::buffer_to_hex(data.as_slice().truncate(128));
183207
return;
184208
}
185-
auto it = peers_.find(dst);
186-
187-
if (it == peers_.end()) {
188-
it = peers_.emplace(dst, AdnlPeer::create(network_manager_, actor_id(this), dht_node_, dst)).first;
189-
}
209+
auto &peer_info = peers_[dst];
190210

191211
auto it2 = local_ids_.find(src);
192212
if (it2 == local_ids_.end()) {
193213
LOG(ERROR) << this << ": dropping OUT message [" << src << "->" << dst << "]: unknown src";
194214
return;
195215
}
196216

197-
td::actor::send_closure(it->second, &AdnlPeer::send_query, src, it2->second.mode, it2->second.local_id.get(), name,
198-
std::move(promise), timeout, std::move(data), 0);
217+
td::actor::send_closure(get_peer_pair(dst, peer_info, src, it2->second),
218+
&AdnlPeerPair::send_query, name, std::move(promise), timeout, std::move(data), 0);
199219
}
200220

201221
void AdnlPeerTableImpl::add_id_ex(AdnlNodeIdFull id, AdnlAddressList addr_list, td::uint8 cat, td::uint32 mode) {
@@ -247,8 +267,10 @@ void AdnlPeerTableImpl::unsubscribe(AdnlNodeIdShort dst, std::string prefix) {
247267
void AdnlPeerTableImpl::register_dht_node(td::actor::ActorId<dht::Dht> dht_node) {
248268
dht_node_ = dht_node;
249269

250-
for (auto &peer : peers_) {
251-
td::actor::send_closure(peer.second, &AdnlPeer::update_dht_node, dht_node_);
270+
for (auto &e : peers_) {
271+
for (auto &e2 : e.second.peers) {
272+
td::actor::send_closure(e2.second, &AdnlPeerPair::update_dht_node, dht_node_);
273+
}
252274
}
253275
for (auto &local_id : local_ids_) {
254276
td::actor::send_closure(local_id.second.local_id, &AdnlLocalId::update_dht_node, dht_node_);
@@ -332,8 +354,6 @@ void AdnlPeerTableImpl::get_addr_list_from_db(AdnlNodeIdShort local_id, AdnlNode
332354

333355
AdnlPeerTableImpl::AdnlPeerTableImpl(std::string db_root, td::actor::ActorId<keyring::Keyring> keyring) {
334356
keyring_ = keyring;
335-
static_nodes_manager_ = AdnlStaticNodesManager::create();
336-
337357
if (!db_root.empty()) {
338358
db_ = AdnlDb::create(db_root + "/adnl");
339359
}
@@ -382,7 +402,64 @@ void AdnlPeerTableImpl::get_conn_ip_str(AdnlNodeIdShort l_id, AdnlNodeIdShort p_
382402
promise.set_value("undefined");
383403
return;
384404
}
385-
td::actor::send_closure(it->second, &AdnlPeer::get_conn_ip_str, l_id, std::move(promise));
405+
auto it2 = it->second.peers.find(l_id);
406+
if (it2 == it->second.peers.end()) {
407+
promise.set_value("undefined");
408+
return;
409+
}
410+
td::actor::send_closure(it2->second, &AdnlPeerPair::get_conn_ip_str, std::move(promise));
411+
}
412+
413+
void AdnlPeerTableImpl::get_stats_peer(AdnlNodeIdShort peer_id, AdnlPeerTableImpl::PeerInfo &peer_info, bool all,
414+
td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise) {
415+
class Cb : public td::actor::Actor {
416+
public:
417+
explicit Cb(td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise)
418+
: promise_(std::move(promise)) {
419+
}
420+
421+
void got_peer_pair_stats(tl_object_ptr<ton_api::adnl_stats_peerPair> peer_pair) {
422+
if (peer_pair) {
423+
result_.push_back(std::move(peer_pair));
424+
}
425+
dec_pending();
426+
}
427+
428+
void inc_pending() {
429+
++pending_;
430+
}
431+
432+
void dec_pending() {
433+
CHECK(pending_ > 0);
434+
--pending_;
435+
if (pending_ == 0) {
436+
promise_.set_result(std::move(result_));
437+
stop();
438+
}
439+
}
440+
441+
private:
442+
td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise_;
443+
size_t pending_ = 1;
444+
std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>> result_;
445+
};
446+
auto callback = td::actor::create_actor<Cb>("adnlpeerstats", std::move(promise)).release();
447+
448+
for (auto &[local_id, peer_pair] : peer_info.peers) {
449+
td::actor::send_closure(callback, &Cb::inc_pending);
450+
td::actor::send_closure(peer_pair, &AdnlPeerPair::get_stats, all,
451+
[local_id = local_id, peer_id = peer_id,
452+
callback](td::Result<tl_object_ptr<ton_api::adnl_stats_peerPair>> R) {
453+
if (R.is_error()) {
454+
VLOG(ADNL_NOTICE) << "failed to get stats for peer pair " << peer_id << "->" << local_id
455+
<< " : " << R.move_as_error();
456+
td::actor::send_closure(callback, &Cb::dec_pending);
457+
} else {
458+
td::actor::send_closure(callback, &Cb::got_peer_pair_stats, R.move_as_ok());
459+
}
460+
});
461+
}
462+
td::actor::send_closure(callback, &Cb::dec_pending);
386463
}
387464

388465
void AdnlPeerTableImpl::get_stats(bool all, td::Promise<tl_object_ptr<ton_api::adnl_stats>> promise) {
@@ -453,8 +530,8 @@ void AdnlPeerTableImpl::get_stats(bool all, td::Promise<tl_object_ptr<ton_api::a
453530
}
454531
for (auto &[id, peer] : peers_) {
455532
td::actor::send_closure(callback, &Cb::inc_pending);
456-
td::actor::send_closure(
457-
peer, &AdnlPeer::get_stats, all,
533+
get_stats_peer(
534+
id, peer, all,
458535
[id = id, callback](td::Result<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> R) {
459536
if (R.is_error()) {
460537
VLOG(ADNL_NOTICE) << "failed to get stats for peer " << id << " : " << R.move_as_error();

adnl/adnl-peer-table.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ class AdnlPeerTable : public Adnl {
9797
td::actor::ActorId<AdnlChannel> channel) = 0;
9898
virtual void unregister_channel(AdnlChannelIdShort id) = 0;
9999

100-
virtual void add_static_node(AdnlNode node) = 0;
101-
virtual void del_static_node(AdnlNodeIdShort id) = 0;
102-
virtual void get_static_node(AdnlNodeIdShort id, td::Promise<AdnlNode> promise) = 0;
100+
virtual td::Result<AdnlNode> get_static_node(AdnlNodeIdShort id) = 0;
103101

104102
virtual void write_new_addr_list_to_db(AdnlNodeIdShort local_id, AdnlNodeIdShort peer_id, AdnlDbItem node,
105103
td::Promise<td::Unit> promise) = 0;

adnl/adnl-peer-table.hpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "adnl-local-id.h"
2929
#include "adnl-query.h"
3030
#include "utils.hpp"
31-
#include "adnl-static-nodes.h"
3231
#include "adnl-ext-server.h"
3332
#include "adnl-address-list.h"
3433

@@ -86,15 +85,12 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
8685
void get_addr_list_from_db(AdnlNodeIdShort local_id, AdnlNodeIdShort peer_id,
8786
td::Promise<AdnlDbItem> promise) override;
8887

89-
void add_static_node(AdnlNode node) override {
90-
CHECK(!static_nodes_manager_.empty());
91-
td::actor::send_closure(static_nodes_manager_, &AdnlStaticNodesManager::add_node, std::move(node));
92-
}
93-
void del_static_node(AdnlNodeIdShort id) override {
94-
td::actor::send_closure(static_nodes_manager_, &AdnlStaticNodesManager::del_node, id);
95-
}
96-
void get_static_node(AdnlNodeIdShort id, td::Promise<AdnlNode> promise) override {
97-
td::actor::send_closure(static_nodes_manager_, &AdnlStaticNodesManager::get_node, id, std::move(promise));
88+
td::Result<AdnlNode> get_static_node(AdnlNodeIdShort id) override {
89+
auto it = static_nodes_.find(id);
90+
if (it == static_nodes_.end()) {
91+
return td::Status::Error(ErrorCode::notready, "static node not found");
92+
}
93+
return it->second;
9894
}
9995
void deliver(AdnlNodeIdShort src, AdnlNodeIdShort dst, td::BufferSlice data) override;
10096
void deliver_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, td::BufferSlice data,
@@ -116,20 +112,26 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
116112
}
117113

118114
private:
115+
struct PeerInfo {
116+
AdnlNodeIdFull peer_id;
117+
std::map<AdnlNodeIdShort, td::actor::ActorOwn<AdnlPeerPair>> peers;
118+
};
119+
119120
struct LocalIdInfo {
120121
td::actor::ActorOwn<AdnlLocalId> local_id;
121122
td::uint8 cat;
122123
td::uint32 mode;
123124
};
125+
124126
td::actor::ActorId<keyring::Keyring> keyring_;
125127

126128
td::actor::ActorId<AdnlNetworkManager> network_manager_;
127129
td::actor::ActorId<dht::Dht> dht_node_;
128-
td::actor::ActorOwn<AdnlStaticNodesManager> static_nodes_manager_;
130+
std::map<AdnlNodeIdShort, AdnlNode> static_nodes_;
129131

130132
void deliver_one_message(AdnlNodeIdShort src, AdnlNodeIdShort dst, AdnlMessage message);
131133

132-
std::map<AdnlNodeIdShort, td::actor::ActorOwn<AdnlPeer>> peers_;
134+
std::map<AdnlNodeIdShort, PeerInfo> peers_;
133135
std::map<AdnlNodeIdShort, LocalIdInfo> local_ids_;
134136
std::map<AdnlChannelIdShort, std::pair<td::actor::ActorId<AdnlChannel>, td::uint8>> channels_;
135137

@@ -140,6 +142,11 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
140142
AdnlNodeIdShort proxy_addr_;
141143
//std::map<td::uint64, td::actor::ActorId<AdnlQuery>> out_queries_;
142144
//td::uint64 last_query_id_ = 1;
145+
146+
static void update_id(PeerInfo &peer_info, AdnlNodeIdFull &&peer_id);
147+
td::actor::ActorOwn<AdnlPeerPair> &get_peer_pair(AdnlNodeIdShort peer_id, PeerInfo &peer_info, AdnlNodeIdShort local_id, LocalIdInfo &local_id_info);
148+
static void get_stats_peer(AdnlNodeIdShort peer_id, PeerInfo &peer_info, bool all,
149+
td::Promise<std::vector<tl_object_ptr<ton_api::adnl_stats_peerPair>>> promise);
143150
};
144151

145152
inline td::StringBuilder &operator<<(td::StringBuilder &sb, const AdnlPeerTableImpl::PrintId &id) {

0 commit comments

Comments
 (0)