diff options
author | Paul Masurel <paul.masurel@gmail.com> | 2019-09-26 10:52:38 +0900 |
---|---|---|
committer | Paul Masurel <paul.masurel@gmail.com> | 2019-10-01 09:34:22 +0900 |
commit | 94f27f990b862197e54438a71fb7cac24de88974 (patch) | |
tree | eea4e7b43d591480d0cf79563689919632fa3cf2 | |
parent | efd1af13255e614559fbf037d23dc0ae46f2dbd4 (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.md | 6 | ||||
-rw-r--r-- | Cargo.toml | 5 | ||||
-rw-r--r-- | src/directory/mmap_directory.rs | 60 |
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 ===================== @@ -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) } } |