From ec5fb2eaa9412ba14101a848a886324aa2e2dedf Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Mon, 27 Feb 2017 09:52:28 +0900 Subject: [PATCH] NOBUG cleanup --- src/core/segment_meta.rs | 42 +++++++++++++++++++++++++++------ src/functional_test.rs | 2 +- src/indexer/index_writer.rs | 2 +- src/indexer/log_merge_policy.rs | 2 +- src/indexer/segment_updater.rs | 2 +- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/core/segment_meta.rs b/src/core/segment_meta.rs index ee2c9593b..ffcd2f6b9 100644 --- a/src/core/segment_meta.rs +++ b/src/core/segment_meta.rs @@ -14,41 +14,69 @@ struct DeleteMeta { #[derive(Clone, Debug, RustcDecodable,RustcEncodable)] pub struct SegmentMeta { segment_id: SegmentId, - num_docs: u32, + max_doc: u32, deletes: Option, } impl SegmentMeta { + + /// Creates a new segment meta for + /// a segment with no deletes and no documents. pub fn new(segment_id: SegmentId) -> SegmentMeta { SegmentMeta { segment_id: segment_id, - num_docs: 0, + max_doc: 0, deletes: None, } } + /// Returns the segment id. pub fn id(&self) -> SegmentId { self.segment_id } - pub fn num_docs(&self) -> u32 { - self.num_docs - } + /// Returns the number of deleted documents. + pub fn num_deleted_docs(&self) -> u32 { + self.deletes + .as_ref() + .map(|delete_meta| delete_meta.num_deleted_docs) + .unwrap_or(0u32) + } + /// Return the highest doc id + 1 + /// + /// If there are no deletes, then num_docs = max_docs + /// and all the doc ids contains in this segment + /// are exactly (0..max_doc). + pub fn max_doc(&self) -> u32 { + self.max_doc + } + + /// Return the number of documents in the segment. + pub fn num_docs(&self) -> u32 { + self.max_doc() - self.num_deleted_docs() + } + + /// Returns the opstamp of the last delete operation + /// taken in account in this segment. pub fn delete_opstamp(&self) -> Option { self.deletes .as_ref() .map(|delete_meta| delete_meta.opstamp) } + /// Returns true iff the segment meta contains + /// delete information. pub fn has_deletes(&self) -> bool { self.deletes.is_some() } - pub fn set_num_docs(&mut self, num_docs: u32) { - self.num_docs = num_docs; + #[doc(hidden)] + pub fn set_max_doc(&mut self, max_doc: u32) { + self.max_doc = max_doc; } + #[doc(hidden)] pub fn set_delete_meta(&mut self, num_deleted_docs: u32, opstamp: u64) { self.deletes = Some(DeleteMeta { num_deleted_docs: num_deleted_docs, diff --git a/src/functional_test.rs b/src/functional_test.rs index 754eac395..53d8fcd11 100644 --- a/src/functional_test.rs +++ b/src/functional_test.rs @@ -33,7 +33,7 @@ fn test_indexing() { for _ in 0..200 { let random_val = universe.ind_sample(&mut rng); if random_val == 0 { - index_writer.commit(); + index_writer.commit().expect("Commit failed"); committed_docs.extend(&uncommitted_docs); uncommitted_docs.clear(); index.load_searchers().unwrap(); diff --git a/src/indexer/index_writer.rs b/src/indexer/index_writer.rs index 104e2a9f1..b7a60db68 100644 --- a/src/indexer/index_writer.rs +++ b/src/indexer/index_writer.rs @@ -242,7 +242,7 @@ fn index_documents(heap: &mut Heap, // let segment_entry = advance_deletes(&mut segment, delete_queue, delete_position, )?; let mut segment_meta = SegmentMeta::new(segment_id); - segment_meta.set_num_docs(num_docs); + segment_meta.set_max_doc(num_docs); let mut segment_entry = SegmentEntry::new(segment_meta); segment_entry.set_doc_to_opstamp(DocToOpstampMapping::from(doc_opstamps)); diff --git a/src/indexer/log_merge_policy.rs b/src/indexer/log_merge_policy.rs index 413964767..951af8c31 100644 --- a/src/indexer/log_merge_policy.rs +++ b/src/indexer/log_merge_policy.rs @@ -122,7 +122,7 @@ mod tests { fn seg_meta(num_docs: u32) -> SegmentMeta { let mut segment_metas = SegmentMeta::new(SegmentId::generate_random()); - segment_metas.set_num_docs(num_docs); + segment_metas.set_max_doc(num_docs); segment_metas } diff --git a/src/indexer/segment_updater.rs b/src/indexer/segment_updater.rs index 768fe7ea0..6c5b9b451 100644 --- a/src/indexer/segment_updater.rs +++ b/src/indexer/segment_updater.rs @@ -247,7 +247,7 @@ impl SegmentUpdater { let num_docs = merger.write(segment_serializer).expect("Serializing merged index failed"); let mut segment_meta = SegmentMeta::new(merged_segment.id()); - segment_meta.set_num_docs(num_docs); + segment_meta.set_max_doc(num_docs); let segment_entry = SegmentEntry::new(segment_meta); segment_updater_clone