Unverified Commit 2788c4df authored by Xinye Tao's avatar Xinye Tao Committed by GitHub

refactor usage of `Arc` (#595)

Accept generic construct instead of Arc to avoid nested arc required to bridge different crates. Also fix a missing export.
Signed-off-by: 's avatartabokie <xy.tao@outlook.com>
parent dd50d920
...@@ -69,19 +69,19 @@ fn copy_error<T: Into<Vec<u8>>>(err: T) -> *const c_char { ...@@ -69,19 +69,19 @@ fn copy_error<T: Into<Vec<u8>>>(err: T) -> *const c_char {
unsafe { libc::strdup(cstr.as_ptr()) } unsafe { libc::strdup(cstr.as_ptr()) }
} }
extern "C" fn encryption_key_manager_destructor(ctx: *mut c_void) { extern "C" fn encryption_key_manager_destructor<T: EncryptionKeyManager>(ctx: *mut c_void) {
unsafe { unsafe {
// Recover from raw pointer and implicitly drop. // Recover from raw pointer and implicitly drop.
Box::from_raw(ctx as *mut Arc<dyn EncryptionKeyManager>); Box::from_raw(ctx as *mut T);
} }
} }
extern "C" fn encryption_key_manager_get_file( extern "C" fn encryption_key_manager_get_file<T: EncryptionKeyManager>(
ctx: *mut c_void, ctx: *mut c_void,
fname: *const c_char, fname: *const c_char,
file_info: *mut DBFileEncryptionInfo, file_info: *mut DBFileEncryptionInfo,
) -> *const c_char { ) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) }; let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } { let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret, Ok(ret) => ret,
Err(err) => { Err(err) => {
...@@ -102,12 +102,12 @@ extern "C" fn encryption_key_manager_get_file( ...@@ -102,12 +102,12 @@ extern "C" fn encryption_key_manager_get_file(
} }
} }
extern "C" fn encryption_key_manager_new_file( extern "C" fn encryption_key_manager_new_file<T: EncryptionKeyManager>(
ctx: *mut c_void, ctx: *mut c_void,
fname: *const c_char, fname: *const c_char,
file_info: *mut DBFileEncryptionInfo, file_info: *mut DBFileEncryptionInfo,
) -> *const c_char { ) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) }; let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } { let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret, Ok(ret) => ret,
Err(err) => { Err(err) => {
...@@ -128,11 +128,11 @@ extern "C" fn encryption_key_manager_new_file( ...@@ -128,11 +128,11 @@ extern "C" fn encryption_key_manager_new_file(
} }
} }
extern "C" fn encryption_key_manager_delete_file( extern "C" fn encryption_key_manager_delete_file<T: EncryptionKeyManager>(
ctx: *mut c_void, ctx: *mut c_void,
fname: *const c_char, fname: *const c_char,
) -> *const c_char { ) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) }; let key_manager = unsafe { &*(ctx as *mut T) };
let fname = match unsafe { CStr::from_ptr(fname).to_str() } { let fname = match unsafe { CStr::from_ptr(fname).to_str() } {
Ok(ret) => ret, Ok(ret) => ret,
Err(err) => { Err(err) => {
...@@ -151,12 +151,12 @@ extern "C" fn encryption_key_manager_delete_file( ...@@ -151,12 +151,12 @@ extern "C" fn encryption_key_manager_delete_file(
} }
} }
extern "C" fn encryption_key_manager_link_file( extern "C" fn encryption_key_manager_link_file<T: EncryptionKeyManager>(
ctx: *mut c_void, ctx: *mut c_void,
src_fname: *const c_char, src_fname: *const c_char,
dst_fname: *const c_char, dst_fname: *const c_char,
) -> *const c_char { ) -> *const c_char {
let key_manager = unsafe { &*(ctx as *mut Arc<dyn EncryptionKeyManager>) }; let key_manager = unsafe { &*(ctx as *mut T) };
let src_fname = match unsafe { CStr::from_ptr(src_fname).to_str() } { let src_fname = match unsafe { CStr::from_ptr(src_fname).to_str() } {
Ok(ret) => ret, Ok(ret) => ret,
Err(err) => { Err(err) => {
...@@ -192,18 +192,16 @@ unsafe impl Send for DBEncryptionKeyManager {} ...@@ -192,18 +192,16 @@ unsafe impl Send for DBEncryptionKeyManager {}
unsafe impl Sync for DBEncryptionKeyManager {} unsafe impl Sync for DBEncryptionKeyManager {}
impl DBEncryptionKeyManager { impl DBEncryptionKeyManager {
pub fn new(key_manager: Arc<dyn EncryptionKeyManager>) -> DBEncryptionKeyManager { pub fn new<T: EncryptionKeyManager>(key_manager: T) -> DBEncryptionKeyManager {
// Size of Arc<dyn T>::into_raw is of 128-bits, which couldn't be used as C-style pointer.
// Boxing it to make a 64-bits pointer.
let ctx = Box::into_raw(Box::new(key_manager)) as *mut c_void; let ctx = Box::into_raw(Box::new(key_manager)) as *mut c_void;
let instance = unsafe { let instance = unsafe {
crocksdb_ffi::crocksdb_encryption_key_manager_create( crocksdb_ffi::crocksdb_encryption_key_manager_create(
ctx, ctx,
encryption_key_manager_destructor, encryption_key_manager_destructor::<T>,
encryption_key_manager_get_file, encryption_key_manager_get_file::<T>,
encryption_key_manager_new_file, encryption_key_manager_new_file::<T>,
encryption_key_manager_delete_file, encryption_key_manager_delete_file::<T>,
encryption_key_manager_link_file, encryption_key_manager_link_file::<T>,
) )
}; };
DBEncryptionKeyManager { inner: instance } DBEncryptionKeyManager { inner: instance }
...@@ -387,7 +385,7 @@ mod test { ...@@ -387,7 +385,7 @@ mod test {
} }
} }
impl EncryptionKeyManager for Mutex<TestEncryptionKeyManager> { impl EncryptionKeyManager for Arc<Mutex<TestEncryptionKeyManager>> {
fn get_file(&self, fname: &str) -> Result<FileEncryptionInfo> { fn get_file(&self, fname: &str) -> Result<FileEncryptionInfo> {
let key_manager = self.lock().unwrap(); let key_manager = self.lock().unwrap();
key_manager.get_file_called.fetch_add(1, Ordering::SeqCst); key_manager.get_file_called.fetch_add(1, Ordering::SeqCst);
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
pub use crocksdb_ffi::{self, DBFileSystemInspectorInstance}; pub use crocksdb_ffi::{self, DBFileSystemInspectorInstance};
use libc::{c_char, c_void, size_t, strdup}; use libc::{c_char, c_void, size_t, strdup};
use std::sync::Arc;
// Inspect global IO flow. No per-file inspection for now. // Inspect global IO flow. No per-file inspection for now.
pub trait FileSystemInspector: Sync + Send { pub trait FileSystemInspector: Sync + Send {
...@@ -11,19 +10,19 @@ pub trait FileSystemInspector: Sync + Send { ...@@ -11,19 +10,19 @@ pub trait FileSystemInspector: Sync + Send {
fn write(&self, len: usize) -> Result<usize, String>; fn write(&self, len: usize) -> Result<usize, String>;
} }
extern "C" fn file_system_inspector_destructor(ctx: *mut c_void) { extern "C" fn file_system_inspector_destructor<T: FileSystemInspector>(ctx: *mut c_void) {
unsafe { unsafe {
// Recover from raw pointer and implicitly drop. // Recover from raw pointer and implicitly drop.
Box::from_raw(ctx as *mut Arc<dyn FileSystemInspector>); Box::from_raw(ctx as *mut T);
} }
} }
extern "C" fn file_system_inspector_read( extern "C" fn file_system_inspector_read<T: FileSystemInspector>(
ctx: *mut c_void, ctx: *mut c_void,
len: size_t, len: size_t,
errptr: *mut *mut c_char, errptr: *mut *mut c_char,
) -> size_t { ) -> size_t {
let file_system_inspector = unsafe { &*(ctx as *mut Arc<dyn FileSystemInspector>) }; let file_system_inspector = unsafe { &*(ctx as *mut T) };
match file_system_inspector.read(len) { match file_system_inspector.read(len) {
Ok(ret) => ret, Ok(ret) => ret,
Err(e) => { Err(e) => {
...@@ -35,12 +34,12 @@ extern "C" fn file_system_inspector_read( ...@@ -35,12 +34,12 @@ extern "C" fn file_system_inspector_read(
} }
} }
extern "C" fn file_system_inspector_write( extern "C" fn file_system_inspector_write<T: FileSystemInspector>(
ctx: *mut c_void, ctx: *mut c_void,
len: size_t, len: size_t,
errptr: *mut *mut c_char, errptr: *mut *mut c_char,
) -> size_t { ) -> size_t {
let file_system_inspector = unsafe { &*(ctx as *mut Arc<dyn FileSystemInspector>) }; let file_system_inspector = unsafe { &*(ctx as *mut T) };
match file_system_inspector.write(len) { match file_system_inspector.write(len) {
Ok(ret) => ret, Ok(ret) => ret,
Err(e) => { Err(e) => {
...@@ -60,16 +59,14 @@ unsafe impl Send for DBFileSystemInspector {} ...@@ -60,16 +59,14 @@ unsafe impl Send for DBFileSystemInspector {}
unsafe impl Sync for DBFileSystemInspector {} unsafe impl Sync for DBFileSystemInspector {}
impl DBFileSystemInspector { impl DBFileSystemInspector {
pub fn new(file_system_inspector: Arc<dyn FileSystemInspector>) -> DBFileSystemInspector { pub fn new<T: FileSystemInspector>(file_system_inspector: T) -> DBFileSystemInspector {
// Size of Arc<dyn T>::into_raw is of 128-bits, which couldn't be used as C-style pointer.
// Boxing it to make a 64-bits pointer.
let ctx = Box::into_raw(Box::new(file_system_inspector)) as *mut c_void; let ctx = Box::into_raw(Box::new(file_system_inspector)) as *mut c_void;
let instance = unsafe { let instance = unsafe {
crocksdb_ffi::crocksdb_file_system_inspector_create( crocksdb_ffi::crocksdb_file_system_inspector_create(
ctx, ctx,
file_system_inspector_destructor, file_system_inspector_destructor::<T>,
file_system_inspector_read, file_system_inspector_read::<T>,
file_system_inspector_write, file_system_inspector_write::<T>,
) )
}; };
DBFileSystemInspector { inner: instance } DBFileSystemInspector { inner: instance }
...@@ -131,7 +128,7 @@ mod test { ...@@ -131,7 +128,7 @@ mod test {
} }
} }
impl FileSystemInspector for Mutex<TestFileSystemInspector> { impl FileSystemInspector for Arc<Mutex<TestFileSystemInspector>> {
fn read(&self, len: usize) -> Result<usize, String> { fn read(&self, len: usize) -> Result<usize, String> {
let mut inner = self.lock().unwrap(); let mut inner = self.lock().unwrap();
inner.read_called += 1; inner.read_called += 1;
......
...@@ -41,6 +41,7 @@ pub use event_listener::{ ...@@ -41,6 +41,7 @@ pub use event_listener::{
CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo, SubcompactionJobInfo, CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo, SubcompactionJobInfo,
WriteStallInfo, WriteStallInfo,
}; };
pub use file_system::FileSystemInspector;
pub use librocksdb_sys::{ pub use librocksdb_sys::{
self as crocksdb_ffi, new_bloom_filter, CompactionPriority, CompactionReason, self as crocksdb_ffi, new_bloom_filter, CompactionPriority, CompactionReason,
DBBackgroundErrorReason, DBBottommostLevelCompaction, DBCompactionStyle, DBCompressionType, DBBackgroundErrorReason, DBBottommostLevelCompaction, DBCompactionStyle, DBCompressionType,
......
...@@ -2654,9 +2654,9 @@ impl Env { ...@@ -2654,9 +2654,9 @@ impl Env {
// Create an encrypted env that accepts an external key manager. // Create an encrypted env that accepts an external key manager.
#[cfg(feature = "encryption")] #[cfg(feature = "encryption")]
pub fn new_key_managed_encrypted_env( pub fn new_key_managed_encrypted_env<T: EncryptionKeyManager>(
base_env: Arc<Env>, base_env: Arc<Env>,
key_manager: Arc<dyn EncryptionKeyManager>, key_manager: T,
) -> Result<Env, String> { ) -> Result<Env, String> {
let db_key_manager = DBEncryptionKeyManager::new(key_manager); let db_key_manager = DBEncryptionKeyManager::new(key_manager);
let env = unsafe { let env = unsafe {
...@@ -2671,9 +2671,9 @@ impl Env { ...@@ -2671,9 +2671,9 @@ impl Env {
}) })
} }
pub fn new_file_system_inspected_env( pub fn new_file_system_inspected_env<T: FileSystemInspector>(
base_env: Arc<Env>, base_env: Arc<Env>,
file_system_inspector: Arc<dyn FileSystemInspector>, file_system_inspector: T,
) -> Result<Env, String> { ) -> Result<Env, String> {
let db_file_system_inspector = DBFileSystemInspector::new(file_system_inspector); let db_file_system_inspector = DBFileSystemInspector::new(file_system_inspector);
let env = unsafe { let env = unsafe {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment