@@ -311,9 +311,6 @@ void ArchiveManager::get_file(ConstBlockHandle handle, FileReference ref_id, td:
311311}
312312
313313void ArchiveManager::register_perm_state (FileReferenceShort id) {
314- BlockSeqno masterchain_seqno = 0 ;
315- id.ref ().visit (td::overloaded (
316- [&](const fileref::PersistentStateShort &x) { masterchain_seqno = x.masterchain_seqno ; }, [&](const auto &) {}));
317314 td::uint64 size;
318315 auto r_stat = td::stat (db_root_ + " /archive/states/" + id.filename_short ());
319316 if (r_stat.is_error ()) {
@@ -322,7 +319,7 @@ void ArchiveManager::register_perm_state(FileReferenceShort id) {
322319 } else {
323320 size = r_stat.ok ().size_ ;
324321 }
325- perm_states_[{masterchain_seqno , id.hash ()}] = {.id = id, .size = size};
322+ perm_states_[{id. seqno_of_persistent_state () , id.hash ()}] = {.id = id, .size = size};
326323}
327324
328325void ArchiveManager::add_zero_state (BlockIdExt block_id, td::BufferSlice data, td::Promise<td::Unit> promise) {
@@ -347,14 +344,33 @@ void ArchiveManager::add_zero_state(BlockIdExt block_id, td::BufferSlice data, t
347344 .release ();
348345}
349346
347+ namespace {
348+
349+ FileReferenceShort create_persistent_state_id (BlockIdExt block_id, BlockIdExt mc_block_id, PersistentStateType type) {
350+ FileReferenceShort result;
351+ type.visit (td::overloaded (
352+ [&](UnsplitStateType const &) { result = fileref::PersistentStateShort::create (block_id, mc_block_id); },
353+ [&](SplitAccountStateType const &account_state) {
354+ result = fileref::SplitAccountState::create (block_id, mc_block_id, account_state.effective_shard_id );
355+ },
356+ [&](SplitPersistentStateType const &persistent_state) {
357+ result = fileref::SplitPersistentState::create (block_id, mc_block_id);
358+ }));
359+ return result;
360+ }
361+
362+ } // namespace
363+
350364void ArchiveManager::add_persistent_state (BlockIdExt block_id, BlockIdExt masterchain_block_id, td::BufferSlice data,
351365 td::Promise<td::Unit> promise) {
352366 auto create_writer = [&](std::string path, td::Promise<std::string> P) {
353367 td::actor::create_actor<db::WriteFile>(" writefile" , db_root_ + " /archive/tmp/" , std::move (path), std::move (data),
354368 std::move (P))
355369 .release ();
356370 };
357- add_persistent_state_impl (block_id, masterchain_block_id, std::move (promise), std::move (create_writer));
371+ // TODO: Allow specifying state type.
372+ add_persistent_state_impl (create_persistent_state_id (block_id, masterchain_block_id, UnsplitStateType{}),
373+ std::move (promise), std::move (create_writer));
358374}
359375
360376void ArchiveManager::add_persistent_state_gen (BlockIdExt block_id, BlockIdExt masterchain_block_id,
@@ -365,23 +381,22 @@ void ArchiveManager::add_persistent_state_gen(BlockIdExt block_id, BlockIdExt ma
365381 std::move (write_state), std::move (P))
366382 .release ();
367383 };
368- add_persistent_state_impl (block_id, masterchain_block_id, std::move (promise), std::move (create_writer));
384+ // TODO: Allow specifying state type.
385+ add_persistent_state_impl (create_persistent_state_id (block_id, masterchain_block_id, UnsplitStateType{}),
386+ std::move (promise), std::move (create_writer));
369387}
370388
371389void ArchiveManager::add_persistent_state_impl (
372- BlockIdExt block_id, BlockIdExt masterchain_block_id , td::Promise<td::Unit> promise,
390+ FileReferenceShort const &id , td::Promise<td::Unit> promise,
373391 std::function<void (std::string, td::Promise<std::string>)> create_writer) {
374- auto id = FileReference{fileref::PersistentState{block_id, masterchain_block_id}};
375- BlockSeqno masterchain_seqno = masterchain_block_id.seqno ();
376- auto hash = id.hash ();
377- if (perm_states_.find ({masterchain_seqno, hash}) != perm_states_.end ()) {
392+ if (perm_states_.find ({id.seqno_of_persistent_state (), id.hash ()}) != perm_states_.end ()) {
378393 promise.set_value (td::Unit ());
379394 return ;
380395 }
381396
382397 auto path = db_root_ + " /archive/states/" + id.filename_short ();
383398 auto P = td::PromiseCreator::lambda (
384- [SelfId = actor_id (this ), id = id. shortref () , promise = std::move (promise)](td::Result<std::string> R) mutable {
399+ [SelfId = actor_id (this ), id = id, promise = std::move (promise)](td::Result<std::string> R) mutable {
385400 if (R.is_error ()) {
386401 promise.set_error (R.move_as_error ());
387402 } else {
@@ -436,7 +451,8 @@ void ArchiveManager::get_previous_persistent_state_files(
436451
437452void ArchiveManager::get_persistent_state (BlockIdExt block_id, BlockIdExt masterchain_block_id,
438453 td::Promise<td::BufferSlice> promise) {
439- auto id = FileReference{fileref::PersistentState{block_id, masterchain_block_id}};
454+ // TODO: Allow specifying state type.
455+ auto id = create_persistent_state_id (block_id, masterchain_block_id, UnsplitStateType{});
440456 auto hash = id.hash ();
441457 if (perm_states_.find ({masterchain_block_id.seqno (), hash}) == perm_states_.end ()) {
442458 promise.set_error (td::Status::Error (ErrorCode::notready, " state file not in db" ));
@@ -449,7 +465,8 @@ void ArchiveManager::get_persistent_state(BlockIdExt block_id, BlockIdExt master
449465
450466void ArchiveManager::get_persistent_state_slice (BlockIdExt block_id, BlockIdExt masterchain_block_id, td::int64 offset,
451467 td::int64 max_size, td::Promise<td::BufferSlice> promise) {
452- auto id = FileReference{fileref::PersistentState{block_id, masterchain_block_id}};
468+ // TODO: Allow specifying state type.
469+ auto id = create_persistent_state_id (block_id, masterchain_block_id, UnsplitStateType{});
453470 auto hash = id.hash ();
454471 if (perm_states_.find ({masterchain_block_id.seqno (), hash}) == perm_states_.end ()) {
455472 promise.set_error (td::Status::Error (ErrorCode::notready, " state file not in db" ));
@@ -462,7 +479,8 @@ void ArchiveManager::get_persistent_state_slice(BlockIdExt block_id, BlockIdExt
462479
463480void ArchiveManager::get_persistent_state_file_size (BlockIdExt block_id, BlockIdExt masterchain_block_id,
464481 td::Promise<td::uint64> promise) {
465- auto id = FileReference{fileref::PersistentState{block_id, masterchain_block_id}};
482+ // TODO: Allow specifying state type.
483+ auto id = create_persistent_state_id (block_id, masterchain_block_id, UnsplitStateType{});
466484 auto hash = id.hash ();
467485 auto it = perm_states_.find ({masterchain_block_id.seqno (), hash});
468486 if (it == perm_states_.end ()) {
@@ -918,6 +936,11 @@ void ArchiveManager::start_up() {
918936 R = FileReferenceShort::create (newfname);
919937 R.ensure ();
920938 }
939+ if (!R.ok ().is_state_like ()) {
940+ LOG (ERROR) << " deleting file that is not state-like '" << fname << " '" ;
941+ td::unlink (db_root_ + " /archive/states/" + fname.str ()).ignore ();
942+ return ;
943+ }
921944 register_perm_state (R.move_as_ok ());
922945 }
923946 }).ensure ();
@@ -1037,6 +1060,14 @@ void ArchiveManager::persistent_state_gc(std::pair<BlockSeqno, FileHash> last) {
10371060 res = 0 ;
10381061 seqno = x.masterchain_seqno ;
10391062 },
1063+ [&](const fileref::SplitAccountState &x) {
1064+ res = 0 ;
1065+ seqno = x.masterchain_seqno ;
1066+ },
1067+ [&](const fileref::SplitPersistentState &x) {
1068+ res = 0 ;
1069+ seqno = x.masterchain_seqno ;
1070+ },
10401071 [&](const auto &obj) { res = -1 ; }));
10411072
10421073 if (res == -1 ) {
@@ -1315,6 +1346,8 @@ void ArchiveManager::truncate(BlockSeqno masterchain_seqno, ConstBlockHandle han
13151346 it->second .id .ref ().visit (td::overloaded (
13161347 [&](const fileref::ZeroStateShort &x) { res = -1 ; },
13171348 [&](const fileref::PersistentStateShort &x) { res = x.masterchain_seqno <= masterchain_seqno ? -1 : 1 ; },
1349+ [&](const fileref::SplitPersistentState &x) { res = x.masterchain_seqno <= masterchain_seqno ? -1 : 1 ; },
1350+ [&](const fileref::SplitAccountState &x) { res = x.masterchain_seqno <= masterchain_seqno ? -1 : 1 ; },
13181351 [&](const auto &obj) { res = 1 ; }));
13191352 if (res <= 0 ) {
13201353 it++;
0 commit comments