From a7706e03ad6be9d30d440556cbdbde2b93444589 Mon Sep 17 00:00:00 2001 From: ra <40503841+RadiantAeon@users.noreply.github.com> Date: Mon, 2 Mar 2026 17:42:39 +0000 Subject: [PATCH 1/2] enable direct io for blockstore_db reads and writes --- ledger/src/blockstore_db.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index 3e01eab6389..d8c3ff9d73d 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -1151,6 +1151,13 @@ fn get_db_options(blockstore_options: &BlockstoreOptions) -> Options { options.create_if_missing(true); options.create_missing_column_families(true); + // Direct io + #[cfg(target_os = "linux")] + { + options.set_use_direct_io_for_flush_and_compaction(true); + options.set_use_direct_reads(true); + } + // rocksdb builds two threadpools: low and high priority. The low priority // pool is used for compactions whereas the high priority pool is used for // memtable flushes. Separate pools are created so that compactions are From 5bcdd9c706f3f882f90afea6c298b9324b3dd6d0 Mon Sep 17 00:00:00 2001 From: ra <40503841+RadiantAeon@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:32:57 +0000 Subject: [PATCH 2/2] use `check_direct_io_capability` to toggle dio on rocksdb --- Cargo.lock | 1 + ledger/Cargo.toml | 1 + ledger/src/blockstore_db.rs | 17 ++++++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60067d2da02..ac62175c98f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8893,6 +8893,7 @@ name = "solana-ledger" version = "4.1.0-alpha.0" dependencies = [ "agave-feature-set", + "agave-fs", "agave-logger", "agave-reserved-account-keys", "agave-snapshots", diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 8a4517e8830..58195745556 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -30,6 +30,7 @@ agave-unstable-api = [] [dependencies] agave-feature-set = { workspace = true } +agave-fs = { workspace = true } agave-reserved-account-keys = { workspace = true } agave-snapshots = { workspace = true } agave-votor-messages = { workspace = true } diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index d8c3ff9d73d..7c15ee5694e 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -111,7 +111,7 @@ impl Rocks { fs::create_dir_all(&path)?; // Use default database options - let mut db_options = get_db_options(&options); + let mut db_options = get_db_options(&options, &path)?; if let Some(recovery_mode) = recovery_mode { db_options.set_wal_recovery_mode(recovery_mode.into()); } @@ -1144,7 +1144,10 @@ fn process_cf_options_advanced( } } -fn get_db_options(blockstore_options: &BlockstoreOptions) -> Options { +fn get_db_options( + blockstore_options: &BlockstoreOptions, + path: &PathBuf, +) -> std::io::Result { let mut options = Options::default(); // Create missing items to support a clean start @@ -1154,8 +1157,12 @@ fn get_db_options(blockstore_options: &BlockstoreOptions) -> Options { // Direct io #[cfg(target_os = "linux")] { - options.set_use_direct_io_for_flush_and_compaction(true); - options.set_use_direct_reads(true); + use agave_fs::metadata::DirectIoSupport; + + if agave_fs::metadata::check_direct_io_capability(path)? == DirectIoSupport::Supported { + options.set_use_direct_io_for_flush_and_compaction(true); + options.set_use_direct_reads(true); + } } // rocksdb builds two threadpools: low and high priority. The low priority @@ -1190,7 +1197,7 @@ fn get_db_options(blockstore_options: &BlockstoreOptions) -> Options { // it is not required for read-only access, but should be fine with our high ulimit. options.set_max_open_files(-1); - options + Ok(options) } /// The default number of threads to use for rocksdb compaction in the rocksdb