summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Masurel <paul.masurel@gmail.com>2019-09-26 10:52:38 +0900
committerPaul Masurel <paul.masurel@gmail.com>2019-10-01 09:34:22 +0900
commit94f27f990b862197e54438a71fb7cac24de88974 (patch)
treeeea4e7b43d591480d0cf79563689919632fa3cf2
parentefd1af13255e614559fbf037d23dc0ae46f2dbd4 (diff)
Address #656
Broke the reference loop to make sure that the watch_router can be dropped, and the thread exits.
-rw-r--r--CHANGELOG.md6
-rw-r--r--Cargo.toml5
-rw-r--r--src/directory/mmap_directory.rs60
3 files changed, 33 insertions, 38 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cf860c..5f74923 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,12 @@ Tantivy 0.11.0
- Added f64 field. Internally reuse u64 code the same way i64 does (@fdb-hiroshima)
+
+Tantivy 0.10.2
+=====================
+
+- Closes #656. Solving memory leak.
+
Tantivy 0.10.1
=====================
diff --git a/Cargo.toml b/Cargo.toml
index a19f539..d422534 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tantivy"
-version = "0.10.1"
+version = "0.10.2"
authors = ["Paul Masurel <paul.masurel@gmail.com>"]
license = "MIT"
categories = ["database-implementations", "data-structures"]
@@ -85,6 +85,7 @@ wasm-bindgen = ["uuid/wasm-bindgen"]
travis-ci = { repository = "tantivy-search/tantivy" }
[dev-dependencies.fail]
+version = "0.3"
features = ["failpoints"]
@@ -98,4 +99,4 @@ features = ["failpoints"]
[[test]]
name = "failpoints"
path = "tests/failpoints/mod.rs"
-required-features = ["fail/failpoints"] \ No newline at end of file
+required-features = ["fail/failpoints"]
diff --git a/src/directory/mmap_directory.rs b/src/directory/mmap_directory.rs
index afe90b8..81ee59c 100644
--- a/src/directory/mmap_directory.rs
+++ b/src/directory/mmap_directory.rs
@@ -141,42 +141,28 @@ impl MmapCache {
}
}
-struct InnerWatcherWrapper {
- _watcher: Mutex<notify::RecommendedWatcher>,
- watcher_router: WatchCallbackList,
-}
-
-impl InnerWatcherWrapper {
- pub fn new(path: &Path) -> Result<(Self, Receiver<notify::RawEvent>), notify::Error> {
- let (tx, watcher_recv): (Sender<RawEvent>, Receiver<RawEvent>) = channel();
- // We need to initialize the
- let mut watcher = notify::raw_watcher(tx)?;
- watcher.watch(path, RecursiveMode::Recursive)?;
- let inner = InnerWatcherWrapper {
- _watcher: Mutex::new(watcher),
- watcher_router: Default::default(),
- };
- Ok((inner, watcher_recv))
- }
-}
-
-#[derive(Clone)]
struct WatcherWrapper {
- inner: Arc<InnerWatcherWrapper>,
+ _watcher: Mutex<notify::RecommendedWatcher>,
+ watcher_router: Arc<WatchCallbackList>,
}
impl WatcherWrapper {
pub fn new(path: &Path) -> Result<Self, OpenDirectoryError> {
- let (inner, watcher_recv) = InnerWatcherWrapper::new(path).map_err(|err| match err {
- notify::Error::PathNotFound => OpenDirectoryError::DoesNotExist(path.to_owned()),
- _ => {
- panic!("Unknown error while starting watching directory {:?}", path);
- }
- })?;
- let watcher_wrapper = WatcherWrapper {
- inner: Arc::new(inner),
- };
- let watcher_wrapper_clone = watcher_wrapper.clone();
+ let (tx, watcher_recv): (Sender<RawEvent>, Receiver<RawEvent>) = channel();
+ // We need to initialize the
+ let watcher = notify::raw_watcher(tx)
+ .and_then(|mut watcher| {
+ watcher.watch(path, RecursiveMode::Recursive)?;
+ Ok(watcher)
+ })
+ .map_err(|err| match err {
+ notify::Error::PathNotFound => OpenDirectoryError::DoesNotExist(path.to_owned()),
+ _ => {
+ panic!("Unknown error while starting watching directory {:?}", path);
+ }
+ })?;
+ let watcher_router: Arc<WatchCallbackList> = Default::default();
+ let watcher_router_clone = watcher_router.clone();
thread::Builder::new()
.name("meta-file-watch-thread".to_string())
.spawn(move || {
@@ -187,7 +173,7 @@ impl WatcherWrapper {
// We might want to be more accurate than this at one point.
if let Some(filename) = changed_path.file_name() {
if filename == *META_FILEPATH {
- watcher_wrapper_clone.inner.watcher_router.broadcast();
+ watcher_router_clone.broadcast();
}
}
}
@@ -200,13 +186,15 @@ impl WatcherWrapper {
}
}
}
- })
- .expect("Failed to spawn thread to watch meta.json");
- Ok(watcher_wrapper)
+ })?;
+ Ok(WatcherWrapper {
+ _watcher: Mutex::new(watcher),
+ watcher_router,
+ })
}
pub fn watch(&mut self, watch_callback: WatchCallback) -> WatchHandle {
- self.inner.watcher_router.subscribe(watch_callback)
+ self.watcher_router.subscribe(watch_callback)
}
}