Skip to content

Commit a9050c7

Browse files
committed
Add block based metadata cache options
1 parent be89ccb commit a9050c7

File tree

3 files changed

+110
-8
lines changed

3 files changed

+110
-8
lines changed

src/db_options.rs

+84
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,81 @@ impl BlockBasedOptions {
777777
);
778778
}
779779
}
780+
781+
/// The tier of block-based tables whose top-level index into metadata
782+
/// partitions will be pinned. Currently indexes and filters may be
783+
/// partitioned.
784+
///
785+
/// Note `cache_index_and_filter_blocks` must be true for this option to have
786+
/// any effect. Otherwise any top-level index into metadata partitions would be
787+
/// held in table reader memory, outside the block cache.
788+
///
789+
/// Default: `BlockBasedPinningTier:Fallback`
790+
///
791+
/// # Example
792+
///
793+
/// ```
794+
/// use rust_rocksdb::{BlockBasedOptions, BlockBasedPinningTier, Options};
795+
///
796+
/// let mut opts = Options::default();
797+
/// let mut block_opts = BlockBasedOptions::default();
798+
/// block_opts.set_top_level_index_pinning_tier(BlockBasedPinningTier::FlushAndSimilar);
799+
/// ```
800+
pub fn set_top_level_index_pinning_tier(&mut self, tier: BlockBasedPinningTier) {
801+
unsafe {
802+
ffi::rocksdb_block_based_options_set_top_level_index_pinning_tier(
803+
self.inner,
804+
tier as c_int,
805+
);
806+
}
807+
}
808+
809+
/// The tier of block-based tables whose metadata partitions will be pinned.
810+
/// Currently indexes and filters may be partitioned.
811+
///
812+
/// Default: `BlockBasedPinningTier:Fallback`
813+
///
814+
/// # Example
815+
///
816+
/// ```
817+
/// use rust_rocksdb::{BlockBasedOptions, BlockBasedPinningTier, Options};
818+
///
819+
/// let mut opts = Options::default();
820+
/// let mut block_opts = BlockBasedOptions::default();
821+
/// block_opts.set_partition_pinning_tier(BlockBasedPinningTier::FlushAndSimilar);
822+
/// ```
823+
pub fn set_partition_pinning_tier(&mut self, tier: BlockBasedPinningTier) {
824+
unsafe {
825+
ffi::rocksdb_block_based_options_set_partition_pinning_tier(self.inner, tier as c_int);
826+
}
827+
}
828+
829+
/// The tier of block-based tables whose unpartitioned metadata blocks will be
830+
/// pinned.
831+
///
832+
/// Note `cache_index_and_filter_blocks` must be true for this option to have
833+
/// any effect. Otherwise the unpartitioned meta-blocks would be held in table
834+
/// reader memory, outside the block cache.
835+
///
836+
/// Default: `BlockBasedPinningTier:Fallback`
837+
///
838+
/// # Example
839+
///
840+
/// ```
841+
/// use rust_rocksdb::{BlockBasedOptions, BlockBasedPinningTier, Options};
842+
///
843+
/// let mut opts = Options::default();
844+
/// let mut block_opts = BlockBasedOptions::default();
845+
/// block_opts.set_unpartitioned_pinning_tier(BlockBasedPinningTier::FlushAndSimilar);
846+
/// ```
847+
pub fn set_unpartitioned_pinning_tier(&mut self, tier: BlockBasedPinningTier) {
848+
unsafe {
849+
ffi::rocksdb_block_based_options_set_unpartitioned_pinning_tier(
850+
self.inner,
851+
tier as c_int,
852+
);
853+
}
854+
}
780855
}
781856

782857
impl Default for BlockBasedOptions {
@@ -4198,6 +4273,15 @@ pub enum DBCompactionPri {
41984273
RoundRobin = ffi::rocksdb_k_round_robin_compaction_pri as isize,
41994274
}
42004275

4276+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
4277+
#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]
4278+
pub enum BlockBasedPinningTier {
4279+
Fallback = ffi::rocksdb_block_based_k_fallback_pinning_tier as isize,
4280+
None = ffi::rocksdb_block_based_k_none_pinning_tier as isize,
4281+
FlushAndSimilar = ffi::rocksdb_block_based_k_flush_and_similar_pinning_tier as isize,
4282+
All = ffi::rocksdb_block_based_k_all_pinning_tier as isize,
4283+
}
4284+
42014285
pub struct FifoCompactOptions {
42024286
pub(crate) inner: *mut ffi::rocksdb_fifo_compaction_options_t,
42034287
}

src/lib.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,13 @@ pub use crate::{
114114
DBWALIterator, Direction, IteratorMode,
115115
},
116116
db_options::{
117-
BlockBasedIndexType, BlockBasedOptions, BottommostLevelCompaction, Cache, ChecksumType,
118-
CompactOptions, CuckooTableOptions, DBCompactionPri, DBCompactionStyle, DBCompressionType,
119-
DBPath, DBRecoveryMode, DataBlockIndexType, FifoCompactOptions, FlushOptions,
120-
IngestExternalFileOptions, KeyEncodingType, LogLevel, MemtableFactory, Options,
121-
PlainTableFactoryOptions, RateLimiterMode, ReadOptions, ReadTier, UniversalCompactOptions,
122-
UniversalCompactionStopStyle, WaitForCompactOptions, WriteBufferManager, WriteOptions,
117+
BlockBasedIndexType, BlockBasedOptions, BlockBasedPinningTier, BottommostLevelCompaction,
118+
Cache, ChecksumType, CompactOptions, CuckooTableOptions, DBCompactionPri,
119+
DBCompactionStyle, DBCompressionType, DBPath, DBRecoveryMode, DataBlockIndexType,
120+
FifoCompactOptions, FlushOptions, IngestExternalFileOptions, KeyEncodingType, LogLevel,
121+
MemtableFactory, Options, PlainTableFactoryOptions, RateLimiterMode, ReadOptions, ReadTier,
122+
UniversalCompactOptions, UniversalCompactionStopStyle, WaitForCompactOptions,
123+
WriteBufferManager, WriteOptions,
123124
},
124125
db_pinnable_slice::DBPinnableSlice,
125126
env::Env,

tests/test_rocksdb_options.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ mod util;
1717
use std::{fs, io::Read as _};
1818

1919
use rust_rocksdb::{
20-
BlockBasedOptions, Cache, DBCompactionPri, DBCompressionType, DataBlockIndexType, Env, Options,
21-
ReadOptions, DB,
20+
BlockBasedOptions, BlockBasedPinningTier, Cache, DBCompactionPri, DBCompressionType,
21+
DataBlockIndexType, Env, Options, ReadOptions, DB,
2222
};
2323
use util::DBPath;
2424

@@ -89,6 +89,9 @@ fn test_block_based_options() {
8989
block_opts.set_pin_l0_filter_and_index_blocks_in_cache(true);
9090
block_opts.set_format_version(4);
9191
block_opts.set_index_block_restart_interval(16);
92+
block_opts.set_top_level_index_pinning_tier(BlockBasedPinningTier::All);
93+
block_opts.set_partition_pinning_tier(BlockBasedPinningTier::All);
94+
block_opts.set_unpartitioned_pinning_tier(BlockBasedPinningTier::All);
9295

9396
opts.set_block_based_table_factory(&block_opts);
9497
let _db = DB::open(&opts, &n).unwrap();
@@ -105,6 +108,20 @@ fn test_block_based_options() {
105108
assert!(settings.contains("format_version: 4"));
106109
assert!(settings.contains("index_block_restart_interval: 16"));
107110
}
111+
112+
{
113+
let mut opts = Options::default();
114+
opts.create_if_missing(true);
115+
116+
let mut block_opts = BlockBasedOptions::default();
117+
block_opts.set_cache_index_and_filter_blocks(true);
118+
block_opts.set_top_level_index_pinning_tier(BlockBasedPinningTier::FlushAndSimilar);
119+
block_opts.set_partition_pinning_tier(BlockBasedPinningTier::All);
120+
block_opts.set_unpartitioned_pinning_tier(BlockBasedPinningTier::None);
121+
122+
opts.set_block_based_table_factory(&block_opts);
123+
let _db = DB::open(&opts, &n).unwrap();
124+
}
108125
}
109126

110127
#[test]

0 commit comments

Comments
 (0)