-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Cancel all background work on last reference drop (#98)
This cancels all background work before dropping the last reference to prevent background work from keeping the database open.
- Loading branch information
Showing
5 changed files
with
105 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
use rocksdb::DB; | ||
use std::cell::RefCell; | ||
use std::sync::Arc; | ||
|
||
/// The type of a reference to a [rocksdb::DB] that is passed around the library. | ||
pub(crate) type DbReference = Arc<RefCell<DB>>; | ||
|
||
/// A wrapper around [DbReference] that cancels all background work when dropped. | ||
/// | ||
/// All users of [rocksdb::DB] should use this wrapper instead to avoid keeping background threads | ||
/// alive after the database is dropped. | ||
#[derive(Clone)] | ||
pub(crate) struct DbReferenceHolder { | ||
inner: Option<DbReference>, | ||
} | ||
|
||
impl DbReferenceHolder { | ||
pub fn new(db: DB) -> Self { | ||
Self { | ||
inner: Some(Arc::new(RefCell::new(db))), | ||
} | ||
} | ||
|
||
pub fn get(&self) -> Option<&DbReference> { | ||
self.inner.as_ref() | ||
} | ||
|
||
pub fn close(&mut self) { | ||
if let Some(db) = self.inner.take().and_then(Arc::into_inner) { | ||
db.borrow_mut().cancel_all_background_work(true); | ||
} | ||
} | ||
} | ||
|
||
impl Drop for DbReferenceHolder { | ||
fn drop(&mut self) { | ||
self.close(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
// #![feature(core_intrinsics)] | ||
mod db_reference; | ||
mod encoder; | ||
mod exceptions; | ||
mod iter; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters