Skip to content

Commit

Permalink
fix memleak by multiple reopens of fields_producer
Browse files Browse the repository at this point in the history
  • Loading branch information
jtong11 committed Oct 9, 2020
1 parent cee9ad5 commit 23b074e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
30 changes: 21 additions & 9 deletions src/core/codec/postings/per_field_postings_format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ impl PostingsFormat for PerFieldPostingsFormat {
}

pub struct PerFieldFieldsReader {
fields: BTreeMap<String, FieldsProducerEnum>,
_formats: HashMap<String, Arc<FieldsProducerEnum>>,
fields: BTreeMap<String, Arc<FieldsProducerEnum>>,
segment: String,
}

Expand All @@ -96,7 +97,7 @@ impl PerFieldFieldsReader {
state: &SegmentReadState<'_, D, DW, C>,
) -> Result<PerFieldFieldsReader> {
let mut fields = BTreeMap::new();
let mut formats = HashMap::new();
let mut _formats = HashMap::new();
for (name, info) in &state.field_infos.by_name {
if let IndexOptions::Null = info.index_options {
continue;
Expand All @@ -113,13 +114,20 @@ impl PerFieldFieldsReader {
.unwrap()
.get(PER_FIELD_POSTING_SUFFIX_KEY)
{
if !formats.contains_key(suffix) {
formats.insert(suffix.clone(), postings_format_for_name(format)?);
let segment_suffix = get_suffix(&format, suffix);

if !_formats.contains_key(&segment_suffix) {
let postings_format = postings_format_for_name(format)?;
let state = SegmentReadState::with_suffix(state, &segment_suffix);
_formats.insert(
segment_suffix.clone(),
Arc::new(postings_format.fields_producer(&state)?),
);
}

if let Some(field_producer) = _formats.get(&segment_suffix) {
fields.insert(name.clone(), field_producer.clone());
}
let postings_format = formats.get(suffix).unwrap();
let suffix = get_suffix(format, suffix);
let state = SegmentReadState::with_suffix(state, &suffix);
fields.insert(name.clone(), postings_format.fields_producer(&state)?);
} else {
bail!(
"Illegal State: missing attribute: {} for field {}",
Expand All @@ -130,7 +138,11 @@ impl PerFieldFieldsReader {
}
}
let segment = state.segment_info.name.clone();
Ok(PerFieldFieldsReader { fields, segment })
Ok(PerFieldFieldsReader {
_formats,
fields,
segment,
})
}

fn terms_impl(&self, field: &str) -> Result<Option<FieldReaderRef>> {
Expand Down
4 changes: 1 addition & 3 deletions src/core/util/variant_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,7 @@ impl VariantValue {
None
}
}
_ => {
None
}
_ => None,
}
}

Expand Down

0 comments on commit 23b074e

Please sign in to comment.