From ce022e5f06ed6d1f19e7ea7e1e3de32d194b995c Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Sat, 8 Apr 2017 17:50:59 +0900 Subject: [PATCH] issue/54 Clone segment reader rather than reload. Closes #54. --- src/core/index.rs | 11 ++++------- src/core/segment_reader.rs | 14 ++++++++------ src/store/reader.rs | 1 + 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/index.rs b/src/core/index.rs index 71565f321..cb97ba569 100644 --- a/src/core/index.rs +++ b/src/core/index.rs @@ -202,16 +202,13 @@ impl Index { /// published or after a merge. pub fn load_searchers(&self) -> Result<()> { let searchable_segments = self.searchable_segments()?; - let mut searchers = Vec::new(); - for _ in 0..NUM_SEARCHERS { - let searchable_segments_clone = searchable_segments.clone(); - let segment_readers: Vec = try!(searchable_segments_clone + let segment_readers: Vec = try!(searchable_segments .into_iter() .map(SegmentReader::open) .collect()); - let searcher = Searcher::from(segment_readers); - searchers.push(searcher); - } + let searchers = (0..NUM_SEARCHERS) + .map(|_| Searcher::from(segment_readers.clone())) + .collect(); self.searcher_pool.publish_new_generation(searchers); Ok(()) } diff --git a/src/core/segment_reader.rs b/src/core/segment_reader.rs index 43aa6b50e..3e2c46164 100644 --- a/src/core/segment_reader.rs +++ b/src/core/segment_reader.rs @@ -12,6 +12,7 @@ use DocId; use std::str; use postings::TermInfo; use datastruct::FstMap; +use std::sync::Arc; use std::fmt; use rustc_serialize::json; use core::SegmentInfo; @@ -37,14 +38,15 @@ use error::Error; /// The segment reader has a very low memory footprint, /// as close to all of the memory data is mmapped. /// +#[derive(Clone)] pub struct SegmentReader { segment_info: SegmentInfo, segment_id: SegmentId, - term_infos: FstMap, + term_infos: Arc>, postings_data: ReadOnlySource, store_reader: StoreReader, - fast_fields_reader: U32FastFieldsReader, - fieldnorms_reader: U32FastFieldsReader, + fast_fields_reader: Arc, + fieldnorms_reader: Arc, delete_bitset: DeleteBitSet, positions_data: ReadOnlySource, schema: Schema, @@ -171,11 +173,11 @@ impl SegmentReader { Ok(SegmentReader { segment_info: segment_info, postings_data: postings_shared_mmap, - term_infos: term_infos, + term_infos: Arc::new(term_infos), segment_id: segment.id(), store_reader: store_reader, - fast_fields_reader: fast_fields_reader, - fieldnorms_reader: fieldnorms_reader, + fast_fields_reader: Arc::new(fast_fields_reader), + fieldnorms_reader: Arc::new(fieldnorms_reader), delete_bitset: delete_bitset, positions_data: positions_data, schema: schema, diff --git a/src/store/reader.rs b/src/store/reader.rs index c3bfddfb7..3a9918f9d 100644 --- a/src/store/reader.rs +++ b/src/store/reader.rs @@ -11,6 +11,7 @@ use std::io::{self, Read}; use datastruct::SkipList; use lz4; +#[derive(Clone)] pub struct StoreReader { pub data: ReadOnlySource, pub offset_index_source: ReadOnlySource,