Skip to content

Commit 9b2933c

Browse files
authored
Store shard archives separately even if monitor_min_split = 0 (#1689)
1 parent d4fcef4 commit 9b2933c

File tree

3 files changed

+23
-21
lines changed

3 files changed

+23
-21
lines changed

validator/db/archive-slice.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,14 @@ void ArchiveSlice::get_slice(td::uint64 archive_id, td::uint64 offset, td::uint3
554554
before_query();
555555
auto value = static_cast<td::uint32>(archive_id >> 32);
556556
PackageInfo *p;
557-
if (shard_split_depth_ == 0) {
558-
TRY_RESULT_PROMISE_ASSIGN(promise, p, choose_package(value, ShardIdFull{masterchainId}, false));
559-
} else {
557+
if (shard_separated_) {
560558
if (value >= packages_.size()) {
561559
promise.set_error(td::Status::Error(ErrorCode::notready, "no such package"));
562560
return;
563561
}
564562
p = &packages_[value];
563+
} else {
564+
TRY_RESULT_PROMISE_ASSIGN(promise, p, choose_package(value, ShardIdFull{masterchainId}, false));
565565
}
566566
promise = begin_async_query(std::move(promise));
567567
td::actor::create_actor<db::ReadFile>("readfile", p->path, offset, limit, 0, std::move(promise)).release();
@@ -574,10 +574,10 @@ void ArchiveSlice::get_archive_id(BlockSeqno masterchain_seqno, ShardIdFull shar
574574
promise.set_result(archive_id_);
575575
} else {
576576
TRY_RESULT_PROMISE(promise, p, choose_package(masterchain_seqno, shard_prefix, false));
577-
if (shard_split_depth_ == 0) {
578-
promise.set_result(p->seqno * (1ull << 32) + archive_id_);
579-
} else {
577+
if (shard_separated_) {
580578
promise.set_result(p->idx * (1ull << 32) + archive_id_);
579+
} else {
580+
promise.set_result(p->seqno * (1ull << 32) + archive_id_);
581581
}
582582
}
583583
}
@@ -609,8 +609,10 @@ void ArchiveSlice::before_query() {
609609
if (R2.move_as_ok() == td::KeyValue::GetStatus::Ok) {
610610
shard_split_depth_ = td::to_integer<td::uint32>(value);
611611
CHECK(shard_split_depth_ <= 60);
612+
shard_separated_ = true;
612613
} else {
613614
shard_split_depth_ = 0;
615+
shard_separated_ = false;
614616
}
615617
for (td::uint32 i = 0; i < tot; i++) {
616618
R2 = kv_->get(PSTRING() << "status." << i, value);
@@ -625,16 +627,16 @@ void ArchiveSlice::before_query() {
625627
}
626628
td::uint32 seqno;
627629
ShardIdFull shard_prefix;
628-
if (shard_split_depth_ == 0) {
629-
seqno = archive_id_ + slice_size_ * i;
630-
shard_prefix = ShardIdFull{masterchainId};
631-
} else {
630+
if (shard_separated_) {
632631
R2 = kv_->get(PSTRING() << "info." << i, value);
633632
R2.ensure();
634633
CHECK(R2.move_as_ok() == td::KeyValue::GetStatus::Ok);
635634
unsigned long long shard;
636635
CHECK(sscanf(value.c_str(), "%u.%d:%016llx", &seqno, &shard_prefix.workchain, &shard) == 3);
637636
shard_prefix.shard = shard;
637+
} else {
638+
seqno = archive_id_ + slice_size_ * i;
639+
shard_prefix = ShardIdFull{masterchainId};
638640
}
639641
add_package(seqno, shard_prefix, len, ver);
640642
}
@@ -651,10 +653,9 @@ void ArchiveSlice::before_query() {
651653
kv_->set("slice_size", td::to_string(slice_size_)).ensure();
652654
kv_->set("status.0", "0").ensure();
653655
kv_->set("version.0", td::to_string(default_package_version())).ensure();
654-
if (shard_split_depth_ > 0) {
655-
kv_->set("info.0", package_info_to_str(archive_id_, ShardIdFull{masterchainId})).ensure();
656-
kv_->set("shard_split_depth", td::to_string(shard_split_depth_)).ensure();
657-
}
656+
shard_separated_ = true;
657+
kv_->set("info.0", package_info_to_str(archive_id_, ShardIdFull{masterchainId})).ensure();
658+
kv_->set("shard_split_depth", td::to_string(shard_split_depth_)).ensure();
658659
kv_->commit_transaction().ensure();
659660
add_package(archive_id_, ShardIdFull{masterchainId}, 0, default_package_version());
660661
} else {
@@ -779,7 +780,7 @@ td::Result<ArchiveSlice::PackageInfo *> ArchiveSlice::choose_package(BlockSeqno
779780
}
780781
masterchain_seqno -= (masterchain_seqno - archive_id_) % slice_size_;
781782
CHECK((masterchain_seqno - archive_id_) % slice_size_ == 0);
782-
if (shard_split_depth_ == 0) {
783+
if (!shard_separated_) {
783784
shard_prefix = ShardIdFull{masterchainId};
784785
} else if (!shard_prefix.is_masterchain()) {
785786
shard_prefix.shard |= 1; // In case length is < split depth
@@ -795,7 +796,7 @@ td::Result<ArchiveSlice::PackageInfo *> ArchiveSlice::choose_package(BlockSeqno
795796
kv_->set("slices", td::to_string(v + 1)).ensure();
796797
kv_->set(PSTRING() << "status." << v, "0").ensure();
797798
kv_->set(PSTRING() << "version." << v, td::to_string(default_package_version())).ensure();
798-
if (shard_split_depth_ > 0) {
799+
if (shard_separated_) {
799800
kv_->set(PSTRING() << "info." << v, package_info_to_str(masterchain_seqno, shard_prefix)).ensure();
800801
}
801802
commit_transaction();
@@ -1079,7 +1080,7 @@ void ArchiveSlice::truncate(BlockSeqno masterchain_seqno, ConstBlockHandle, td::
10791080
package.idx = i;
10801081
kv_->set(PSTRING() << "status." << i, td::to_string(package.package->size())).ensure();
10811082
kv_->set(PSTRING() << "version." << i, td::to_string(package.version)).ensure();
1082-
if (shard_split_depth_ > 0) {
1083+
if (shard_separated_) {
10831084
kv_->set(PSTRING() << "info." << i, package_info_to_str(package.seqno, package.shard_prefix)).ensure();
10841085
}
10851086
id_to_package_[{package.seqno, package.shard_prefix}] = i;

validator/db/archive-slice.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class ArchiveSlice : public td::actor::Actor {
159159
bool sliced_mode_{false};
160160
td::uint32 huge_transaction_size_ = 0;
161161
td::uint32 slice_size_{100};
162+
bool shard_separated_{false};
162163
td::uint32 shard_split_depth_ = 0;
163164

164165
enum Status {

validator/import-db-slice.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,10 @@ void ArchiveImporter::checked_all_masterchain_blocks() {
300300
void ArchiveImporter::download_shard_archives(td::Ref<MasterchainState> start_state) {
301301
start_state_ = start_state;
302302
td::uint32 monitor_min_split = start_state->monitor_min_split_depth(basechainId);
303-
LOG(DEBUG) << "Monitor min split = " << monitor_min_split;
304-
// If monitor_min_split == 0, we use the old archive format (packages are not separated by shard)
303+
LOG(DEBUG) << "Monitor min split = " << monitor_min_split
304+
<< (have_shard_blocks_ ? ", shard blocks in the main package" : ", no shard blocks in the main package");
305305
// If masterchain package has shard blocks then it's old archive format, don't need to download shards
306-
if (monitor_min_split > 0 && !have_shard_blocks_ && !use_imported_files_) {
306+
if (!have_shard_blocks_ && !use_imported_files_) {
307307
for (td::uint64 i = 0; i < (1ULL << monitor_min_split); ++i) {
308308
ShardIdFull shard_prefix{basechainId, (i * 2 + 1) << (64 - monitor_min_split - 1)};
309309
if (opts_->need_monitor(shard_prefix, start_state)) {
@@ -313,7 +313,7 @@ void ArchiveImporter::download_shard_archives(td::Ref<MasterchainState> start_st
313313
}
314314
}
315315
} else {
316-
LOG(DEBUG) << "Skip downloading shard archives";
316+
LOG(INFO) << "Skip downloading shard archives";
317317
}
318318
if (pending_shard_archives_ == 0) {
319319
check_next_shard_client_seqno(shard_client_seqno_ + 1);

0 commit comments

Comments
 (0)