mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Cache recent block states and adjust timeouts (#823)
* Add parameter --celldb-compress-depth to speed up celldb * Fix collator timeout * Add block_state_cache * Adjust state cache ttl * Don't merge shards when queue is too big * Decrease lt limit if previous block is too old --------- Co-authored-by: SpyCheese <mikle98@yandex.ru>
This commit is contained in:
parent
7fcf267717
commit
9b6d699c21
20 changed files with 230 additions and 37 deletions
|
@ -27,16 +27,25 @@ namespace vm {
|
|||
namespace {
|
||||
class RefcntCellStorer {
|
||||
public:
|
||||
RefcntCellStorer(td::int32 refcnt, const DataCell &cell) : refcnt_(refcnt), cell_(cell) {
|
||||
RefcntCellStorer(td::int32 refcnt, const td::Ref<DataCell> &cell, bool as_boc)
|
||||
: refcnt_(refcnt), cell_(cell), as_boc_(as_boc) {
|
||||
}
|
||||
|
||||
template <class StorerT>
|
||||
void store(StorerT &storer) const {
|
||||
using td::store;
|
||||
if (as_boc_) {
|
||||
td::int32 tag = -1;
|
||||
store(tag, storer);
|
||||
store(refcnt_, storer);
|
||||
td::BufferSlice data = vm::std_boc_serialize(cell_).move_as_ok();
|
||||
storer.store_slice(data);
|
||||
return;
|
||||
}
|
||||
store(refcnt_, storer);
|
||||
store(cell_, storer);
|
||||
for (unsigned i = 0; i < cell_.size_refs(); i++) {
|
||||
auto cell = cell_.get_ref(i);
|
||||
store(*cell_, storer);
|
||||
for (unsigned i = 0; i < cell_->size_refs(); i++) {
|
||||
auto cell = cell_->get_ref(i);
|
||||
auto level_mask = cell->get_level_mask();
|
||||
auto level = level_mask.get_level();
|
||||
td::uint8 x = static_cast<td::uint8>(level_mask.get_mask());
|
||||
|
@ -60,7 +69,8 @@ class RefcntCellStorer {
|
|||
|
||||
private:
|
||||
td::int32 refcnt_;
|
||||
const DataCell &cell_;
|
||||
td::Ref<DataCell> cell_;
|
||||
bool as_boc_;
|
||||
};
|
||||
|
||||
class RefcntCellParser {
|
||||
|
@ -69,11 +79,17 @@ class RefcntCellParser {
|
|||
}
|
||||
td::int32 refcnt;
|
||||
Ref<DataCell> cell;
|
||||
bool stored_boc_;
|
||||
|
||||
template <class ParserT>
|
||||
void parse(ParserT &parser, ExtCellCreator &ext_cell_creator) {
|
||||
using ::td::parse;
|
||||
parse(refcnt, parser);
|
||||
stored_boc_ = false;
|
||||
if (refcnt == -1) {
|
||||
stored_boc_ = true;
|
||||
parse(refcnt, parser);
|
||||
}
|
||||
if (!need_data_) {
|
||||
return;
|
||||
}
|
||||
|
@ -81,6 +97,12 @@ class RefcntCellParser {
|
|||
TRY_STATUS(parser.get_status());
|
||||
auto size = parser.get_left_len();
|
||||
td::Slice data = parser.template fetch_string_raw<td::Slice>(size);
|
||||
if (stored_boc_) {
|
||||
TRY_RESULT(boc, vm::std_boc_deserialize(data));
|
||||
TRY_RESULT(loaded_cell, boc->load_cell());
|
||||
cell = std::move(loaded_cell.data_cell);
|
||||
return td::Status::OK();
|
||||
}
|
||||
CellSerializationInfo info;
|
||||
auto cell_data = data;
|
||||
TRY_STATUS(info.init(cell_data, 0 /*ref_byte_size*/));
|
||||
|
@ -122,7 +144,8 @@ class RefcntCellParser {
|
|||
};
|
||||
} // namespace
|
||||
|
||||
CellLoader::CellLoader(std::shared_ptr<KeyValueReader> reader) : reader_(std::move(reader)) {
|
||||
CellLoader::CellLoader(std::shared_ptr<KeyValueReader> reader, std::function<void(const LoadResult &)> on_load_callback)
|
||||
: reader_(std::move(reader)), on_load_callback_(std::move(on_load_callback)) {
|
||||
CHECK(reader_);
|
||||
}
|
||||
|
||||
|
@ -145,7 +168,11 @@ td::Result<CellLoader::LoadResult> CellLoader::load(td::Slice hash, bool need_da
|
|||
|
||||
res.refcnt_ = refcnt_cell.refcnt;
|
||||
res.cell_ = std::move(refcnt_cell.cell);
|
||||
res.stored_boc_ = refcnt_cell.stored_boc_;
|
||||
//CHECK(res.cell_->get_hash() == hash);
|
||||
if (on_load_callback_) {
|
||||
on_load_callback_(res);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -157,7 +184,7 @@ td::Status CellStorer::erase(td::Slice hash) {
|
|||
return kv_.erase(hash);
|
||||
}
|
||||
|
||||
td::Status CellStorer::set(td::int32 refcnt, const DataCell &cell) {
|
||||
return kv_.set(cell.get_hash().as_slice(), td::serialize(RefcntCellStorer(refcnt, cell)));
|
||||
td::Status CellStorer::set(td::int32 refcnt, const td::Ref<DataCell> &cell, bool as_boc) {
|
||||
return kv_.set(cell->get_hash().as_slice(), td::serialize(RefcntCellStorer(refcnt, cell, as_boc)));
|
||||
}
|
||||
} // namespace vm
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue