Skip to content

Commit 9d94e04

Browse files
committed
Add more stats to validator getstats
1) Liteserver queries count 2) Collated/validated blocks count, number of active sessions 3) Persistent state sizes 4) Initial sync progress
1 parent ce6c299 commit 9d94e04

26 files changed

+365
-45
lines changed

tdutils/td/utils/Time.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ inline Timestamp &operator+=(Timestamp &a, double b) {
128128
return a;
129129
}
130130

131+
inline double operator-(const Timestamp &a, const Timestamp &b) {
132+
return a.at() - b.at();
133+
}
134+
131135
template <class StorerT>
132136
void store(const Timestamp &timestamp, StorerT &storer) {
133137
storer.store_binary(timestamp.at() - Time::now() + Clocks::system());

validator-engine/validator-engine.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,7 +1957,8 @@ void ValidatorEngine::started_overlays() {
19571957

19581958
void ValidatorEngine::start_validator() {
19591959
validator_options_.write().set_allow_blockchain_init(config_.validators.size() > 0);
1960-
validator_options_.write().set_state_serializer_enabled(config_.state_serializer_enabled);
1960+
validator_options_.write().set_state_serializer_enabled(config_.state_serializer_enabled &&
1961+
!state_serializer_disabled_flag_);
19611962
load_collator_options();
19621963

19631964
validator_manager_ = ton::validator::ValidatorManagerFactory::create(
@@ -3973,7 +3974,7 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_setStateS
39733974
promise.set_value(ton::create_serialize_tl_object<ton::ton_api::engine_validator_success>());
39743975
return;
39753976
}
3976-
validator_options_.write().set_state_serializer_enabled(query.enabled_);
3977+
validator_options_.write().set_state_serializer_enabled(query.enabled_ && !state_serializer_disabled_flag_);
39773978
td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options,
39783979
validator_options_);
39793980
config_.state_serializer_enabled = query.enabled_;
@@ -4556,6 +4557,11 @@ int main(int argc, char *argv[]) {
45564557
td::actor::send_closure(x, &ValidatorEngine::set_validator_telemetry_filename, s);
45574558
});
45584559
});
4560+
p.add_option(
4561+
'\0', "disable-state-serializer",
4562+
"disable persistent state serializer (similar to set-state-serializer-enabled 0 in validator console)", [&]() {
4563+
acts.push_back([&x]() { td::actor::send_closure(x, &ValidatorEngine::set_state_serializer_disabled_flag); });
4564+
});
45594565
auto S = p.run(argc, argv);
45604566
if (S.is_error()) {
45614567
LOG(ERROR) << "failed to parse options: " << S.move_as_error();

validator-engine/validator-engine.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ class ValidatorEngine : public td::actor::Actor {
228228
std::string validator_telemetry_filename_;
229229
bool not_all_shards_ = false;
230230
std::vector<ton::ShardIdFull> add_shard_cmds_;
231+
bool state_serializer_disabled_flag_ = false;
231232

232233
std::set<ton::CatchainSeqno> unsafe_catchains_;
233234
std::map<ton::BlockSeqno, std::pair<ton::CatchainSeqno, td::uint32>> unsafe_catchain_rotations_;
@@ -325,6 +326,9 @@ class ValidatorEngine : public td::actor::Actor {
325326
void add_shard_cmd(ton::ShardIdFull shard) {
326327
add_shard_cmds_.push_back(shard);
327328
}
329+
void set_state_serializer_disabled_flag() {
330+
state_serializer_disabled_flag_ = true;
331+
}
328332

329333
void start_up() override;
330334
ValidatorEngine() {

validator/db/archive-manager.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,30 @@ void ArchiveManager::set_async_mode(bool mode, td::Promise<td::Unit> promise) {
11961196
}
11971197
}
11981198

1199+
void ArchiveManager::prepare_stats(td::Promise<std::vector<std::pair<std::string, std::string>>> promise) {
1200+
std::vector<std::pair<std::string, std::string>> stats;
1201+
{
1202+
std::map<BlockSeqno, td::uint64> states;
1203+
for (auto &[key, file] : perm_states_) {
1204+
BlockSeqno seqno = key.first;
1205+
auto r_stat = td::stat(db_root_ + "/archive/states/" + file.filename_short());
1206+
if (r_stat.is_error()) {
1207+
LOG(WARNING) << "Cannot stat persistent state file " << file.filename_short() << " : " << r_stat.move_as_error();
1208+
} else {
1209+
states[seqno] += r_stat.move_as_ok().size_;
1210+
}
1211+
}
1212+
td::StringBuilder sb;
1213+
for (auto &[seqno, size] : states) {
1214+
sb << seqno << ":" << td::format::as_size(size) << " ";
1215+
}
1216+
if (!sb.as_cslice().empty()) {
1217+
stats.emplace_back("persistent_states", sb.as_cslice().str());
1218+
}
1219+
}
1220+
promise.set_value(std::move(stats));
1221+
}
1222+
11991223
void ArchiveManager::truncate(BlockSeqno masterchain_seqno, ConstBlockHandle handle, td::Promise<td::Unit> promise) {
12001224
index_->begin_transaction().ensure();
12011225
td::MultiPromise mp;

validator/db/archive-manager.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ class ArchiveManager : public td::actor::Actor {
8181
cur_shard_split_depth_ = value;
8282
}
8383

84+
void prepare_stats(td::Promise<std::vector<std::pair<std::string, std::string>>> promise);
85+
8486
static constexpr td::uint32 archive_size() {
8587
return 20000;
8688
}

validator/db/celldb.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,17 @@ void CellDbIn::start_up() {
158158
},
159159
td::Timestamp::now());
160160
}
161+
162+
{
163+
std::string key = "stats.last_deleted_mc_seqno", value;
164+
auto R = cell_db_->get(td::as_slice(key), value);
165+
R.ensure();
166+
if (R.ok() == td::KeyValue::GetStatus::Ok) {
167+
auto r_value = td::to_integer_safe<BlockSeqno>(value);
168+
r_value.ensure();
169+
last_deleted_mc_state_ = r_value.move_as_ok();
170+
}
171+
}
161172
}
162173

163174
void CellDbIn::load_cell(RootHash hash, td::Promise<td::Ref<vm::DataCell>> promise) {
@@ -452,6 +463,11 @@ void CellDbIn::gc_cont2(BlockHandle handle) {
452463
cell_db_->erase(get_key(key_hash)).ensure();
453464
set_block(F.prev, std::move(P));
454465
set_block(F.next, std::move(N));
466+
if (handle->id().is_masterchain()) {
467+
last_deleted_mc_state_ = handle->id().seqno();
468+
std::string key = "stats.last_deleted_mc_seqno", value = td::to_string(last_deleted_mc_state_);
469+
cell_db_->set(td::as_slice(key), td::as_slice(value));
470+
}
455471
cell_db_->commit_write_batch().ensure();
456472
alarm_timestamp() = td::Timestamp::now();
457473
timer_write_batch.reset();
@@ -475,9 +491,6 @@ void CellDbIn::gc_cont2(BlockHandle handle) {
475491
if (!opts_->get_disable_rocksdb_stats()) {
476492
cell_db_statistics_.gc_cell_time_.insert(timer.elapsed() * 1e6);
477493
}
478-
if (handle->id().is_masterchain()) {
479-
last_deleted_mc_state_ = handle->id().seqno();
480-
}
481494
LOG(DEBUG) << "Deleted state " << handle->id().to_str();
482495
timer_finish.reset();
483496
timer_all.reset();

validator/db/rootdb.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ void RootDb::allow_block_gc(BlockIdExt block_id, td::Promise<bool> promise) {
438438
void RootDb::prepare_stats(td::Promise<std::vector<std::pair<std::string, std::string>>> promise) {
439439
auto merger = StatsMerger::create(std::move(promise));
440440
td::actor::send_closure(cell_db_, &CellDb::prepare_stats, merger.make_promise("celldb."));
441+
td::actor::send_closure(archive_db_, &ArchiveManager::prepare_stats, merger.make_promise("archive."));
441442
}
442443

443444
void RootDb::truncate(BlockSeqno seqno, ConstBlockHandle handle, td::Promise<td::Unit> promise) {

validator/downloaders/download-state.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ DownloadShardState::DownloadShardState(BlockIdExt block_id, BlockIdExt mastercha
3838
}
3939

4040
void DownloadShardState::start_up() {
41+
status_ = ProcessStatus(manager_, "process.download_state");
4142
alarm_timestamp() = timeout_;
4243

4344
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<BlockHandle> R) {
@@ -81,6 +82,7 @@ void DownloadShardState::download_state() {
8182
});
8283
td::actor::send_closure(manager_, &ValidatorManager::send_get_block_proof_link_request, block_id_, priority_,
8384
std::move(P));
85+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : downloading proof");
8486
}
8587

8688
void DownloadShardState::downloaded_proof_link(td::BufferSlice data) {
@@ -123,6 +125,7 @@ void DownloadShardState::checked_proof_link() {
123125
td::actor::send_closure(manager_, &ValidatorManager::send_get_persistent_state_request, block_id_,
124126
masterchain_block_id_, priority_, std::move(P));
125127
}
128+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : downloading state");
126129
}
127130

128131
void DownloadShardState::download_zero_state() {
@@ -152,6 +155,7 @@ void DownloadShardState::downloaded_zero_state(td::BufferSlice data) {
152155
}
153156

154157
void DownloadShardState::downloaded_shard_state(td::BufferSlice data) {
158+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : processing downloaded state");
155159
auto S = create_shard_state(block_id_, data.clone());
156160
if (S.is_error()) {
157161
fail_handler(actor_id(this), S.move_as_error());
@@ -174,6 +178,7 @@ void DownloadShardState::downloaded_shard_state(td::BufferSlice data) {
174178
}
175179

176180
void DownloadShardState::checked_shard_state() {
181+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : storing state file");
177182
LOG(WARNING) << "checked shard state " << block_id_.to_str();
178183
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Unit> R) {
179184
R.ensure();
@@ -189,6 +194,7 @@ void DownloadShardState::checked_shard_state() {
189194
}
190195

191196
void DownloadShardState::written_shard_state_file() {
197+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : storing state to celldb");
192198
LOG(WARNING) << "written shard state file " << block_id_.to_str();
193199
auto P = td::PromiseCreator::lambda([SelfId = actor_id(this)](td::Result<td::Ref<ShardState>> R) {
194200
R.ensure();
@@ -198,6 +204,7 @@ void DownloadShardState::written_shard_state_file() {
198204
}
199205

200206
void DownloadShardState::written_shard_state(td::Ref<ShardState> state) {
207+
status_.set_status(PSTRING() << block_id_.id.to_str() << " : finishing");
201208
state_ = std::move(state);
202209
handle_->set_unix_time(state_->get_unix_time());
203210
handle_->set_is_key_block(block_id_.is_masterchain());

validator/downloaders/download-state.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#pragma once
2020

2121
#include "validator/interfaces/validator-manager.h"
22+
#include "stats-provider.h"
2223

2324
namespace ton {
2425

@@ -67,6 +68,8 @@ class DownloadShardState : public td::actor::Actor {
6768

6869
td::BufferSlice data_;
6970
td::Ref<ShardState> state_;
71+
72+
ProcessStatus status_;
7073
};
7174

7275
} // namespace validator

validator/impl/collator-impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Collator final : public td::actor::Actor {
5050
using LtCellRef = block::LtCellRef;
5151
using NewOutMsg = block::NewOutMsg;
5252
const ShardIdFull shard_;
53-
ton::BlockId new_id;
53+
ton::BlockId new_id{workchainInvalid, 0, 0};
5454
bool busy_{false};
5555
bool before_split_{false};
5656
bool after_split_{false};

0 commit comments

Comments
 (0)