mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	Better error messages from LS for missing blocks (#837)
Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
		
							parent
							
								
									83efcebad0
								
							
						
					
					
						commit
						b3be4283ff
					
				
					 6 changed files with 202 additions and 31 deletions
				
			
		| 
						 | 
					@ -505,20 +505,7 @@ void LiteQuery::perform_sendMessage(td::BufferSlice data) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void LiteQuery::get_block_handle_checked(BlockIdExt blkid, td::Promise<ConstBlockHandle> promise) {
 | 
					void LiteQuery::get_block_handle_checked(BlockIdExt blkid, td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
  auto P = td::PromiseCreator::lambda(
 | 
					  td::actor::send_closure(manager_, &ValidatorManager::get_block_handle_for_litequery, blkid, std::move(promise));
 | 
				
			||||||
      [promise = std::move(promise)](td::Result<BlockHandle> R) mutable {
 | 
					 | 
				
			||||||
        if (R.is_error()) {
 | 
					 | 
				
			||||||
          promise.set_error(R.move_as_error());
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          auto handle = R.move_as_ok();
 | 
					 | 
				
			||||||
          if (handle->is_applied()) {
 | 
					 | 
				
			||||||
            promise.set_result(std::move(handle));
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            promise.set_error(td::Status::Error(ErrorCode::notready, "block is not applied"));
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
  td::actor::send_closure(manager_, &ValidatorManager::get_block_handle, blkid, false, std::move(P));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool LiteQuery::request_mc_block_data(BlockIdExt blkid) {
 | 
					bool LiteQuery::request_mc_block_data(BlockIdExt blkid) {
 | 
				
			||||||
| 
						 | 
					@ -1497,17 +1484,12 @@ void LiteQuery::continue_getTransactions(unsigned remaining, bool exact) {
 | 
				
			||||||
  LOG(DEBUG) << "sending get_block_by_lt_from_db() query to manager for " << acc_workchain_ << ":" << acc_addr_.to_hex()
 | 
					  LOG(DEBUG) << "sending get_block_by_lt_from_db() query to manager for " << acc_workchain_ << ":" << acc_addr_.to_hex()
 | 
				
			||||||
             << " " << trans_lt_;
 | 
					             << " " << trans_lt_;
 | 
				
			||||||
  td::actor::send_closure_later(
 | 
					  td::actor::send_closure_later(
 | 
				
			||||||
      manager_, &ValidatorManager::get_block_by_lt_from_db, ton::extract_addr_prefix(acc_workchain_, acc_addr_),
 | 
					      manager_, &ValidatorManager::get_block_by_lt_from_db_for_litequery, ton::extract_addr_prefix(acc_workchain_, acc_addr_),
 | 
				
			||||||
      trans_lt_, [Self = actor_id(this), remaining, manager = manager_](td::Result<ConstBlockHandle> res) {
 | 
					      trans_lt_, [Self = actor_id(this), remaining, manager = manager_](td::Result<ConstBlockHandle> res) {
 | 
				
			||||||
        if (res.is_error()) {
 | 
					        if (res.is_error()) {
 | 
				
			||||||
          td::actor::send_closure(Self, &LiteQuery::abort_getTransactions, res.move_as_error(), ton::BlockIdExt{});
 | 
					          td::actor::send_closure(Self, &LiteQuery::abort_getTransactions, res.move_as_error(), ton::BlockIdExt{});
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          auto handle = res.move_as_ok();
 | 
					          auto handle = res.move_as_ok();
 | 
				
			||||||
          if (!handle->is_applied()) {
 | 
					 | 
				
			||||||
            td::actor::send_closure(Self, &LiteQuery::abort_getTransactions, td::Status::Error(ErrorCode::notready, "block is not applied"),
 | 
					 | 
				
			||||||
                                    ton::BlockIdExt{});
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
 | 
					          LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
 | 
				
			||||||
          td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
 | 
					          td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
 | 
				
			||||||
                                        [Self, blkid = handle->id(), remaining](td::Result<Ref<BlockData>> res) {
 | 
					                                        [Self, blkid = handle->id(), remaining](td::Result<Ref<BlockData>> res) {
 | 
				
			||||||
| 
						 | 
					@ -1846,10 +1828,6 @@ void LiteQuery::perform_lookupBlock(BlockId blkid, int mode, LogicalTime lt, Uni
 | 
				
			||||||
          td::actor::send_closure(Self, &LiteQuery::abort_query, res.move_as_error());
 | 
					          td::actor::send_closure(Self, &LiteQuery::abort_query, res.move_as_error());
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          auto handle = res.move_as_ok();
 | 
					          auto handle = res.move_as_ok();
 | 
				
			||||||
          if (!handle->is_applied()) {
 | 
					 | 
				
			||||||
            td::actor::send_closure(Self, &LiteQuery::abort_query, td::Status::Error(ErrorCode::notready, "block is not applied"));
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
 | 
					          LOG(DEBUG) << "requesting data for block " << handle->id().to_str();
 | 
				
			||||||
          td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
 | 
					          td::actor::send_closure_later(manager, &ValidatorManager::get_block_data_from_db, handle,
 | 
				
			||||||
                                        [Self, blkid = handle->id(), mode](td::Result<Ref<BlockData>> res) {
 | 
					                                        [Self, blkid = handle->id(), mode](td::Result<Ref<BlockData>> res) {
 | 
				
			||||||
| 
						 | 
					@ -1865,13 +1843,14 @@ void LiteQuery::perform_lookupBlock(BlockId blkid, int mode, LogicalTime lt, Uni
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ton::AccountIdPrefixFull pfx{blkid.workchain, blkid.shard};
 | 
					  ton::AccountIdPrefixFull pfx{blkid.workchain, blkid.shard};
 | 
				
			||||||
  if (mode & 2) {
 | 
					  if (mode & 2) {
 | 
				
			||||||
    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_lt_from_db, pfx, lt, std::move(P));
 | 
					    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_lt_from_db_for_litequery, pfx, lt,
 | 
				
			||||||
 | 
					                                  std::move(P));
 | 
				
			||||||
  } else if (mode & 4) {
 | 
					  } else if (mode & 4) {
 | 
				
			||||||
    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_unix_time_from_db, pfx, utime,
 | 
					    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_unix_time_from_db_for_litequery, pfx, utime,
 | 
				
			||||||
                                  std::move(P));
 | 
					                                  std::move(P));
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_seqno_from_db, pfx, blkid.seqno,
 | 
					    td::actor::send_closure_later(manager_, &ValidatorManager::get_block_by_seqno_from_db_for_litequery, pfx,
 | 
				
			||||||
                                  std::move(P));
 | 
					                                  blkid.seqno, std::move(P));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2629,7 +2608,7 @@ void LiteQuery::perform_getShardBlockProof(BlockIdExt blkid) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    AccountIdPrefixFull pfx{masterchainId, shardIdAll};
 | 
					    AccountIdPrefixFull pfx{masterchainId, shardIdAll};
 | 
				
			||||||
    td::actor::send_closure_later(
 | 
					    td::actor::send_closure_later(
 | 
				
			||||||
        manager, &ValidatorManager::get_block_by_seqno_from_db, pfx, handle->masterchain_ref_block(),
 | 
					        manager, &ValidatorManager::get_block_by_seqno_from_db_for_litequery, pfx, handle->masterchain_ref_block(),
 | 
				
			||||||
        [Self, manager](td::Result<ConstBlockHandle> R) {
 | 
					        [Self, manager](td::Result<ConstBlockHandle> R) {
 | 
				
			||||||
          if (R.is_error()) {
 | 
					          if (R.is_error()) {
 | 
				
			||||||
            td::actor::send_closure(Self, &LiteQuery::abort_query, R.move_as_error());
 | 
					            td::actor::send_closure(Self, &LiteQuery::abort_query, R.move_as_error());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,6 +170,14 @@ class ValidatorManager : public ValidatorManagerInterface {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  virtual void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) = 0;
 | 
					  virtual void log_validator_session_stats(BlockIdExt block_id, validatorsession::ValidatorSessionStats stats) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  virtual void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) = 0;
 | 
				
			||||||
 | 
					  virtual void get_block_by_lt_from_db_for_litequery(AccountIdPrefixFull account, LogicalTime lt,
 | 
				
			||||||
 | 
					                                                     td::Promise<ConstBlockHandle> promise) = 0;
 | 
				
			||||||
 | 
					  virtual void get_block_by_unix_time_from_db_for_litequery(AccountIdPrefixFull account, UnixTime ts,
 | 
				
			||||||
 | 
					                                                            td::Promise<ConstBlockHandle> promise) = 0;
 | 
				
			||||||
 | 
					  virtual void get_block_by_seqno_from_db_for_litequery(AccountIdPrefixFull account, BlockSeqno seqno,
 | 
				
			||||||
 | 
					                                                        td::Promise<ConstBlockHandle> promise) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static bool is_persistent_state(UnixTime ts, UnixTime prev_ts) {
 | 
					  static bool is_persistent_state(UnixTime ts, UnixTime prev_ts) {
 | 
				
			||||||
    return ts / (1 << 17) != prev_ts / (1 << 17);
 | 
					    return ts / (1 << 17) != prev_ts / (1 << 17);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -384,6 +384,21 @@ class ValidatorManagerImpl : public ValidatorManager {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
					    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_handle(block_id, false, promise.wrap([](BlockHandle &&handle) -> ConstBlockHandle { return handle; }));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_lt_from_db_for_litequery(AccountIdPrefixFull account, LogicalTime lt,
 | 
				
			||||||
 | 
					                                             td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_lt_from_db(account, lt, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_unix_time_from_db_for_litequery(AccountIdPrefixFull account, UnixTime ts,
 | 
				
			||||||
 | 
					                                                    td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_unix_time_from_db(account, ts, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_seqno_from_db_for_litequery(AccountIdPrefixFull account, BlockSeqno seqno,
 | 
				
			||||||
 | 
					                                                td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_seqno_from_db(account, seqno, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  PublicKeyHash local_id_;
 | 
					  PublicKeyHash local_id_;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -445,6 +445,21 @@ class ValidatorManagerImpl : public ValidatorManager {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
					    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_handle(block_id, false, promise.wrap([](BlockHandle &&handle) -> ConstBlockHandle { return handle; }));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_lt_from_db_for_litequery(AccountIdPrefixFull account, LogicalTime lt,
 | 
				
			||||||
 | 
					                                             td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_lt_from_db(account, lt, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_unix_time_from_db_for_litequery(AccountIdPrefixFull account, UnixTime ts,
 | 
				
			||||||
 | 
					                                                    td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_unix_time_from_db(account, ts, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  void get_block_by_seqno_from_db_for_litequery(AccountIdPrefixFull account, BlockSeqno seqno,
 | 
				
			||||||
 | 
					                                                td::Promise<ConstBlockHandle> promise) override {
 | 
				
			||||||
 | 
					    get_block_by_seqno_from_db(account, seqno, std::move(promise));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  td::Ref<ValidatorManagerOptions> opts_;
 | 
					  td::Ref<ValidatorManagerOptions> opts_;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2334,9 +2334,12 @@ void ValidatorManagerImpl::update_shard_client_block_handle(BlockHandle handle,
 | 
				
			||||||
                                                            td::Promise<td::Unit> promise) {
 | 
					                                                            td::Promise<td::Unit> promise) {
 | 
				
			||||||
  shard_client_handle_ = std::move(handle);
 | 
					  shard_client_handle_ = std::move(handle);
 | 
				
			||||||
  auto seqno = shard_client_handle_->id().seqno();
 | 
					  auto seqno = shard_client_handle_->id().seqno();
 | 
				
			||||||
 | 
					  if (state.not_null()) {
 | 
				
			||||||
 | 
					    shard_client_shards_ = state->get_shards();
 | 
				
			||||||
    if (last_liteserver_state_.is_null() || last_liteserver_state_->get_block_id().seqno() < seqno) {
 | 
					    if (last_liteserver_state_.is_null() || last_liteserver_state_->get_block_id().seqno() < seqno) {
 | 
				
			||||||
      last_liteserver_state_ = std::move(state);
 | 
					      last_liteserver_state_ = std::move(state);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  shard_client_update(seqno);
 | 
					  shard_client_update(seqno);
 | 
				
			||||||
  promise.set_value(td::Unit());
 | 
					  promise.set_value(td::Unit());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2662,6 +2665,143 @@ void ValidatorManagerImpl::log_validator_session_stats(BlockIdExt block_id,
 | 
				
			||||||
  LOG(INFO) << "Writing validator session stats for " << block_id.id;
 | 
					  LOG(INFO) << "Writing validator session stats for " << block_id.id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  get_block_handle(
 | 
				
			||||||
 | 
					      block_id, false,
 | 
				
			||||||
 | 
					      [SelfId = actor_id(this), block_id, promise = std::move(promise)](td::Result<BlockHandle> R) mutable {
 | 
				
			||||||
 | 
					        if (R.is_ok() && R.ok()->is_applied()) {
 | 
				
			||||||
 | 
					          promise.set_value(R.move_as_ok());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          td::actor::send_closure(SelfId, &ValidatorManagerImpl::process_block_handle_for_litequery_error, block_id,
 | 
				
			||||||
 | 
					                                  std::move(R), std::move(promise));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::get_block_by_lt_from_db_for_litequery(AccountIdPrefixFull account, LogicalTime lt,
 | 
				
			||||||
 | 
					                                                                 td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  get_block_by_lt_from_db(
 | 
				
			||||||
 | 
					      account, lt, [=, SelfId = actor_id(this), promise = std::move(promise)](td::Result<ConstBlockHandle> R) mutable {
 | 
				
			||||||
 | 
					        if (R.is_ok() && R.ok()->is_applied()) {
 | 
				
			||||||
 | 
					          promise.set_value(R.move_as_ok());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          td::actor::send_closure(SelfId, &ValidatorManagerImpl::process_lookup_block_for_litequery_error, account, 0,
 | 
				
			||||||
 | 
					                                  lt, std::move(R), std::move(promise));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::get_block_by_unix_time_from_db_for_litequery(AccountIdPrefixFull account, UnixTime ts,
 | 
				
			||||||
 | 
					                                                                        td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  get_block_by_unix_time_from_db(
 | 
				
			||||||
 | 
					      account, ts, [=, SelfId = actor_id(this), promise = std::move(promise)](td::Result<ConstBlockHandle> R) mutable {
 | 
				
			||||||
 | 
					        if (R.is_ok() && R.ok()->is_applied()) {
 | 
				
			||||||
 | 
					          promise.set_value(R.move_as_ok());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          td::actor::send_closure(SelfId, &ValidatorManagerImpl::process_lookup_block_for_litequery_error, account, 1,
 | 
				
			||||||
 | 
					                                  ts, std::move(R), std::move(promise));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::get_block_by_seqno_from_db_for_litequery(AccountIdPrefixFull account, BlockSeqno seqno,
 | 
				
			||||||
 | 
					                                                                    td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  get_block_by_seqno_from_db(
 | 
				
			||||||
 | 
					      account, seqno,
 | 
				
			||||||
 | 
					      [=, SelfId = actor_id(this), promise = std::move(promise)](td::Result<ConstBlockHandle> R) mutable {
 | 
				
			||||||
 | 
					        if (R.is_ok() && R.ok()->is_applied()) {
 | 
				
			||||||
 | 
					          promise.set_value(R.move_as_ok());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          td::actor::send_closure(SelfId, &ValidatorManagerImpl::process_lookup_block_for_litequery_error, account, 2,
 | 
				
			||||||
 | 
					                                  seqno, std::move(R), std::move(promise));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::process_block_handle_for_litequery_error(BlockIdExt block_id,
 | 
				
			||||||
 | 
					                                                                    td::Result<BlockHandle> r_handle,
 | 
				
			||||||
 | 
					                                                                    td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  td::Status err;
 | 
				
			||||||
 | 
					  if (r_handle.is_error()) {
 | 
				
			||||||
 | 
					    err = r_handle.move_as_error();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    auto handle = r_handle.move_as_ok();
 | 
				
			||||||
 | 
					    if (handle->is_applied()) {
 | 
				
			||||||
 | 
					      promise.set_value(std::move(handle));
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!handle->received() || !handle->received_state()) {
 | 
				
			||||||
 | 
					      err = td::Status::Error(ErrorCode::notready, PSTRING() << "block " << block_id.id.to_str() << " is not in db");
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      err = td::Status::Error(ErrorCode::notready, PSTRING() << "block " << block_id.id.to_str() << " is not applied");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (block_id.is_masterchain()) {
 | 
				
			||||||
 | 
					    if (block_id.seqno() > last_masterchain_seqno_) {
 | 
				
			||||||
 | 
					      err = err.move_as_error_suffix(PSTRING() << " (last known masterchain block: " << last_masterchain_seqno_ << ")");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    for (auto &shard : shard_client_shards_) {
 | 
				
			||||||
 | 
					      if (shard_intersects(shard->shard(), block_id.shard_full())) {
 | 
				
			||||||
 | 
					        if (block_id.seqno() > shard->top_block_id().seqno()) {
 | 
				
			||||||
 | 
					          err = err.move_as_error_suffix(
 | 
				
			||||||
 | 
					              PSTRING() << " (possibly out of sync: shard_client_seqno="
 | 
				
			||||||
 | 
					                        << (shard_client_handle_ ? shard_client_handle_->id().seqno() : 0) << " ls_seqno="
 | 
				
			||||||
 | 
					                        << (last_liteserver_state_.not_null() ? last_liteserver_state_->get_seqno() : 0) << ")");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  promise.set_error(std::move(err));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ValidatorManagerImpl::process_lookup_block_for_litequery_error(AccountIdPrefixFull account, int type,
 | 
				
			||||||
 | 
					                                                                    td::uint64 value,
 | 
				
			||||||
 | 
					                                                                    td::Result<ConstBlockHandle> r_handle,
 | 
				
			||||||
 | 
					                                                                    td::Promise<ConstBlockHandle> promise) {
 | 
				
			||||||
 | 
					  td::Status err;
 | 
				
			||||||
 | 
					  if (r_handle.is_error()) {
 | 
				
			||||||
 | 
					    err = r_handle.move_as_error();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    auto handle = r_handle.move_as_ok();
 | 
				
			||||||
 | 
					    if (handle->is_applied()) {
 | 
				
			||||||
 | 
					      promise.set_value(std::move(handle));
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!handle->received() || !handle->received_state()) {
 | 
				
			||||||
 | 
					      err = td::Status::Error(ErrorCode::notready, PSTRING() << "block " << handle->id().to_str() << " is not in db");
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      err = td::Status::Error(ErrorCode::notready, PSTRING() << "block " << handle->id().to_str() << " is not applied");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (account.is_masterchain()) {
 | 
				
			||||||
 | 
					    if (value > (type == 0
 | 
				
			||||||
 | 
					                     ? last_masterchain_state_->get_logical_time()
 | 
				
			||||||
 | 
					                     : (type == 1 ? last_masterchain_state_->get_unix_time() : last_masterchain_state_->get_seqno()))) {
 | 
				
			||||||
 | 
					      err = err.move_as_error_suffix(PSTRING() << " (last known masterchain block: " << last_masterchain_seqno_ << ")");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    for (auto &shard : shard_client_shards_) {
 | 
				
			||||||
 | 
					      if (shard_intersects(shard->shard(), account.as_leaf_shard())) {
 | 
				
			||||||
 | 
					        if (value > (type == 0 ? shard->end_lt()
 | 
				
			||||||
 | 
					                               : (type == 1 ? (shard_client_handle_ ? shard_client_handle_->unix_time() : 0)
 | 
				
			||||||
 | 
					                                            : shard->top_block_id().seqno()))) {
 | 
				
			||||||
 | 
					          err = err.move_as_error_suffix(
 | 
				
			||||||
 | 
					              PSTRING() << " (possibly out of sync: shard_client_seqno="
 | 
				
			||||||
 | 
					                        << (shard_client_handle_ ? shard_client_handle_->id().seqno() : 0) << " ls_seqno="
 | 
				
			||||||
 | 
					                        << (last_liteserver_state_.not_null() ? last_liteserver_state_->get_seqno() : 0) << ")");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  static std::string names[3] = {"lt", "utime", "seqno"};
 | 
				
			||||||
 | 
					  err = err.move_as_error_prefix(PSTRING() << "cannot find block " << account.to_str() << " " << names[type] << "="
 | 
				
			||||||
 | 
					                                           << value << ": ");
 | 
				
			||||||
 | 
					  promise.set_error(std::move(err));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
td::actor::ActorOwn<ValidatorManagerInterface> ValidatorManagerFactory::create(
 | 
					td::actor::ActorOwn<ValidatorManagerInterface> ValidatorManagerFactory::create(
 | 
				
			||||||
    td::Ref<ValidatorManagerOptions> opts, std::string db_root, td::actor::ActorId<keyring::Keyring> keyring,
 | 
					    td::Ref<ValidatorManagerOptions> opts, std::string db_root, td::actor::ActorId<keyring::Keyring> keyring,
 | 
				
			||||||
    td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<rldp::Rldp> rldp,
 | 
					    td::actor::ActorId<adnl::Adnl> adnl, td::actor::ActorId<rldp::Rldp> rldp,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -252,6 +252,7 @@ class ValidatorManagerImpl : public ValidatorManager {
 | 
				
			||||||
  BlockHandle last_key_block_handle_;
 | 
					  BlockHandle last_key_block_handle_;
 | 
				
			||||||
  BlockHandle last_known_key_block_handle_;
 | 
					  BlockHandle last_known_key_block_handle_;
 | 
				
			||||||
  BlockHandle shard_client_handle_;
 | 
					  BlockHandle shard_client_handle_;
 | 
				
			||||||
 | 
					  std::vector<td::Ref<McShardHash>> shard_client_shards_;
 | 
				
			||||||
  td::Ref<MasterchainState> last_liteserver_state_;
 | 
					  td::Ref<MasterchainState> last_liteserver_state_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  td::Ref<MasterchainState> do_get_last_liteserver_state();
 | 
					  td::Ref<MasterchainState> do_get_last_liteserver_state();
 | 
				
			||||||
| 
						 | 
					@ -561,6 +562,19 @@ class ValidatorManagerImpl : public ValidatorManager {
 | 
				
			||||||
    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
					    td::actor::send_closure(queue_size_counter_, &QueueSizeCounter::get_queue_size, block_id, std::move(promise));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void get_block_handle_for_litequery(BlockIdExt block_id, td::Promise<ConstBlockHandle> promise) override;
 | 
				
			||||||
 | 
					  void get_block_by_lt_from_db_for_litequery(AccountIdPrefixFull account, LogicalTime lt,
 | 
				
			||||||
 | 
					                                             td::Promise<ConstBlockHandle> promise) override;
 | 
				
			||||||
 | 
					  void get_block_by_unix_time_from_db_for_litequery(AccountIdPrefixFull account, UnixTime ts,
 | 
				
			||||||
 | 
					                                                    td::Promise<ConstBlockHandle> promise) override;
 | 
				
			||||||
 | 
					  void get_block_by_seqno_from_db_for_litequery(AccountIdPrefixFull account, BlockSeqno seqno,
 | 
				
			||||||
 | 
					                                                td::Promise<ConstBlockHandle> promise) override;
 | 
				
			||||||
 | 
					  void process_block_handle_for_litequery_error(BlockIdExt block_id, td::Result<BlockHandle> r_handle,
 | 
				
			||||||
 | 
					                                                td::Promise<ConstBlockHandle> promise);
 | 
				
			||||||
 | 
					  void process_lookup_block_for_litequery_error(AccountIdPrefixFull account, int type, td::uint64 value,
 | 
				
			||||||
 | 
					                                                td::Result<ConstBlockHandle> r_handle,
 | 
				
			||||||
 | 
					                                                td::Promise<ConstBlockHandle> promise);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  td::Timestamp resend_shard_blocks_at_;
 | 
					  td::Timestamp resend_shard_blocks_at_;
 | 
				
			||||||
  td::Timestamp check_waiters_at_;
 | 
					  td::Timestamp check_waiters_at_;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue