Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8c47b01

Browse files
authored
Add BlockBasedTablePinningTier enum and setter methods (#1024)
Implements missing block cache pinning tier controls to align with C API. Adds BlockBasedTablePinningTier enum with four variants (Fallback, None, FlushAndSimilar, All) and corresponding setter methods in BlockBasedOptions: - set_top_level_index_pinning_tier() - set_partition_pinning_tier() - set_unpartitioned_pinning_tier() This provides fine-grained control over metadata block cache memory management and pinning strategies for improved performance tuning. Signed-off-by: Jack Drogon <[email protected]>
1 parent c3a4204 commit 8c47b01

File tree

3 files changed

+128
-7
lines changed

3 files changed

+128
-7
lines changed

src/db_options.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,80 @@ impl BlockBasedOptions {
825825
);
826826
}
827827
}
828+
829+
/// Set the top-level index pinning tier.
830+
///
831+
/// Controls when top-level index blocks are pinned in block cache memory.
832+
/// This affects memory usage and lookup performance for large databases with
833+
/// multiple levels.
834+
///
835+
/// Default: `BlockBasedTablePinningTier::Fallback`
836+
///
837+
/// # Examples
838+
///
839+
/// ```
840+
/// use rocksdb::{BlockBasedOptions, BlockBasedTablePinningTier};
841+
///
842+
/// let mut opts = BlockBasedOptions::default();
843+
/// opts.set_top_level_index_pinning_tier(BlockBasedTablePinningTier::FlushAndSimilar);
844+
/// ```
845+
pub fn set_top_level_index_pinning_tier(&mut self, pinning_tier: BlockBasedTablePinningTier) {
846+
unsafe {
847+
ffi::rocksdb_block_based_options_set_top_level_index_pinning_tier(
848+
self.inner,
849+
pinning_tier as c_int,
850+
);
851+
}
852+
}
853+
854+
/// Set the partition pinning tier.
855+
///
856+
/// Controls when partition blocks (used in partitioned indexes and filters)
857+
/// are pinned in block cache memory. This affects performance for databases
858+
/// using partitioned metadata.
859+
///
860+
/// Default: `BlockBasedTablePinningTier::Fallback`
861+
///
862+
/// # Examples
863+
///
864+
/// ```
865+
/// use rocksdb::{BlockBasedOptions, BlockBasedTablePinningTier};
866+
///
867+
/// let mut opts = BlockBasedOptions::default();
868+
/// opts.set_partition_pinning_tier(BlockBasedTablePinningTier::All);
869+
/// ```
870+
pub fn set_partition_pinning_tier(&mut self, pinning_tier: BlockBasedTablePinningTier) {
871+
unsafe {
872+
ffi::rocksdb_block_based_options_set_partition_pinning_tier(
873+
self.inner,
874+
pinning_tier as c_int,
875+
);
876+
}
877+
}
878+
879+
/// Set the unpartitioned pinning tier.
880+
///
881+
/// Controls when unpartitioned metadata blocks (index and filter blocks that
882+
/// are not partitioned) are pinned in block cache memory.
883+
///
884+
/// Default: `BlockBasedTablePinningTier::Fallback`
885+
///
886+
/// # Examples
887+
///
888+
/// ```
889+
/// use rocksdb::{BlockBasedOptions, BlockBasedTablePinningTier};
890+
///
891+
/// let mut opts = BlockBasedOptions::default();
892+
/// opts.set_unpartitioned_pinning_tier(BlockBasedTablePinningTier::None);
893+
/// ```
894+
pub fn set_unpartitioned_pinning_tier(&mut self, pinning_tier: BlockBasedTablePinningTier) {
895+
unsafe {
896+
ffi::rocksdb_block_based_options_set_unpartitioned_pinning_tier(
897+
self.inner,
898+
pinning_tier as c_int,
899+
);
900+
}
901+
}
828902
}
829903

830904
impl Default for BlockBasedOptions {
@@ -4232,6 +4306,20 @@ pub enum DataBlockIndexType {
42324306
BinaryAndHash = 1,
42334307
}
42344308

4309+
/// Used by BlockBasedOptions for setting metadata cache pinning tiers.
4310+
/// Controls how metadata blocks (index, filter, etc.) are pinned in block cache.
4311+
#[repr(C)]
4312+
pub enum BlockBasedTablePinningTier {
4313+
/// Use fallback pinning tier (context-dependent)
4314+
Fallback = ffi::rocksdb_block_based_k_fallback_pinning_tier as isize,
4315+
/// No pinning - blocks can be evicted at any time
4316+
None = ffi::rocksdb_block_based_k_none_pinning_tier as isize,
4317+
/// Pin blocks for flushed files and similar scenarios
4318+
FlushAndSimilar = ffi::rocksdb_block_based_k_flush_and_similar_pinning_tier as isize,
4319+
/// Pin all blocks (highest priority)
4320+
All = ffi::rocksdb_block_based_k_all_pinning_tier as isize,
4321+
}
4322+
42354323
/// Defines the underlying memtable implementation.
42364324
/// See official [wiki](https://github.com/facebook/rocksdb/wiki/MemTable) for more information.
42374325
pub enum MemtableFactory {

src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,12 @@ pub use crate::{
121121
DBWALIterator, Direction, IteratorMode,
122122
},
123123
db_options::{
124-
BlockBasedIndexType, BlockBasedOptions, BottommostLevelCompaction, Cache, ChecksumType,
125-
CompactOptions, CompactionPri, CuckooTableOptions, DBCompactionStyle, DBCompressionType,
126-
DBPath, DBRecoveryMode, DataBlockIndexType, FifoCompactOptions, FlushOptions,
127-
IngestExternalFileOptions, KeyEncodingType, LogLevel, LruCacheOptions, MemtableFactory,
128-
Options, PlainTableFactoryOptions, ReadOptions, ReadTier, UniversalCompactOptions,
124+
BlockBasedIndexType, BlockBasedOptions, BlockBasedTablePinningTier,
125+
BottommostLevelCompaction, Cache, ChecksumType, CompactOptions, CompactionPri,
126+
CuckooTableOptions, DBCompactionStyle, DBCompressionType, DBPath, DBRecoveryMode,
127+
DataBlockIndexType, FifoCompactOptions, FlushOptions, IngestExternalFileOptions,
128+
KeyEncodingType, LogLevel, LruCacheOptions, MemtableFactory, Options,
129+
PlainTableFactoryOptions, ReadOptions, ReadTier, UniversalCompactOptions,
129130
UniversalCompactionStopStyle, WaitForCompactOptions, WriteBufferManager, WriteOptions,
130131
},
131132
db_pinnable_slice::DBPinnableSlice,

tests/test_rocksdb_options.rs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use std::{fs, io::Read as _};
1818

1919
use rocksdb::checkpoint::Checkpoint;
2020
use rocksdb::{
21-
BlockBasedOptions, Cache, DBCompressionType, DataBlockIndexType, Env, LruCacheOptions, Options,
22-
ReadOptions, DB,
21+
BlockBasedOptions, BlockBasedTablePinningTier, Cache, DBCompressionType, DataBlockIndexType,
22+
Env, LruCacheOptions, Options, ReadOptions, DB,
2323
};
2424
use util::DBPath;
2525

@@ -423,3 +423,35 @@ fn test_set_write_dbid_to_manifest() {
423423
String::from_utf8_lossy(&db_checkpoint_id)
424424
);
425425
}
426+
427+
#[test]
428+
fn test_block_based_table_pinning_tier() {
429+
let path = DBPath::new("_block_based_table_pinning_tier");
430+
431+
// Test that we can create all enum variants
432+
let _fallback = BlockBasedTablePinningTier::Fallback;
433+
let _none = BlockBasedTablePinningTier::None;
434+
let _flush_and_similar = BlockBasedTablePinningTier::FlushAndSimilar;
435+
let _all = BlockBasedTablePinningTier::All;
436+
437+
// Test that enum values match expected C constants
438+
assert_eq!(BlockBasedTablePinningTier::Fallback as i32, 0);
439+
assert_eq!(BlockBasedTablePinningTier::None as i32, 1);
440+
assert_eq!(BlockBasedTablePinningTier::FlushAndSimilar as i32, 2);
441+
assert_eq!(BlockBasedTablePinningTier::All as i32, 3);
442+
443+
// Test that we can use the setter methods with BlockBasedOptions
444+
let mut block_opts = BlockBasedOptions::default();
445+
block_opts.set_top_level_index_pinning_tier(BlockBasedTablePinningTier::FlushAndSimilar);
446+
block_opts.set_partition_pinning_tier(BlockBasedTablePinningTier::All);
447+
block_opts.set_unpartitioned_pinning_tier(BlockBasedTablePinningTier::None);
448+
449+
// Test that we can create a database with these options
450+
let mut opts = Options::default();
451+
opts.create_if_missing(true);
452+
opts.set_block_based_table_factory(&block_opts);
453+
454+
let db = DB::open(&opts, &path).unwrap();
455+
db.put(b"test_key", b"test_value").unwrap();
456+
assert_eq!(&*db.get(b"test_key").unwrap().unwrap(), b"test_value");
457+
}

0 commit comments

Comments
 (0)