configurable cache size
This commit is contained in:
@@ -43,11 +43,12 @@ const DB_VERSION : u32 = 0x103;
|
||||
|
||||
impl ArchiveDB {
|
||||
/// Create a new instance from file
|
||||
pub fn new(path: &str) -> ArchiveDB {
|
||||
pub fn new(path: &str, cache_size: Option<usize>) -> ArchiveDB {
|
||||
let opts = DatabaseConfig {
|
||||
// this must match account_db prefix
|
||||
prefix_size: Some(DB_PREFIX_LEN),
|
||||
max_open_files: 256,
|
||||
cache_size: cache_size,
|
||||
};
|
||||
let backing = Database::open(&opts, path).unwrap_or_else(|e| {
|
||||
panic!("Error opening state db: {}", e);
|
||||
|
||||
@@ -73,11 +73,12 @@ const PADDING : [u8; 10] = [ 0u8; 10 ];
|
||||
|
||||
impl EarlyMergeDB {
|
||||
/// Create a new instance from file
|
||||
pub fn new(path: &str) -> EarlyMergeDB {
|
||||
pub fn new(path: &str, cache_size: Option<usize>) -> EarlyMergeDB {
|
||||
let opts = DatabaseConfig {
|
||||
// this must match account_db prefix
|
||||
prefix_size: Some(DB_PREFIX_LEN),
|
||||
max_open_files: 256,
|
||||
cache_size: cache_size,
|
||||
};
|
||||
let backing = Database::open(&opts, path).unwrap_or_else(|e| {
|
||||
panic!("Error opening state db: {}", e);
|
||||
|
||||
@@ -71,12 +71,12 @@ impl fmt::Display for Algorithm {
|
||||
}
|
||||
|
||||
/// Create a new `JournalDB` trait object.
|
||||
pub fn new(path: &str, algorithm: Algorithm) -> Box<JournalDB> {
|
||||
pub fn new(path: &str, algorithm: Algorithm, cache_size: Option<usize>) -> Box<JournalDB> {
|
||||
match algorithm {
|
||||
Algorithm::Archive => Box::new(archivedb::ArchiveDB::new(path)),
|
||||
Algorithm::EarlyMerge => Box::new(earlymergedb::EarlyMergeDB::new(path)),
|
||||
Algorithm::OverlayRecent => Box::new(overlayrecentdb::OverlayRecentDB::new(path)),
|
||||
Algorithm::RefCounted => Box::new(refcounteddb::RefCountedDB::new(path)),
|
||||
Algorithm::Archive => Box::new(archivedb::ArchiveDB::new(path, cache_size)),
|
||||
Algorithm::EarlyMerge => Box::new(earlymergedb::EarlyMergeDB::new(path, cache_size)),
|
||||
Algorithm::OverlayRecent => Box::new(overlayrecentdb::OverlayRecentDB::new(path, cache_size)),
|
||||
Algorithm::RefCounted => Box::new(refcounteddb::RefCountedDB::new(path, cache_size)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,16 +98,17 @@ const PADDING : [u8; 10] = [ 0u8; 10 ];
|
||||
|
||||
impl OverlayRecentDB {
|
||||
/// Create a new instance from file
|
||||
pub fn new(path: &str) -> OverlayRecentDB {
|
||||
Self::from_prefs(path)
|
||||
pub fn new(path: &str, cache_size: Option<usize>) -> OverlayRecentDB {
|
||||
Self::from_prefs(path, cache_size)
|
||||
}
|
||||
|
||||
/// Create a new instance from file
|
||||
pub fn from_prefs(path: &str) -> OverlayRecentDB {
|
||||
pub fn from_prefs(path: &str, cache_size: Option<usize>) -> OverlayRecentDB {
|
||||
let opts = DatabaseConfig {
|
||||
// this must match account_db prefix
|
||||
prefix_size: Some(DB_PREFIX_LEN),
|
||||
max_open_files: 256,
|
||||
cache_size: cache_size,
|
||||
};
|
||||
let backing = Database::open(&opts, path).unwrap_or_else(|e| {
|
||||
panic!("Error opening state db: {}", e);
|
||||
|
||||
@@ -46,11 +46,12 @@ const PADDING : [u8; 10] = [ 0u8; 10 ];
|
||||
|
||||
impl RefCountedDB {
|
||||
/// Create a new instance given a `backing` database.
|
||||
pub fn new(path: &str) -> RefCountedDB {
|
||||
pub fn new(path: &str, cache_size: Option<usize>) -> RefCountedDB {
|
||||
let opts = DatabaseConfig {
|
||||
// this must match account_db prefix
|
||||
prefix_size: Some(DB_PREFIX_LEN),
|
||||
max_open_files: 256,
|
||||
cache_size: cache_size,
|
||||
};
|
||||
let backing = Database::open(&opts, path).unwrap_or_else(|e| {
|
||||
panic!("Error opening state db: {}", e);
|
||||
|
||||
@@ -54,6 +54,29 @@ pub struct DatabaseConfig {
|
||||
pub prefix_size: Option<usize>,
|
||||
/// Max number of open files.
|
||||
pub max_open_files: i32,
|
||||
/// Cache-size
|
||||
pub cache_size: Option<usize>,
|
||||
}
|
||||
|
||||
impl DatabaseConfig {
|
||||
/// Database with default settings and specified cache size
|
||||
pub fn with_cache(cache_size: usize) -> DatabaseConfig {
|
||||
DatabaseConfig {
|
||||
cache_size: Some(cache_size),
|
||||
prefix_size: None,
|
||||
max_open_files: 256
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for DatabaseConfig {
|
||||
fn default() -> DatabaseConfig {
|
||||
DatabaseConfig {
|
||||
cache_size: None,
|
||||
prefix_size: None,
|
||||
max_open_files: 256
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Database iterator
|
||||
@@ -77,7 +100,7 @@ pub struct Database {
|
||||
impl Database {
|
||||
/// Open database with default settings.
|
||||
pub fn open_default(path: &str) -> Result<Database, String> {
|
||||
Database::open(&DatabaseConfig { prefix_size: None, max_open_files: 256 }, path)
|
||||
Database::open(&DatabaseConfig::default(), path)
|
||||
}
|
||||
|
||||
/// Open database file. Creates if it does not exist.
|
||||
@@ -87,6 +110,12 @@ impl Database {
|
||||
opts.create_if_missing(true);
|
||||
opts.set_use_fsync(false);
|
||||
opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction);
|
||||
if let Some(cache_size) = config.cache_size {
|
||||
// half goes to read cache
|
||||
opts.set_block_cache_size_mb(cache_size as u64 / 2);
|
||||
// quarter goes to each of the two write buffers
|
||||
opts.set_write_buffer_size(cache_size * 1024 * 256);
|
||||
}
|
||||
/*
|
||||
opts.set_bytes_per_sync(8388608);
|
||||
opts.set_disable_data_sync(false);
|
||||
|
||||
Reference in New Issue
Block a user