mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Accelerator: partial fullnodes (#1393)
* Accelerator: partial fullnodes 1) Node can monitor a subset of shards 2) New archive slice format (sharded) 3) Validators are still required to have all shards 4) Support partial liteservers in lite-client, blockchain explorer, tonlib 5) Proxy liteserver * Fix compilation error
This commit is contained in:
parent
62444100f5
commit
954a96a077
83 changed files with 3213 additions and 1113 deletions
|
@ -189,6 +189,12 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
waiting_.resize(j);
|
||||
}
|
||||
};
|
||||
template <typename ActorT, typename ResType>
|
||||
struct WaitListCaching : public WaitList<ActorT, ResType> {
|
||||
bool done_ = false;
|
||||
ResType result_;
|
||||
td::Timestamp remove_at_;
|
||||
};
|
||||
std::map<BlockIdExt, WaitList<WaitBlockState, td::Ref<ShardState>>> wait_state_;
|
||||
std::map<BlockIdExt, WaitList<WaitBlockData, td::Ref<BlockData>>> wait_block_data_;
|
||||
|
||||
|
@ -305,6 +311,7 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
std::vector<PerfTimerStats> perf_timer_stats;
|
||||
|
||||
void new_masterchain_block();
|
||||
void update_shard_overlays();
|
||||
void update_shards();
|
||||
void update_shard_blocks();
|
||||
void written_destroyed_validator_sessions(std::vector<td::actor::ActorId<ValidatorGroup>> groups);
|
||||
|
@ -323,8 +330,7 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
void applied_hardfork();
|
||||
void prestart_sync();
|
||||
void download_next_archive();
|
||||
void downloaded_archive_slice(std::string name, bool is_tmp);
|
||||
void checked_archive_slice(std::vector<BlockSeqno> seqno);
|
||||
void checked_archive_slice(BlockSeqno new_last_mc_seqno, BlockSeqno new_shard_client_seqno);
|
||||
void finish_prestart_sync();
|
||||
void completed_prestart_sync();
|
||||
|
||||
|
@ -361,6 +367,7 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
td::Promise<td::Unit> promise) override;
|
||||
void validate_block(ReceivedBlock block, td::Promise<BlockHandle> promise) override;
|
||||
void prevalidate_block(BlockBroadcast broadcast, td::Promise<td::Unit> promise) override;
|
||||
void validated_block_broadcast(BlockIdExt block_id, CatchainSeqno cc_seqno);
|
||||
|
||||
//void create_validate_block(BlockId block, td::BufferSlice data, td::Promise<Block> promise) = 0;
|
||||
void sync_complete(td::Promise<td::Unit> promise) override;
|
||||
|
@ -505,10 +512,11 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
void send_top_shard_block_description(td::Ref<ShardTopBlockDescription> desc) override;
|
||||
void send_block_broadcast(BlockBroadcast broadcast, int mode) override;
|
||||
void send_validator_telemetry(PublicKeyHash key, tl_object_ptr<ton_api::validator_telemetry> telemetry) override;
|
||||
void send_download_archive_request(BlockSeqno mc_seqno, ShardIdFull shard_prefix, std::string tmp_dir,
|
||||
td::Timestamp timeout, td::Promise<std::string> promise) override;
|
||||
|
||||
void update_shard_client_state(BlockIdExt masterchain_block_id, td::Promise<td::Unit> promise) override;
|
||||
void get_shard_client_state(bool from_db, td::Promise<BlockIdExt> promise) override;
|
||||
void subscribe_to_shard(ShardIdFull shard) override;
|
||||
|
||||
void update_async_serializer_state(AsyncSerializerState state, td::Promise<td::Unit> promise) override;
|
||||
void get_async_serializer_state(td::Promise<AsyncSerializerState> promise) override;
|
||||
|
@ -521,7 +529,7 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
std::move(promise));
|
||||
}
|
||||
|
||||
void get_archive_id(BlockSeqno masterchain_seqno, td::Promise<td::uint64> promise) override;
|
||||
void get_archive_id(BlockSeqno masterchain_seqno, ShardIdFull shard_prefix, td::Promise<td::uint64> promise) override;
|
||||
void get_archive_slice(td::uint64 archive_id, td::uint64 offset, td::uint32 limit,
|
||||
td::Promise<td::BufferSlice> promise) override;
|
||||
|
||||
|
@ -542,10 +550,12 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
void finished_wait_data(BlockHandle handle, td::Result<td::Ref<BlockData>> R);
|
||||
|
||||
void start_up() override;
|
||||
void init_last_masterchain_state(td::Ref<MasterchainState> state) override;
|
||||
void started(ValidatorManagerInitResult result);
|
||||
void read_gc_list(std::vector<ValidatorSessionId> list);
|
||||
|
||||
bool is_validator();
|
||||
bool validating_masterchain();
|
||||
PublicKeyHash get_validator(ShardIdFull shard, td::Ref<ValidatorSet> val_set);
|
||||
|
||||
ValidatorManagerImpl(td::Ref<ValidatorManagerOptions> opts, std::string db_root,
|
||||
|
@ -604,14 +614,20 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
|
||||
void update_options(td::Ref<ValidatorManagerOptions> opts) override;
|
||||
|
||||
void add_persistent_state_description(td::Ref<PersistentStateDescription> desc) override;
|
||||
|
||||
void get_out_msg_queue_size(BlockIdExt block_id, td::Promise<td::uint64> promise) override {
|
||||
if (queue_size_counter_.empty()) {
|
||||
if (last_masterchain_state_.is_null()) {
|
||||
promise.set_error(td::Status::Error(ErrorCode::notready, "not ready"));
|
||||
return;
|
||||
}
|
||||
queue_size_counter_ = td::actor::create_actor<QueueSizeCounter>("queuesizecounter",
|
||||
last_masterchain_state_, actor_id(this));
|
||||
queue_size_counter_ =
|
||||
td::actor::create_actor<QueueSizeCounter>("queuesizecounter", last_masterchain_state_, opts_, actor_id(this));
|
||||
}
|
||||
if (!opts_->need_monitor(block_id.shard_full(), last_masterchain_state_)) {
|
||||
return promise.set_error(
|
||||
td::Status::Error(PSTRING() << "not monitoring shard " << block_id.shard_full().to_str()));
|
||||
}
|
||||
td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
|
||||
}
|
||||
|
@ -682,7 +698,7 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
|
||||
td::actor::ActorOwn<AsyncStateSerializer> serializer_;
|
||||
|
||||
std::map<BlockSeqno, std::pair<std::string, bool>> to_import_;
|
||||
std::map<BlockSeqno, std::vector<std::string>> to_import_;
|
||||
|
||||
private:
|
||||
std::unique_ptr<Callback> callback_;
|
||||
|
@ -712,7 +728,15 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
return 3 * 10;
|
||||
}
|
||||
|
||||
void got_persistent_state_descriptions(std::vector<td::Ref<PersistentStateDescription>> descs);
|
||||
void add_persistent_state_description_impl(td::Ref<PersistentStateDescription> desc);
|
||||
td::Ref<PersistentStateDescription> get_block_persistent_state(BlockIdExt block_id);
|
||||
|
||||
private:
|
||||
bool need_monitor(ShardIdFull shard) const {
|
||||
return opts_->need_monitor(shard, last_masterchain_state_);
|
||||
}
|
||||
|
||||
std::map<BlockSeqno, WaitList<td::actor::Actor, td::Unit>> shard_client_waiters_;
|
||||
td::actor::ActorOwn<QueueSizeCounter> queue_size_counter_;
|
||||
|
||||
|
@ -740,6 +764,9 @@ class ValidatorManagerImpl : public ValidatorManager {
|
|||
std::map<PublicKeyHash, td::actor::ActorOwn<ValidatorTelemetry>> validator_telemetry_;
|
||||
|
||||
void init_validator_telemetry();
|
||||
|
||||
std::map<BlockSeqno, td::Ref<PersistentStateDescription>> persistent_state_descriptions_;
|
||||
std::map<BlockIdExt, td::Ref<PersistentStateDescription>> persistent_state_blocks_;
|
||||
};
|
||||
|
||||
} // namespace validator
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue