Skip to content

Commit dd13096

Browse files
committed
Don't wait for storing state to celldb in most cases
1 parent d2cc797 commit dd13096

20 files changed

+174
-116
lines changed

validator/apply-block.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ void ApplyBlock::written_block_data() {
166166
});
167167

168168
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state, handle_, apply_block_priority(), timeout_,
169-
std::move(P));
169+
true, std::move(P));
170170
}
171171
}
172172

validator/downloaders/wait-block-state-merge.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void WaitBlockStateMerge::start_up() {
5555
}
5656
});
5757

58-
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, left_, priority_, timeout_,
58+
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, left_, priority_, timeout_, false,
5959
std::move(P_l));
6060

6161
auto P_r = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
@@ -66,7 +66,7 @@ void WaitBlockStateMerge::start_up() {
6666
}
6767
});
6868

69-
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, right_, priority_, timeout_,
69+
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, right_, priority_, timeout_, false,
7070
std::move(P_r));
7171
}
7272

validator/downloaders/wait-block-state.cpp

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,31 @@ void WaitBlockState::alarm() {
3232
}
3333

3434
void WaitBlockState::abort_query(td::Status reason) {
35-
if (promise_) {
35+
if (promise_no_store_) {
36+
promise_no_store_.set_error(
37+
reason.move_as_error_prefix(PSTRING() << "failed to download state " << handle_->id() << ": "));
38+
}
39+
if (promise_final_) {
3640
if (priority_ > 0 || (reason.code() != ErrorCode::timeout && reason.code() != ErrorCode::notready)) {
3741
LOG(WARNING) << "aborting wait block state query for " << handle_->id() << " priority=" << priority_ << ": "
3842
<< reason;
3943
} else {
4044
LOG(DEBUG) << "aborting wait block state query for " << handle_->id() << " priority=" << priority_ << ": "
4145
<< reason;
4246
}
43-
promise_.set_error(reason.move_as_error_prefix(PSTRING() << "failed to download state " << handle_->id() << ": "));
47+
promise_final_.set_error(
48+
reason.move_as_error_prefix(PSTRING() << "failed to download state " << handle_->id() << ": "));
4449
}
4550
stop();
4651
}
4752

4853
void WaitBlockState::finish_query() {
4954
CHECK(handle_->received_state());
50-
/*if (handle_->id().is_masterchain() && handle_->inited_proof()) {
51-
td::actor::send_closure(manager_, &ValidatorManager::new_block, handle_, prev_state_, [](td::Unit) {});
52-
}*/
53-
if (promise_) {
54-
promise_.set_result(prev_state_);
55+
if (promise_no_store_) {
56+
promise_no_store_.set_result(prev_state_);
57+
}
58+
if (promise_final_) {
59+
promise_final_.set_result(prev_state_);
5560
}
5661
stop();
5762
}
@@ -275,10 +280,16 @@ void WaitBlockState::got_block_data(td::Ref<BlockData> data) {
275280
}
276281

277282
void WaitBlockState::apply() {
283+
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
284+
if (R.is_error()) {
285+
td::actor::send_closure(SelfId, &WaitBlockState::abort_query, R.move_as_error_prefix("db set error: "));
286+
} else {
287+
td::actor::send_closure(SelfId, &WaitBlockState::written_state, R.move_as_ok());
288+
}
289+
});
290+
278291
if (opts_->get_permanent_celldb()) {
279-
td::actor::send_closure(manager_, &ValidatorManager::set_block_state_from_data, handle_, block_,
280-
std::move(promise_));
281-
stop();
292+
td::actor::send_closure(manager_, &ValidatorManager::set_block_state_from_data, handle_, block_, std::move(P));
282293
return;
283294
}
284295
TD_PERF_COUNTER(apply_block_to_state);
@@ -289,15 +300,11 @@ void WaitBlockState::apply() {
289300
return;
290301
}
291302

292-
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
293-
if (R.is_error()) {
294-
td::actor::send_closure(SelfId, &WaitBlockState::abort_query, R.move_as_error_prefix("db set error: "));
295-
} else {
296-
td::actor::send_closure(SelfId, &WaitBlockState::written_state, R.move_as_ok());
297-
}
298-
});
299-
300303
td::actor::send_closure(manager_, &ValidatorManager::set_block_state, handle_, prev_state_, std::move(P));
304+
if (promise_no_store_) {
305+
promise_no_store_.set_result(prev_state_);
306+
promise_no_store_ = {};
307+
}
301308
}
302309

303310
void WaitBlockState::written_state(td::Ref<ShardState> upd_state) {
@@ -317,6 +324,10 @@ void WaitBlockState::got_state_from_db(td::Ref<ShardState> state) {
317324
});
318325

319326
td::actor::send_closure(manager_, &ValidatorManager::set_block_state, handle_, prev_state_, std::move(P));
327+
if (promise_no_store_) {
328+
promise_no_store_.set_result(prev_state_);
329+
promise_no_store_ = {};
330+
}
320331
} else {
321332
finish_query();
322333
}

validator/downloaders/wait-block-state.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@ class WaitBlockState : public td::actor::Actor {
2828
public:
2929
WaitBlockState(BlockHandle handle, td::uint32 priority, td::Ref<ValidatorManagerOptions> opts,
3030
td::Ref<MasterchainState> last_masterchain_state, td::actor::ActorId<ValidatorManager> manager,
31-
td::Timestamp timeout, td::Promise<td::Ref<ShardState>> promise,
31+
td::Timestamp timeout, td::Promise<td::Ref<ShardState>> promise_no_store,
32+
td::Promise<td::Ref<ShardState>> promise_final,
3233
td::Ref<PersistentStateDescription> persistent_state_desc = {})
3334
: handle_(std::move(handle))
3435
, priority_(priority)
3536
, opts_(opts)
3637
, last_masterchain_state_(last_masterchain_state)
3738
, manager_(manager)
3839
, timeout_(timeout)
39-
, promise_(std::move(promise))
40+
, promise_no_store_(std::move(promise_no_store))
41+
, promise_final_(std::move(promise_final))
4042
, persistent_state_desc_(std::move(persistent_state_desc))
4143
, perf_timer_("waitstate", 1.0, [manager](double duration) {
4244
send_closure(manager, &ValidatorManager::add_perf_timer_stat, "waitstate", duration);
@@ -96,7 +98,8 @@ class WaitBlockState : public td::actor::Actor {
9698
td::Ref<MasterchainState> last_masterchain_state_;
9799
td::actor::ActorId<ValidatorManager> manager_;
98100
td::Timestamp timeout_;
99-
td::Promise<td::Ref<ShardState>> promise_;
101+
td::Promise<td::Ref<ShardState>> promise_no_store_;
102+
td::Promise<td::Ref<ShardState>> promise_final_;
100103
td::Ref<PersistentStateDescription> persistent_state_desc_;
101104

102105
td::Ref<ShardState> prev_state_;

validator/impl/accept-block.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ void AcceptBlockQuery::got_last_mc_block(std::pair<td::Ref<MasterchainState>, Bl
626626
VLOG(VALIDATOR_DEBUG) << "shardchain block refers to newer masterchain block " << mc_blkid_.to_str()
627627
<< ", trying to obtain it";
628628
td::actor::send_closure_later(manager_, &ValidatorManager::wait_block_state_short, mc_blkid_, priority(), timeout_,
629-
[SelfId = actor_id(this)](td::Result<Ref<ShardState>> R) {
629+
false, [SelfId = actor_id(this)](td::Result<Ref<ShardState>> R) {
630630
check_send_error(SelfId, R) ||
631631
td::actor::send_closure_bool(SelfId, &AcceptBlockQuery::got_mc_state,
632632
R.move_as_ok());

validator/impl/check-proof.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ void CheckProof::got_block_handle(BlockHandle handle) {
344344
process_masterchain_state();
345345
return;
346346
}
347-
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, prev_[0], priority(), timeout_,
347+
td::actor::send_closure(manager_, &ValidatorManager::wait_block_state_short, prev_[0], priority(), timeout_, false,
348348
[SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
349349
check_send_error(SelfId, R) ||
350350
td::actor::send_closure_bool(SelfId, &CheckProof::got_masterchain_state,

validator/impl/collator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ void Collator::load_prev_states_blocks() {
299299
++pending;
300300
auto token = perf_log_.start_action(PSTRING() << "wait_block_state #" << i);
301301
td::actor::send_closure_later(
302-
manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), timeout,
302+
manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(), timeout, false,
303303
[self = get_self(), i, token = std::move(token)](td::Result<Ref<ShardState>> res) mutable {
304304
LOG(DEBUG) << "got answer to wait_block_state query #" << i;
305305
td::actor::send_closure_later(std::move(self), &Collator::after_get_shard_state, i, std::move(res),
@@ -340,7 +340,7 @@ void Collator::process_optimistic_prev_block() {
340340
++pending;
341341
auto token = perf_log_.start_action("opt wait_block_state");
342342
td::actor::send_closure_later(
343-
manager, &ValidatorManager::wait_block_state_short, prev_prev[0], priority(), timeout,
343+
manager, &ValidatorManager::wait_block_state_short, prev_prev[0], priority(), timeout, false,
344344
[self = get_self(), token = std::move(token)](td::Result<Ref<ShardState>> res) mutable {
345345
LOG(DEBUG) << "got answer to wait_block_state query (opt)";
346346
td::actor::send_closure_later(std::move(self), &Collator::after_get_shard_state_optimistic, std::move(res),
@@ -574,7 +574,7 @@ bool Collator::request_aux_mc_state(BlockSeqno seqno, Ref<MasterchainStateQ>& st
574574
++pending;
575575
auto token = perf_log_.start_action(PSTRING() << "auxiliary wait_block_state " << blkid.to_str());
576576
td::actor::send_closure_later(
577-
manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout,
577+
manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout, false,
578578
[self = get_self(), blkid, token = std::move(token)](td::Result<Ref<ShardState>> res) mutable {
579579
LOG(DEBUG) << "got answer to wait_block_state query for " << blkid.to_str();
580580
td::actor::send_closure_later(std::move(self), &Collator::after_get_aux_shard_state, blkid, std::move(res),

validator/impl/out-msg-queue-proof.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ void OutMsgQueueImporter::get_proof_local(std::shared_ptr<CacheEntry> entry, Blo
334334
return;
335335
}
336336
td::actor::send_closure(
337-
manager_, &ValidatorManager::wait_block_state_short, block, 0, entry->timeout,
337+
manager_, &ValidatorManager::wait_block_state_short, block, 0, entry->timeout, false,
338338
[=, SelfId = actor_id(this), manager = manager_, timeout = entry->timeout,
339339
retry_after = td::Timestamp::in(0.1)](td::Result<Ref<ShardState>> R) mutable {
340340
if (R.is_error()) {

validator/impl/validate-query.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void ValidateQuery::start_up() {
372372
LOG(DEBUG) << "sending wait_block_state() query #" << i << " for " << prev_blocks[i].to_str() << " to Manager";
373373
++pending;
374374
td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, prev_blocks[i], priority(),
375-
timeout, [self = get_self(), i](td::Result<Ref<ShardState>> res) -> void {
375+
timeout, false, [self = get_self(), i](td::Result<Ref<ShardState>> res) -> void {
376376
LOG(DEBUG) << "got answer to wait_block_state_short query #" << i;
377377
td::actor::send_closure_later(
378378
std::move(self), &ValidateQuery::after_get_shard_state, i, std::move(res));
@@ -784,7 +784,7 @@ void ValidateQuery::got_mc_handle(td::Result<BlockHandle> res) {
784784
}
785785
auto mc_handle = res.move_as_ok();
786786
td::actor::send_closure_later(
787-
manager, &ValidatorManager::wait_block_state, mc_handle, priority(), timeout,
787+
manager, &ValidatorManager::wait_block_state, mc_handle, priority(), timeout, false,
788788
[self = get_self(), id = id_, mc_handle](td::Result<Ref<ShardState>> res) {
789789
LOG(DEBUG) << "got answer to wait_block_state() query for masterchain block";
790790
if (res.is_ok() && mc_handle->id().seqno() > 0 && !mc_handle->inited_proof()) {
@@ -1764,7 +1764,7 @@ bool ValidateQuery::request_aux_mc_state(BlockSeqno seqno, Ref<MasterchainStateQ
17641764
CHECK(blkid.is_valid_ext() && blkid.is_masterchain());
17651765
LOG(DEBUG) << "sending auxiliary wait_block_state() query for " << blkid.to_str() << " to Manager";
17661766
++pending;
1767-
td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout,
1767+
td::actor::send_closure_later(manager, &ValidatorManager::wait_block_state_short, blkid, priority(), timeout, false,
17681768
[self = get_self(), blkid](td::Result<Ref<ShardState>> res) {
17691769
LOG(DEBUG) << "got answer to wait_block_state query for " << blkid.to_str();
17701770
td::actor::send_closure_later(std::move(self),

validator/manager-disk.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -321,14 +321,15 @@ void ValidatorManagerImpl::dec_pending_new_blocks() {
321321
}
322322

323323
void ValidatorManagerImpl::wait_block_state(BlockHandle handle, td::uint32 priority, td::Timestamp timeout,
324-
td::Promise<td::Ref<ShardState>> promise) {
324+
bool wait_store, td::Promise<td::Ref<ShardState>> promise) {
325325
auto it = wait_state_.find(handle->id());
326326
if (it == wait_state_.end()) {
327327
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this), handle](td::Result<td::Ref<ShardState>> R) {
328328
td::actor::send_closure(SelfId, &ValidatorManagerImpl::finished_wait_state, handle->id(), std::move(R));
329329
});
330330
auto id = td::actor::create_actor<WaitBlockState>("waitstate", handle, 0, opts_, last_masterchain_state_,
331-
actor_id(this), td::Timestamp::in(10.0), std::move(P))
331+
actor_id(this), td::Timestamp::in(10.0),
332+
td::Promise<td::Ref<ShardState>>{}, std::move(P))
332333
.release();
333334
wait_state_[handle->id()].actor_ = id;
334335
it = wait_state_.find(handle->id());
@@ -340,14 +341,14 @@ void ValidatorManagerImpl::wait_block_state(BlockHandle handle, td::uint32 prior
340341
}
341342

342343
void ValidatorManagerImpl::wait_block_state_short(BlockIdExt block_id, td::uint32 priority, td::Timestamp timeout,
343-
td::Promise<td::Ref<ShardState>> promise) {
344+
bool wait_store, td::Promise<td::Ref<ShardState>> promise) {
344345
auto P = td::PromiseCreator::lambda(
345-
[SelfId = actor_id(this), timeout, promise = std::move(promise)](td::Result<BlockHandle> R) mutable {
346+
[=, SelfId = actor_id(this), promise = std::move(promise)](td::Result<BlockHandle> R) mutable {
346347
if (R.is_error()) {
347348
promise.set_error(R.move_as_error());
348349
return;
349350
}
350-
td::actor::send_closure(SelfId, &ValidatorManagerImpl::wait_block_state, R.move_as_ok(), 0, timeout,
351+
td::actor::send_closure(SelfId, &ValidatorManagerImpl::wait_block_state, R.move_as_ok(), 0, timeout, wait_store,
351352
std::move(promise));
352353
});
353354
get_block_handle(block_id, true, std::move(P));
@@ -401,7 +402,7 @@ void ValidatorManagerImpl::wait_prev_block_state(BlockHandle handle, td::uint32
401402
auto shard = handle->id().shard_full();
402403
auto prev_shard = handle->one_prev(true).shard_full();
403404
if (shard == prev_shard) {
404-
wait_block_state_short(handle->one_prev(true), 0, timeout, std::move(promise));
405+
wait_block_state_short(handle->one_prev(true), 0, timeout, true, std::move(promise));
405406
} else {
406407
CHECK(shard_parent(shard) == prev_shard);
407408
bool left = shard_child(prev_shard, true) == shard;
@@ -420,7 +421,7 @@ void ValidatorManagerImpl::wait_prev_block_state(BlockHandle handle, td::uint32
420421
}
421422
}
422423
});
423-
wait_block_state_short(handle->one_prev(true), 0, timeout, std::move(P));
424+
wait_block_state_short(handle->one_prev(true), 0, timeout, true, std::move(P));
424425
}
425426
} else {
426427
wait_block_state_merge(handle->one_prev(true), handle->one_prev(false), 0, timeout, std::move(promise));
@@ -495,7 +496,7 @@ void ValidatorManagerImpl::wait_block_message_queue(BlockHandle handle, td::uint
495496
}
496497
});
497498

498-
wait_block_state(handle, 0, timeout, std::move(P));
499+
wait_block_state(handle, 0, timeout, true, std::move(P));
499500
}
500501

501502
void ValidatorManagerImpl::wait_block_message_queue_short(BlockIdExt block_id, td::uint32 priority,

0 commit comments

Comments
 (0)