forked from ton-blockchain/ton
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPeerActor.h
112 lines (81 loc) · 2.84 KB
/
PeerActor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once
#include "Bitset.h"
#include "PeerState.h"
#include "SharedState.h"
#include "td/utils/optional.h"
#include "auto/tl/ton_api.h"
namespace ton {
class PeerActor : public td::actor::Actor {
public:
class Callback {
public:
virtual ~Callback() {
}
virtual void register_self(td::actor::ActorId<PeerActor> self) = 0;
virtual void send_query(td::uint64 query_id, td::BufferSlice query) = 0;
};
PeerActor(td::unique_ptr<Callback> callback, td::SharedState<PeerState> state);
void execute_query(td::BufferSlice query, td::Promise<td::BufferSlice> promise);
void on_query_result(td::uint64 query_id, td::Result<td::BufferSlice> r_answer);
private:
td::unique_ptr<Callback> callback_;
td::SharedState<PeerState> state_;
bool need_notify_node_{false};
td::uint64 next_query_id_{0};
// ping
td::Timestamp next_ping_at_;
td::optional<td::uint64> ping_query_id_;
td::Timestamp wait_pong_till_;
// startSession
td::uint64 node_session_id_;
td::Bitset peer_have_pieces_;
// update
td::optional<td::uint64> peer_session_id_;
td::optional<td::uint64> update_query_id_;
bool peer_is_inited_{false};
td::uint32 node_seqno_{0};
td::Bitset have_pieces_;
std::vector<PartId> have_pieces_list_;
td::uint32 peer_seqno_{0};
// update state
struct UpdateState {
td::optional<td::uint64> query_id;
PeerState::State state;
};
UpdateState update_state_query_;
// getPiece
struct NodePieceQuery {
td::optional<td::uint64> query_id;
};
std::map<PartId, NodePieceQuery> node_get_piece_;
struct PeerPieceQuery {
td::Promise<td::BufferSlice> promise;
};
std::map<PartId, PeerPieceQuery> peer_get_piece_;
void start_up() override;
void loop() override;
void loop_notify_node();
void loop_pong();
void execute_ping(td::uint64 session_id, td::Promise<td::BufferSlice> promise);
void on_ping_result(td::Result<td::BufferSlice> r_answer);
void on_pong();
void loop_ping();
void loop_update_init();
void loop_update_pieces();
void update_have_pieces();
void loop_update_state();
td::BufferSlice create_update_query(ton::tl_object_ptr<ton::ton_api::storage_Update> update);
void loop_node_get_piece();
void loop_peer_get_piece();
void execute_add_update(ton::ton_api::storage_addUpdate &add_update, td::Promise<td::BufferSlice> promise);
void execute_get_piece(ton::ton_api::storage_getPiece &get_piece, td::Promise<td::BufferSlice> promise);
void on_update_result(td::Result<td::BufferSlice> r_answer);
void on_get_piece_result(PartId piece_id, td::Result<td::BufferSlice> r_answer);
void on_update_state_result(td::Result<td::BufferSlice> r_answer);
template <class T, class... ArgsT>
td::uint64 create_and_send_query(ArgsT &&... args);
td::uint64 send_query(td::BufferSlice query);
void schedule_loop();
void notify_node();
};
} // namespace ton