diff --git a/src/core/segment.rs b/src/core/segment.rs index 03836d1d5..608aa632a 100644 --- a/src/core/segment.rs +++ b/src/core/segment.rs @@ -90,7 +90,7 @@ impl Segment { /// /// That segment is entirely dissociated from the index directory. /// It will be persisted by a background thread in charge of IO. - pub fn new_unpersisted(meta: SegmentMeta, schema: Schema) -> Segment { + pub fn new_volatile(meta: SegmentMeta, schema: Schema) -> Segment { Segment { schema, meta, diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 529d95c54..ce6e32b87 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -121,15 +121,24 @@ struct InnerIndexReader { } impl InnerIndexReader { + fn load_segment_readers(&self) -> Result> { + // We keep the lock until we have effectively finished opening the + // the `SegmentReader` because it prevents a diffferent process + // to garbage collect these file while we open them. + // + // Once opened, on linux & mac, the mmap will remain valid after + // the file has been deleted + // On windows, the file deletion will fail. + let _meta_lock = self.index.directory().acquire_lock(&META_LOCK)?; + let searchable_segments = self.searchable_segments()?; + searchable_segments + .iter() + .map(SegmentReader::open) + .collect::>() + } + fn reload(&self) -> Result<()> { - let segment_readers: Vec = { - let _meta_lock = self.index.directory().acquire_lock(&META_LOCK)?; - let searchable_segments = self.searchable_segments()?; - searchable_segments - .iter() - .map(SegmentReader::open) - .collect::>()? - }; + let segment_readers: Vec = self.load_segment_readers()?; let schema = self.index.schema(); let searchers = (0..self.num_searchers) .map(|_| Searcher::new(schema.clone(), self.index.clone(), segment_readers.clone()))