Skip to content

Commit ba76f14

Browse files
author
ton
committed
vm: bugfixes
1 parent 27aaa11 commit ba76f14

30 files changed

+394
-176
lines changed

adnl/adnl-address-list.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class AdnlAddressList {
9191
void update(td::IPAddress addr);
9292
bool public_only() const;
9393
td::uint32 size() const {
94-
return static_cast<td::uint32>(addrs_.size());
94+
return td::narrow_cast<td::uint32>(addrs_.size());
9595
}
9696
td::uint32 serialized_size() const;
9797
tl_object_ptr<ton_api::adnl_addressList> tl() const;

adnl/adnl-local-id.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,20 @@ void AdnlLocalId::publish_address_list() {
175175
std::move(P));
176176
}
177177

178-
AdnlLocalId::AdnlLocalId(AdnlNodeIdFull id, AdnlAddressList addr_list, td::actor::ActorId<AdnlPeerTable> peer_table,
179-
td::actor::ActorId<keyring::Keyring> keyring, td::actor::ActorId<dht::Dht> dht_node) {
180-
id_ = std::move(id);
178+
AdnlLocalId::AdnlLocalId(AdnlNodeIdFull id, AdnlAddressList addr_list, td::uint32 mode,
179+
td::actor::ActorId<AdnlPeerTable> peer_table, td::actor::ActorId<keyring::Keyring> keyring,
180+
td::actor::ActorId<dht::Dht> dht_node)
181+
: peer_table_(std::move(peer_table))
182+
, keyring_(std::move(keyring))
183+
, dht_node_(std::move(dht_node))
184+
, addr_list_(std::move(addr_list))
185+
, id_(std::move(id))
186+
, mode_(mode) {
181187
short_id_ = id_.compute_short_id();
182-
addr_list_ = std::move(addr_list);
183188
if (!addr_list_.empty()) {
184189
addr_list_.set_reinit_date(Adnl::adnl_start_time());
185190
addr_list_.set_version(static_cast<td::int32>(td::Clocks::system()));
186191
}
187-
peer_table_ = peer_table;
188-
keyring_ = keyring;
189-
dht_node_ = dht_node;
190192

191193
VLOG(ADNL_INFO) << this << ": created local id " << short_id_;
192194
}

adnl/adnl-local-id.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,20 @@ class AdnlLocalId : public td::actor::Actor {
6767
void sign_batch_async(std::vector<td::BufferSlice> data,
6868
td::Promise<std::vector<td::Result<td::BufferSlice>>> promise);
6969

70-
AdnlLocalId(AdnlNodeIdFull id, AdnlAddressList addr_list, td::actor::ActorId<AdnlPeerTable> peer_table,
71-
td::actor::ActorId<keyring::Keyring> keyring, td::actor::ActorId<dht::Dht> dht_node);
70+
AdnlLocalId(AdnlNodeIdFull id, AdnlAddressList addr_list, td::uint32 mode,
71+
td::actor::ActorId<AdnlPeerTable> peer_table, td::actor::ActorId<keyring::Keyring> keyring,
72+
td::actor::ActorId<dht::Dht> dht_node);
7273

7374
void start_up() override;
7475
void alarm() override;
7576

7677
void update_packet(AdnlPacket packet, bool update_id, bool sign, td::int32 update_addr_list_if,
7778
td::int32 update_priority_addr_list_if, td::Promise<AdnlPacket> promise);
7879

80+
td::uint32 get_mode() {
81+
return mode_;
82+
}
83+
7984
struct PrintId {
8085
AdnlNodeIdShort id;
8186
};
@@ -94,6 +99,8 @@ class AdnlLocalId : public td::actor::Actor {
9499
AdnlNodeIdFull id_;
95100
AdnlNodeIdShort short_id_;
96101

102+
td::uint32 mode_;
103+
97104
void publish_address_list();
98105
};
99106

adnl/adnl-peer-table.cpp

Lines changed: 53 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ void AdnlPeerTableImpl::receive_packet(td::IPAddress addr, td::BufferSlice data)
5858
AdnlNodeIdShort dst{data.as_slice().truncate(32)};
5959
data.confirm_read(32);
6060

61-
auto it = local_ids_own_.find(dst);
62-
if (it != local_ids_own_.end()) {
63-
td::actor::send_closure(it->second, &AdnlLocalId::receive, addr, std::move(data));
61+
auto it = local_ids_.find(dst);
62+
if (it != local_ids_.end()) {
63+
td::actor::send_closure(it->second.first, &AdnlLocalId::receive, addr, std::move(data));
6464
return;
6565
}
6666

@@ -103,21 +103,22 @@ void AdnlPeerTableImpl::receive_decrypted_packet(AdnlNodeIdShort dst, AdnlPacket
103103
CHECK(it != peers_.end());
104104
}
105105

106-
auto it2 = local_ids_own_.find(dst);
107-
if (it2 == local_ids_own_.end()) {
106+
auto it2 = local_ids_.find(dst);
107+
if (it2 == local_ids_.end()) {
108108
VLOG(ADNL_ERROR) << this << ": dropping IN message [" << packet.from_short() << "->" << dst
109109
<< "]: unknown dst (but how did we decrypt message?)";
110110
return;
111111
}
112-
td::actor::send_closure(it->second, &AdnlPeer::receive_packet, dst, it2->second.get(), std::move(packet));
112+
td::actor::send_closure(it->second, &AdnlPeer::receive_packet, dst, it2->second.second, it2->second.first.get(),
113+
std::move(packet));
113114
}
114115

115116
void AdnlPeerTableImpl::add_peer(AdnlNodeIdShort local_id, AdnlNodeIdFull id, AdnlAddressList addr_list) {
116117
auto id_short = id.compute_short_id();
117118
VLOG(ADNL_DEBUG) << this << ": adding peer " << id_short << " for local id " << local_id;
118119

119-
auto it2 = local_ids_own_.find(local_id);
120-
CHECK(it2 != local_ids_own_.end());
120+
auto it2 = local_ids_.find(local_id);
121+
CHECK(it2 != local_ids_.end());
121122

122123
auto it = peers_.find(id_short);
123124
if (it == peers_.end()) {
@@ -126,7 +127,8 @@ void AdnlPeerTableImpl::add_peer(AdnlNodeIdShort local_id, AdnlNodeIdFull id, Ad
126127
}
127128
td::actor::send_closure(it->second, &AdnlPeer::update_id, std::move(id));
128129
if (!addr_list.empty()) {
129-
td::actor::send_closure(it->second, &AdnlPeer::update_addr_list, local_id, it2->second.get(), std::move(addr_list));
130+
td::actor::send_closure(it->second, &AdnlPeer::update_addr_list, local_id, it2->second.second,
131+
it2->second.first.get(), std::move(addr_list));
130132
}
131133
}
132134

@@ -143,13 +145,14 @@ void AdnlPeerTableImpl::send_message_in(AdnlNodeIdShort src, AdnlNodeIdShort dst
143145
it = peers_.emplace(dst, AdnlPeer::create(network_manager_, actor_id(this), dht_node_, dst)).first;
144146
}
145147

146-
auto it2 = local_ids_own_.find(src);
147-
if (it2 == local_ids_own_.end()) {
148+
auto it2 = local_ids_.find(src);
149+
if (it2 == local_ids_.end()) {
148150
LOG(ERROR) << this << ": dropping OUT message [" << src << "->" << dst << "]: unknown src";
149151
return;
150152
}
151153

152-
td::actor::send_closure(it->second, &AdnlPeer::send_one_message, src, it2->second.get(), std::move(message));
154+
td::actor::send_closure(it->second, &AdnlPeer::send_one_message, src, it2->second.second, it2->second.first.get(),
155+
std::move(message));
153156
}
154157

155158
void AdnlPeerTableImpl::answer_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, AdnlQueryId query_id,
@@ -175,59 +178,61 @@ void AdnlPeerTableImpl::send_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, std
175178
it = peers_.emplace(dst, AdnlPeer::create(network_manager_, actor_id(this), dht_node_, dst)).first;
176179
}
177180

178-
auto it2 = local_ids_own_.find(src);
179-
if (it2 == local_ids_own_.end()) {
181+
auto it2 = local_ids_.find(src);
182+
if (it2 == local_ids_.end()) {
180183
LOG(ERROR) << this << ": dropping OUT message [" << src << "->" << dst << "]: unknown src";
181184
return;
182185
}
183186

184-
td::actor::send_closure(it->second, &AdnlPeer::send_query, src, it2->second.get(), name, std::move(promise), timeout,
185-
std::move(data));
187+
td::actor::send_closure(it->second, &AdnlPeer::send_query, src, it2->second.second, it2->second.first.get(), name,
188+
std::move(promise), timeout, std::move(data));
186189
}
187190

188-
void AdnlPeerTableImpl::add_id(AdnlNodeIdFull id, AdnlAddressList addr_list) {
191+
void AdnlPeerTableImpl::add_id_ex(AdnlNodeIdFull id, AdnlAddressList addr_list, td::uint32 mode) {
189192
auto a = id.compute_short_id();
190193
VLOG(ADNL_INFO) << "adnl: adding local id " << a;
191194

192-
auto it = local_ids_own_.find(a);
195+
auto it = local_ids_.find(a);
193196

194-
if (it != local_ids_own_.end()) {
195-
td::actor::send_closure(it->second, &AdnlLocalId::update_address_list, std::move(addr_list));
197+
if (it != local_ids_.end()) {
198+
td::actor::send_closure(it->second.first, &AdnlLocalId::update_address_list, std::move(addr_list));
196199
} else {
197-
local_ids_own_[a] = td::actor::create_actor<AdnlLocalId>("localid", std::move(id), std::move(addr_list),
198-
actor_id(this), keyring_, dht_node_);
200+
local_ids_.emplace(
201+
a, std::make_pair(td::actor::create_actor<AdnlLocalId>("localid", std::move(id), std::move(addr_list), mode,
202+
actor_id(this), keyring_, dht_node_),
203+
mode));
199204
}
200205
}
201206

202207
void AdnlPeerTableImpl::del_id(AdnlNodeIdShort id, td::Promise<td::Unit> promise) {
203208
VLOG(ADNL_INFO) << "adnl: deleting local id " << id;
204-
local_ids_own_.erase(id);
209+
local_ids_.erase(id);
205210
promise.set_value(td::Unit());
206211
}
207212

208213
void AdnlPeerTableImpl::subscribe(AdnlNodeIdShort dst, std::string prefix, std::unique_ptr<Callback> callback) {
209-
auto it = local_ids_own_.find(dst);
210-
LOG_CHECK(it != local_ids_own_.end()) << "dst=" << dst;
214+
auto it = local_ids_.find(dst);
215+
LOG_CHECK(it != local_ids_.end()) << "dst=" << dst;
211216

212-
td::actor::send_closure(it->second, &AdnlLocalId::subscribe, prefix, std::move(callback));
217+
td::actor::send_closure(it->second.first, &AdnlLocalId::subscribe, prefix, std::move(callback));
213218
}
214219

215220
void AdnlPeerTableImpl::unsubscribe(AdnlNodeIdShort dst, std::string prefix) {
216-
auto it = local_ids_own_.find(dst);
221+
auto it = local_ids_.find(dst);
217222

218-
if (it != local_ids_own_.end()) {
219-
td::actor::send_closure(it->second, &AdnlLocalId::unsubscribe, prefix);
223+
if (it != local_ids_.end()) {
224+
td::actor::send_closure(it->second.first, &AdnlLocalId::unsubscribe, prefix);
220225
}
221226
}
222227

223228
void AdnlPeerTableImpl::register_dht_node(td::actor::ActorId<dht::Dht> dht_node) {
224229
dht_node_ = dht_node;
225230

226-
for (auto it = peers_.begin(); it != peers_.end(); it++) {
227-
td::actor::send_closure(it->second, &AdnlPeer::update_dht_node, dht_node_);
231+
for (auto &peer : peers_) {
232+
td::actor::send_closure(peer.second, &AdnlPeer::update_dht_node, dht_node_);
228233
}
229-
for (auto it = local_ids_own_.begin(); it != local_ids_own_.end(); it++) {
230-
td::actor::send_closure(it->second, &AdnlLocalId::update_dht_node, dht_node_);
234+
for (auto &local_id : local_ids_) {
235+
td::actor::send_closure(local_id.second.first, &AdnlLocalId::update_dht_node, dht_node_);
231236
}
232237
}
233238

@@ -251,21 +256,21 @@ void AdnlPeerTableImpl::register_network_manager(td::actor::ActorId<AdnlNetworkM
251256
}
252257

253258
void AdnlPeerTableImpl::get_addr_list(AdnlNodeIdShort id, td::Promise<AdnlAddressList> promise) {
254-
auto it = local_ids_own_.find(id);
255-
if (it == local_ids_own_.end()) {
259+
auto it = local_ids_.find(id);
260+
if (it == local_ids_.end()) {
256261
promise.set_error(td::Status::Error(ErrorCode::notready));
257262
return;
258263
}
259-
td::actor::send_closure(it->second, &AdnlLocalId::get_addr_list_async, std::move(promise));
264+
td::actor::send_closure(it->second.first, &AdnlLocalId::get_addr_list_async, std::move(promise));
260265
}
261266

262267
void AdnlPeerTableImpl::get_self_node(AdnlNodeIdShort id, td::Promise<AdnlNode> promise) {
263-
auto it = local_ids_own_.find(id);
264-
if (it == local_ids_own_.end()) {
268+
auto it = local_ids_.find(id);
269+
if (it == local_ids_.end()) {
265270
promise.set_error(td::Status::Error(ErrorCode::notready));
266271
return;
267272
}
268-
td::actor::send_closure(it->second, &AdnlLocalId::get_self_node, std::move(promise));
273+
td::actor::send_closure(it->second.first, &AdnlLocalId::get_self_node, std::move(promise));
269274
}
270275

271276
void AdnlPeerTableImpl::register_channel(AdnlChannelIdShort id, td::actor::ActorId<AdnlChannel> channel) {
@@ -309,16 +314,16 @@ AdnlPeerTableImpl::AdnlPeerTableImpl(std::string db_root, td::actor::ActorId<key
309314
}
310315

311316
void AdnlPeerTableImpl::deliver(AdnlNodeIdShort src, AdnlNodeIdShort dst, td::BufferSlice data) {
312-
auto it = local_ids_own_.find(dst);
313-
if (it != local_ids_own_.end()) {
314-
td::actor::send_closure(it->second, &AdnlLocalId::deliver, src, std::move(data));
317+
auto it = local_ids_.find(dst);
318+
if (it != local_ids_.end()) {
319+
td::actor::send_closure(it->second.first, &AdnlLocalId::deliver, src, std::move(data));
315320
}
316321
}
317322
void AdnlPeerTableImpl::deliver_query(AdnlNodeIdShort src, AdnlNodeIdShort dst, td::BufferSlice data,
318323
td::Promise<td::BufferSlice> promise) {
319-
auto it = local_ids_own_.find(dst);
320-
if (it != local_ids_own_.end()) {
321-
td::actor::send_closure(it->second, &AdnlLocalId::deliver_query, src, std::move(data), std::move(promise));
324+
auto it = local_ids_.find(dst);
325+
if (it != local_ids_.end()) {
326+
td::actor::send_closure(it->second.first, &AdnlLocalId::deliver_query, src, std::move(data), std::move(promise));
322327
} else {
323328
LOG(WARNING) << "deliver query: unknown dst " << dst;
324329
promise.set_error(td::Status::Error(ErrorCode::notready, "cannot deliver: unknown DST"));
@@ -327,9 +332,9 @@ void AdnlPeerTableImpl::deliver_query(AdnlNodeIdShort src, AdnlNodeIdShort dst,
327332

328333
void AdnlPeerTableImpl::decrypt_message(AdnlNodeIdShort dst, td::BufferSlice data,
329334
td::Promise<td::BufferSlice> promise) {
330-
auto it = local_ids_own_.find(dst);
331-
if (it != local_ids_own_.end()) {
332-
td::actor::send_closure(it->second, &AdnlLocalId::decrypt_message, std::move(data), std::move(promise));
335+
auto it = local_ids_.find(dst);
336+
if (it != local_ids_.end()) {
337+
td::actor::send_closure(it->second.first, &AdnlLocalId::decrypt_message, std::move(data), std::move(promise));
333338
} else {
334339
LOG(WARNING) << "decrypt message: unknown dst " << dst;
335340
promise.set_error(td::Status::Error(ErrorCode::notready, "cannot decrypt: unknown DST"));

adnl/adnl-peer-table.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
6161
td::Timestamp timeout, td::BufferSlice data, td::uint64 max_answer_size) override {
6262
send_query(src, dst, name, std::move(promise), timeout, std::move(data));
6363
}
64-
void add_id(AdnlNodeIdFull id, AdnlAddressList addr_list) override;
64+
void add_id_ex(AdnlNodeIdFull id, AdnlAddressList addr_list, td::uint32 mode) override;
6565
void del_id(AdnlNodeIdShort id, td::Promise<td::Unit> promise) override;
6666
void subscribe(AdnlNodeIdShort dst, std::string prefix, std::unique_ptr<Callback> callback) override;
6767
void unsubscribe(AdnlNodeIdShort dst, std::string prefix) override;
@@ -111,7 +111,7 @@ class AdnlPeerTableImpl : public AdnlPeerTable {
111111
void deliver_one_message(AdnlNodeIdShort src, AdnlNodeIdShort dst, AdnlMessage message);
112112

113113
std::map<AdnlNodeIdShort, td::actor::ActorOwn<AdnlPeer>> peers_;
114-
std::map<AdnlNodeIdShort, td::actor::ActorOwn<AdnlLocalId>> local_ids_own_;
114+
std::map<AdnlNodeIdShort, std::pair<td::actor::ActorOwn<AdnlLocalId>, td::uint32>> local_ids_;
115115
std::map<AdnlChannelIdShort, td::actor::ActorId<AdnlChannel>> channels_;
116116

117117
td::actor::ActorOwn<AdnlDb> db_;

0 commit comments

Comments
 (0)