Skip to content
This repository has been archived by the owner on Jan 22, 2025. It is now read-only.

Account files remove #26910

Merged
merged 9 commits into from
Aug 20, 2022
Merged

Conversation

xiangzhu70
Copy link
Contributor

@xiangzhu70 xiangzhu70 commented Aug 3, 2022

Problem

The validator logs show that clean_accounts_paths takes too long time. This moves files deleting work to an async background task, unblocking validator new() to move forward without waiting for the deletion to be done.

INFO solana_core::validator] done. clean_accounts_paths took 14.5s

Summary of Changes

Rename the files first, which should take much less time than deleting them.
Call an async task to remove the files in async context, let the validator init to go forward without blocking on it.

Before the validator process starts, there is 105GB files in the directory, which would take 14s before the change.
sol@dev-server-da11:~$ du /mnt/nvme1n1/ledger/accounts
98832856 /mnt/nvme1n1/ledger/accounts/accounts
105338348 /mnt/nvme1n1/ledger/accounts

With the change, there is no more 14s waiting.
1984890 [2022-08-17T21:22:08.428526819Z INFO solana_core::validator] Cleaning accounts paths..
1984891 [2022-08-17T21:22:08.428580241Z INFO solana_core::validator] done. clean_accounts_paths took 43us

Fixes #

@stale
Copy link

stale bot commented Aug 13, 2022

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.

@stale stale bot added stale [bot only] Added to stale content; results in auto-close after a week. and removed stale [bot only] Added to stale content; results in auto-close after a week. labels Aug 13, 2022
@xiangzhu70 xiangzhu70 force-pushed the account_files_remove branch from b8722d0 to a8449e8 Compare August 17, 2022 00:13
let mut del_path_str = OsString::from(path);
del_path_str.push("_deleted");
let mut loop_count: i32 = 0;
loop {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest just:

  1. calculate path_delete
  2. remove directory path_delete
  3. rename path to path_delete

This simplifies things. And it keeps this process from growing out of control if we fail at startup quickly somehow.
Step 2 will take 0 time for any normal case.

@brooksprumo
Copy link
Contributor

I like this idea, should definitely help speed up startup. Note, I didn't fully review the code!

With that said, here's the general approach I would use, in pseudo-code:

in a thread or async fn
    create a temp dir [^1]
    move all the account paths into temp dir
    close/drop the temp dir, which will remove it and everything inside

[^1] temp dir: https://docs.rs/tempfile/latest/tempfile/fn.tempdir.html

This way I don't think you'll need to handle calling any remove/delete functions directly.

@jeffwashington
Copy link
Contributor

I like this idea, should definitely help speed up startup. Note, I didn't fully review the code!

With that said, here's the general approach I would use, in pseudo-code:

in a thread or async fn
    create a temp dir [^1]
    move all the account paths into temp dir
    close/drop the temp dir, which will remove it and everything inside

[^1] temp dir: https://docs.rs/tempfile/latest/tempfile/fn.tempdir.html

This way I don't think you'll need to handle calling any remove/delete functions directly.

An issue here is that the temp dir could be on a different drive than the accounts folder.
I think we should stick with the current method atm.

@jeffwashington jeffwashington self-requested a review August 18, 2022 20:54
Copy link
Contributor

@jeffwashington jeffwashington left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just change up the path and then looks good to me.

@mergify mergify bot dismissed jeffwashington’s stale review August 19, 2022 01:14

Pull request has been modified.

@xiangzhu70
Copy link
Contributor Author

I like this idea, should definitely help speed up startup. Note, I didn't fully review the code!

With that said, here's the general approach I would use, in pseudo-code:

in a thread or async fn
    create a temp dir [^1]
    move all the account paths into temp dir
    close/drop the temp dir, which will remove it and everything inside

[^1] temp dir: https://docs.rs/tempfile/latest/tempfile/fn.tempdir.html

This way I don't think you'll need to handle calling any remove/delete functions directly.

I think this approach will make the rm_dir call inside the drop call, at some scope closing time. It is effectively the same as making the rm_dir call directly.

@xiangzhu70 xiangzhu70 marked this pull request as ready for review August 19, 2022 01:18
brooksprumo
brooksprumo previously approved these changes Aug 19, 2022
Copy link
Contributor

@brooksprumo brooksprumo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lgtm, with the nits noted. I'll defer to @jeffwashington for additional/final approval.

let path_delete = PathBuf::from(del_path_str);

if path_delete.exists() {
info!("{path_delete:?} exists, delete it first.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: For Paths, (and PathBuf), they have a .display() method for this purpose. I'd recommend that here, and all user-facing logs.

Suggested change
info!("{path_delete:?} exists, delete it first.");
info!("{} exists, delete it first.", path.display());

}

if !path.exists() {
info!("move_and_async_delete_path: path {path:?} does not exist");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same nit w.r.t. path.display().

Probably can also dial this log level down to debug!(). If we're trying to delete a file/directory and it doesn't exist, then the end result is the same :)

@brooksprumo
Copy link
Contributor

I think this approach will make the rm_dir call inside the drop call, at some scope closing time. It is effectively the same as making the rm_dir call directly.

Yah, the remove_dir_all() part is the same. The nice part is that TempDir handles the rename/collision part so we don't have to. But yeah, not needed for this PR.

Avoided OsString.
Made the function more generic with "impl AsRef<Path>"
@mergify mergify bot dismissed brooksprumo’s stale review August 20, 2022 00:23

Pull request has been modified.

@xiangzhu70 xiangzhu70 merged commit c54824e into solana-labs:master Aug 20, 2022
@xiangzhu70 xiangzhu70 deleted the account_files_remove branch August 20, 2022 06:57
.name("delete_path".to_string())
.spawn(move || {
std::fs::remove_dir_all(&path_delete).unwrap();
info!(
Copy link
Contributor

@jeffwashington jeffwashington Aug 20, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think get rid of this info. It is always true that this will be done in bg now.

));

if path_delete.exists() {
debug!("{} exists, delete it first.", path_delete.display());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think get rid of this. only useful for your debugging. nobody keeps debug logs turned on.

HaoranYi pushed a commit to HaoranYi/solana that referenced this pull request Aug 21, 2022
* Create a new function cleanup_accounts_paths, a trivial change

* Remove account files asynchronously

* Update and simplify the implementation after the validator test runs.

* Fixes after testing on the dev device

* Discard tokio.  Use thread instead

* Fix comments format

* Fix config type to pass the github test

* Fix failed tests.  Handle the case of non-existing path

* Final cleanup, addressing the review comments
Avoided OsString.
Made the function more generic with "impl AsRef<Path>"

Co-authored-by: Jeff Washington <[email protected]>
HaoranYi added a commit that referenced this pull request Aug 22, 2022
* refactor: extract store_stake_accounts fn

* refactor: extract store_vote_account fn

* refactor: extract reward history update fn

* remove avg point value from pay_valiator fn. not used

* clippy: slice

* clippy: slice

* remove abort() from test-validator (#27124)

* chore: bump bytes from 1.1.0 to 1.2.1 (#27172)

* chore: bump bytes from 1.1.0 to 1.2.1

Bumps [bytes](https://github.com/tokio-rs/bytes) from 1.1.0 to 1.2.1.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](tokio-rs/bytes@v1.1.0...v1.2.1)

---
updated-dependencies:
- dependency-name: bytes
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

* [auto-commit] Update all Cargo lock files

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot-buildkite <[email protected]>

* Share Ancestors API get with contains_key (#27161)

consolidate similar fns

* Rename to `MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA` (#27175)

* chore: bump libc from 0.2.129 to 0.2.131 (#27162)

* chore: bump libc from 0.2.129 to 0.2.131

Bumps [libc](https://github.com/rust-lang/libc) from 0.2.129 to 0.2.131.
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Commits](rust-lang/libc@0.2.129...0.2.131)

---
updated-dependencies:
- dependency-name: libc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

* [auto-commit] Update all Cargo lock files

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot-buildkite <[email protected]>

* reverts wide fanout in broadcast when the root node is down (#26359)

A change included in
#20480
was that when the root node in turbine broadcast tree is down, the
leader will broadcast the shred to all nodes in the first layer.
The intention was to mitigate the impact of dead nodes on shreds
propagation, because if the root node is down, then the entire cluster
will miss out the shred.
On the other hand, if x% of stake is down, this will cause 200*x% + 1
packets/shreds ratio at the broadcast stage which might contribute to
line-rate saturation and packet drop.
To avoid this bandwidth saturation issue, this commit reverts that logic
and always broadcasts shreds from the leader only to the root node.
As before we rely on erasure codes to recover shreds lost due to staked
nodes being offline.

* add getTokenLargestAccounts rpc method to rust client (#26840)

* add get token largest accounts rpc call to client

* split to include with commitment

* Bump spl-token-2022 (#27181)

* Bump token-2022 to 0.4.3

* Allow cargo to bump stuff to v1.11.5

* VoteProgram.safeWithdraw function to safeguard against accidental vote account closures (#26586)

feat: safe withdraw function

Co-authored-by: aschonfeld <[email protected]>

* chore: bump futures from 0.3.21 to 0.3.23 (#27182)

* chore: bump futures from 0.3.21 to 0.3.23

Bumps [futures](https://github.com/rust-lang/futures-rs) from 0.3.21 to 0.3.23.
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/master/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.21...0.3.23)

---
updated-dependencies:
- dependency-name: futures
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>

* [auto-commit] Update all Cargo lock files

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot-buildkite <[email protected]>

* chore: bump nix from 0.24.2 to 0.25.0 (#27179)

* chore: bump nix from 0.24.2 to 0.25.0

Bumps [nix](https://github.com/nix-rust/nix) from 0.24.2 to 0.25.0.
- [Release notes](https://github.com/nix-rust/nix/releases)
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](nix-rust/nix@v0.24.2...v0.25.0)

---
updated-dependencies:
- dependency-name: nix
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

* [auto-commit] Update all Cargo lock files

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot-buildkite <[email protected]>

* Parse ConfidentialTransaction instructions (#26825)

Parse ConfidentialTransfer instructions

* snapshots: serialize version file first (#27192)

serialize version file first

* serialize incremental_snapshot_hash (#26839)

* serialize incremental_snapshot_hash

* pr feedback

* derives Error trait for ClusterInfoError and core::result::Error (#27208)

* Add clean_accounts_for_tests() (#27200)

* Rust v1.63.0 (#27148)

* Upgrade to Rust v1.63.0

* Add nightly_clippy_allows

* Resolve some new clippy nightly lints

* Increase QUIC packets completion timeout

Co-authored-by: Michael Vines <[email protected]>

* docs: updated "transaction fees" page (#26861)

* docs: transaction fees, compute units, compute budget

* docs: added messages definition

* Revert "docs: added messages definition"

This reverts commit 3c56156.

* docs: added messages definition

* Update docs/src/transaction_fees.md

Co-authored-by: Jacob Creech <[email protected]>

* fix: updates from feedback

Co-authored-by: Jacob Creech <[email protected]>

* sdk: Fix args after "--" in build-bpf and test-bpf (#27221)

* Flaky Unit Test test_rpc_subscriptions (#27214)

Increase unit test timeout from 5 seconds to 10 seconds

* chore: only buildkite pipelines use sccache in docker-run.sh (#27204)

chore: only buildkite ci use sccache

* clean feature: `prevent_calling_precompiles_as_programs` (#27100)

* clean feature: prevent_calling_precompiles_as_programs

* fix tests

* fix test

* remove comment

* fix test

* feedback

* Add get_account_with_commitment to BenchTpsClient (#27176)

* Fix a corner-case panic in get_entries_in_data_block() (#27195)

#### Problem
get_entries_in_data_block() panics when there's inconsistency between
slot_meta and data_shred.

However, as we don't lock on reads, reading across multiple column families is
not atomic (especially for older slots) and thus does not guarantee consistency
as the background cleanup service could purge the slot in the middle.  Such
panic was reported in #26980 when the validator serves a high load of RPC calls.

#### Summary of Changes
This PR makes get_entries_in_data_block() panic only when the inconsistency
between slot-meta and data-shred happens on a slot older than lowest_cleanup_slot.

* Verify snapshot slot deltas (#26666)

* store-tool: log lamports for each account (#27168)

log lamports for each account

* add an assert for a debug feature to avoid wasted time (#27210)

* remove redundant call that bumps age to future (#27215)

* Use from_secs api to create duration (#27222)

use from_secs api to create duration

* reorder slot # in debug hash data path (#27217)

* create helper fn for clarity (#27216)

* Verifying snapshot bank must always specify the snapshot slot (#27234)

* Remove `Bank::ensure_no_storage_rewards_pool()` (#26468)

* cli: Add subcommands for address lookup tables (#27123)

* cli: Add subcommand for creating address lookup tables

* cli: Add additional subcommands for address lookup tables

* short commands

* adds hash domain to ping-pong protocol (#27193)

In order to maintain backward compatibility, for now the responding node
will hash the token both with and without domain so that the other node
will accept the response regardless of its upgrade status.
Once the cluster has upgraded to the new code, we will remove the legacy
domain = false case.

* Revert "Rust v1.63.0 (#27148)" (#27245)

This reverts commit a2e7bdf.

* correct double negation (#27240)

* Enable QUIC client by default. Add arg to disable QUIC client. (Forward port #26927) (#27194)

Enable QUIC client by default. Add arg to disable QUIC client.

* Enable QUIC client by default. Add arg to disable QUIC client.
* Deprecate --disable-quic-servers arg
* Add #[ignore] annotation to failing tests

* slots_connected: check if the range is connected (>= ending_slot) (#27152)

* create-snapshot check if snapshot slot exists (#27153)

* Add Bank::clean_accounts_for_tests() (#27209)

* Call `AccountsDb::shrink_all_slots()` directly (#27235)

* add ed25519_program to built-in instruction cost list (#27199)

* add ed25519_program to built-in instruction cost list

* Remove unnecessary and stale comment

* simple refactorings to disk idx (#27238)

* add _inclusive for clarity (#27239)

* eliminate unnecessary ZERO_RAW_LAMPORTS_SENTINEL (#27218)

* make test code more clear (#27260)

* banking stage: actually aggregate tracer packet stats (#27118)

* aggregated_tracer_packet_stats_option was alwasys None

* Actually accumulate tracer packet stats

* Refactor epoch reward 1 (#27253)

* refactor: extract store_stake_accounts fn

* clippy: slice

Co-authored-by: haoran <haoran@mbook>

* recovers merkle shreds from erasure codes (#27136)

The commit
* Identifies Merkle shreds when recovering from erasure codes and
  dispatches specialized code to reconstruct shreds.
* Coding shred headers are added to recovered erasure shards.
* Merkle tree is reconstructed for the erasure batch and added to
  recovered shreds.
* The common signature (for the root of Merkle tree) is attached to all
  recovered shreds.

* Simplify `Bank::clean_accounts()` by removing params (#27254)

* Account files remove (#26910)

* Create a new function cleanup_accounts_paths, a trivial change

* Remove account files asynchronously

* Update and simplify the implementation after the validator test runs.

* Fixes after testing on the dev device

* Discard tokio.  Use thread instead

* Fix comments format

* Fix config type to pass the github test

* Fix failed tests.  Handle the case of non-existing path

* Final cleanup, addressing the review comments
Avoided OsString.
Made the function more generic with "impl AsRef<Path>"

Co-authored-by: Jeff Washington <[email protected]>

* Refactor: Flattens `TransactionContext::instruction_trace` (#27109)

* Flattens TransactionContext::instruction_trace.

* Stop the search at transaction level.

* Renames get_instruction_context_at => get_instruction_context_at_nesting_level.

* Removes TransactionContext::get_instruction_trace().
Adds TransactionContext::get_instruction_trace_length() and TransactionContext::get_instruction_context_at_index().

* Have TransactionContext::instruction_accounts_lamport_sum() accept an iterator instead of a slice.

* Removes instruction_trace from ExecutionRecord.

* make InstructionContext::new() private

* Parallel insertion of dirty store keys during clean (#27058)

parallelize dirty store key insertion

* Refactor epoch reward 2 (#27257)

* refactor: extract store_stake_accounts fn

* refactor: extract store_vote_account fn

* clippy: slice

* clippy: slice

* fix merge error

Co-authored-by: haoran <haoran@mbook>

* Standardize thread names

Tenets:
1. Limit thread names to 15 characters
2. Prefix all Solana-controlled threads with "sol"
3. Use Camel case. It's more character dense than Snake or Kebab case

* cleanup comment on filter_zero_lamport_clean_for_incremental_snapshots (#27273)

* remove inaccurate log (#27255)

* patches metrics for invalid cached vote/stake accounts (#27266)

patches invalid cached vote/stake accounts metrics

Invalid cached vote accounts is overcounting actual mismatches, and
invalid cached stake accounts is undercounting.

* Refactor epoch reward 3 (#27259)

* refactor: extract store_stake_accounts fn

* refactor: extract store_vote_account fn

* refactor: extract reward history update fn

* clippy: slice

* clippy: slice

Co-authored-by: haoran <haoran@mbook>

* fix merges

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: haoran <haoran@mbook>
Co-authored-by: Jeff Biseda <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot-buildkite <[email protected]>
Co-authored-by: Brooks Prumo <[email protected]>
Co-authored-by: behzad nouri <[email protected]>
Co-authored-by: AJ Taylor <[email protected]>
Co-authored-by: Tyera Eulberg <[email protected]>
Co-authored-by: Andrew Schonfeld <[email protected]>
Co-authored-by: aschonfeld <[email protected]>
Co-authored-by: apfitzge <[email protected]>
Co-authored-by: Jeff Washington (jwash) <[email protected]>
Co-authored-by: Brennan Watt <[email protected]>
Co-authored-by: Michael Vines <[email protected]>
Co-authored-by: Nick Frostbutter <[email protected]>
Co-authored-by: Jacob Creech <[email protected]>
Co-authored-by: Jon Cinque <[email protected]>
Co-authored-by: Yihau Chen <[email protected]>
Co-authored-by: Justin Starry <[email protected]>
Co-authored-by: kirill lykov <[email protected]>
Co-authored-by: Yueh-Hsuan Chiang <[email protected]>
Co-authored-by: leonardkulms <[email protected]>
Co-authored-by: Will Hickey <[email protected]>
Co-authored-by: Tao Zhu <[email protected]>
Co-authored-by: Xiang Zhu <[email protected]>
Co-authored-by: Jeff Washington <[email protected]>
Co-authored-by: Alexander Meißner <[email protected]>
xiangzhu70 added a commit to xiangzhu70/solana that referenced this pull request Aug 22, 2022
xiangzhu70 added a commit to xiangzhu70/solana that referenced this pull request Aug 22, 2022
jeffwashington added a commit to jeffwashington/solana that referenced this pull request Aug 22, 2022
* Create a new function cleanup_accounts_paths, a trivial change

* Remove account files asynchronously

* Update and simplify the implementation after the validator test runs.

* Fixes after testing on the dev device

* Discard tokio.  Use thread instead

* Fix comments format

* Fix config type to pass the github test

* Fix failed tests.  Handle the case of non-existing path

* Final cleanup, addressing the review comments
Avoided OsString.
Made the function more generic with "impl AsRef<Path>"

Co-authored-by: Jeff Washington <[email protected]>
xiangzhu70 added a commit that referenced this pull request Aug 23, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants