diff --git a/src/core/pool.rs b/src/core/pool.rs index d8564e46d..ccac81321 100644 --- a/src/core/pool.rs +++ b/src/core/pool.rs @@ -1,5 +1,4 @@ use crossbeam::queue::MsQueue; -use std::mem; use std::ops::{Deref, DerefMut}; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; @@ -10,6 +9,12 @@ pub struct GenerationItem { item: T, } + +/// An object pool +/// +/// This is used in tantivy to create a pool of `Searcher`. +/// Object are wrapped in a `LeasedItem` wrapper and are +/// released automatically back into the pool on `Drop`. pub struct Pool { queue: Arc>>, freshest_generation: AtomicUsize, @@ -26,6 +31,10 @@ impl Pool { } } + /// Publishes a new generation of `Searcher`. + /// + /// After publish, all new `Searcher` acquired will be + /// of the new generation. pub fn publish_new_generation(&self, items: Vec) { let next_generation = self.next_generation.fetch_add(1, Ordering::SeqCst) + 1; for item in items { @@ -61,6 +70,10 @@ impl Pool { self.freshest_generation.load(Ordering::Acquire) } + /// Acquires a new searcher. + /// + /// If no searcher is available, this methods block until + /// a searcher is released. pub fn acquire(&self) -> LeasedItem { let generation = self.generation(); loop { @@ -107,9 +120,9 @@ impl DerefMut for LeasedItem { impl Drop for LeasedItem { fn drop(&mut self) { - let gen_item: GenerationItem = mem::replace(&mut self.gen_item, None) - .expect("Unwrapping a leased item should never fail"); - self.recycle_queue.push(gen_item); + if let Some(gen_item) = self.gen_item.take() { + self.recycle_queue.push(gen_item); + } } } diff --git a/src/indexer/index_writer.rs b/src/indexer/index_writer.rs index d2a2f02c5..2d74b46fe 100644 --- a/src/indexer/index_writer.rs +++ b/src/indexer/index_writer.rs @@ -258,7 +258,7 @@ pub fn advance_deletes( write_delete_bitset(&delete_bitset, &mut delete_file)?; } } - segment_entry.set_meta((*segment.meta()).clone()); + segment_entry.set_meta(segment.meta().clone()); Ok(()) } @@ -266,7 +266,7 @@ fn index_documents( memory_budget: usize, segment: &Segment, generation: usize, - document_iterator: &mut Iterator, + document_iterator: &mut impl Iterator, segment_updater: &mut SegmentUpdater, mut delete_cursor: DeleteCursor, ) -> Result {