diff --git a/src/core/index_meta.rs b/src/core/index_meta.rs index c73aab6d7..8927c5403 100644 --- a/src/core/index_meta.rs +++ b/src/core/index_meta.rs @@ -1,8 +1,8 @@ use core::SegmentMeta; -use indexer::Opstamp; use schema::Schema; use serde_json; use std::fmt; +use Opstamp; /// Meta information about the `Index`. /// diff --git a/src/core/segment.rs b/src/core/segment.rs index 1f582d6aa..b87208fcb 100644 --- a/src/core/segment.rs +++ b/src/core/segment.rs @@ -6,11 +6,11 @@ use directory::error::{OpenReadError, OpenWriteError}; use directory::Directory; use directory::{ReadOnlySource, WritePtr}; use indexer::segment_serializer::SegmentSerializer; -use indexer::Opstamp; use schema::Schema; use std::fmt; use std::path::PathBuf; use std::result; +use Opstamp; use Result; /// A segment is a piece of the index. diff --git a/src/core/segment_meta.rs b/src/core/segment_meta.rs index 7ad7ecf2c..2f4b4177e 100644 --- a/src/core/segment_meta.rs +++ b/src/core/segment_meta.rs @@ -1,11 +1,11 @@ use super::SegmentComponent; use census::{Inventory, TrackedObject}; use core::SegmentId; -use indexer::Opstamp; use serde; use std::collections::HashSet; use std::fmt; use std::path::PathBuf; +use Opstamp; lazy_static! { static ref INVENTORY: Inventory = { Inventory::new() }; @@ -137,7 +137,7 @@ impl SegmentMeta { self.max_doc() - self.num_deleted_docs() } - /// Returns the opstamp of the last delete operation + /// Returns the `Opstamp` of the last delete operation /// taken in account in this segment. pub fn delete_opstamp(&self) -> Option { self.tracked diff --git a/src/indexer/delete_queue.rs b/src/indexer/delete_queue.rs index b46640ff4..595691f98 100644 --- a/src/indexer/delete_queue.rs +++ b/src/indexer/delete_queue.rs @@ -1,8 +1,8 @@ use super::operation::DeleteOperation; -use indexer::Opstamp; use std::mem; use std::ops::DerefMut; use std::sync::{Arc, RwLock}; +use Opstamp; // The DeleteQueue is similar in conceptually to a multiple // consumer single producer broadcast channel. diff --git a/src/indexer/doc_opstamp_mapping.rs b/src/indexer/doc_opstamp_mapping.rs index c3f498df3..d616800ab 100644 --- a/src/indexer/doc_opstamp_mapping.rs +++ b/src/indexer/doc_opstamp_mapping.rs @@ -1,5 +1,6 @@ use std::sync::Arc; use DocId; +use Opstamp; // Doc to opstamp is used to identify which // document should be deleted. @@ -22,8 +23,6 @@ pub enum DocToOpstampMapping { None, } -use super::Opstamp; - impl From> for DocToOpstampMapping { fn from(opstamps: Vec) -> DocToOpstampMapping { DocToOpstampMapping::WithMap(Arc::new(opstamps)) diff --git a/src/indexer/index_writer.rs b/src/indexer/index_writer.rs index 3b4a01e63..398e61358 100644 --- a/src/indexer/index_writer.rs +++ b/src/indexer/index_writer.rs @@ -19,7 +19,6 @@ use indexer::doc_opstamp_mapping::DocToOpstampMapping; use indexer::operation::DeleteOperation; use indexer::stamper::Stamper; use indexer::MergePolicy; -use indexer::Opstamp; use indexer::SegmentEntry; use indexer::SegmentWriter; use postings::compute_table_size; @@ -31,6 +30,7 @@ use std::ops::Range; use std::sync::Arc; use std::thread; use std::thread::JoinHandle; +use Opstamp; use Result; // Size of the margin for the heap. A segment is closed when the remaining memory diff --git a/src/indexer/merge_operation.rs b/src/indexer/merge_operation.rs index 5bf84f187..0474fefd8 100644 --- a/src/indexer/merge_operation.rs +++ b/src/indexer/merge_operation.rs @@ -1,6 +1,6 @@ use census::{Inventory, TrackedObject}; -use indexer::Opstamp; use std::collections::HashSet; +use Opstamp; use SegmentId; #[derive(Default)] @@ -18,8 +18,8 @@ impl MergeOperationInventory { } } -/// A `MergeOperation` has two role. -/// It carries all of the information required to describe a merge : +/// A `MergeOperation` has two roles. +/// It carries all of the information required to describe a merge: /// - `target_opstamp` is the opstamp up to which we want to consume the /// delete queue and reflect their deletes. /// - `segment_ids` is the list of segment to be merged. diff --git a/src/indexer/mod.rs b/src/indexer/mod.rs index 9c154c620..0620230ad 100644 --- a/src/indexer/mod.rs +++ b/src/indexer/mod.rs @@ -25,7 +25,6 @@ pub use self::segment_entry::SegmentEntry; pub use self::segment_manager::SegmentManager; pub use self::segment_serializer::SegmentSerializer; pub use self::segment_writer::SegmentWriter; -pub use self::stamper::Opstamp; /// Alias for the default merge policy, which is the `LogMergePolicy`. pub type DefaultMergePolicy = LogMergePolicy; diff --git a/src/indexer/operation.rs b/src/indexer/operation.rs index e5beca2b3..03bfabb59 100644 --- a/src/indexer/operation.rs +++ b/src/indexer/operation.rs @@ -1,6 +1,6 @@ -use indexer::Opstamp; use schema::Document; use schema::Term; +use Opstamp; /// Timestamped Delete operation. #[derive(Clone, Eq, PartialEq, Debug)] diff --git a/src/indexer/prepared_commit.rs b/src/indexer/prepared_commit.rs index 77ea073ee..92f47cdfd 100644 --- a/src/indexer/prepared_commit.rs +++ b/src/indexer/prepared_commit.rs @@ -1,5 +1,5 @@ use super::IndexWriter; -use indexer::Opstamp; +use Opstamp; use Result; /// A prepared commit diff --git a/src/indexer/segment_updater.rs b/src/indexer/segment_updater.rs index e0168a799..4dd7a6804 100644 --- a/src/indexer/segment_updater.rs +++ b/src/indexer/segment_updater.rs @@ -20,7 +20,6 @@ use indexer::merge_operation::MergeOperationInventory; use indexer::merger::IndexMerger; use indexer::stamper::Stamper; use indexer::MergeOperation; -use indexer::Opstamp; use indexer::SegmentEntry; use indexer::SegmentSerializer; use indexer::{DefaultMergePolicy, MergePolicy}; @@ -37,6 +36,7 @@ use std::sync::Arc; use std::sync::RwLock; use std::thread; use std::thread::JoinHandle; +use Opstamp; use Result; /// Save the index meta file. diff --git a/src/indexer/segment_writer.rs b/src/indexer/segment_writer.rs index e533bdc98..09ac497ca 100644 --- a/src/indexer/segment_writer.rs +++ b/src/indexer/segment_writer.rs @@ -4,7 +4,6 @@ use core::SerializableSegment; use fastfield::FastFieldsWriter; use fieldnorm::FieldNormsWriter; use indexer::segment_serializer::SegmentSerializer; -use indexer::Opstamp; use postings::MultiFieldPostingsWriter; use schema::FieldType; use schema::Schema; @@ -16,6 +15,7 @@ use tokenizer::BoxedTokenizer; use tokenizer::FacetTokenizer; use tokenizer::{TokenStream, Tokenizer}; use DocId; +use Opstamp; use Result; /// A `SegmentWriter` is in charge of creating segment index from a diff --git a/src/indexer/stamper.rs b/src/indexer/stamper.rs index 65dba3acc..ce7cd1050 100644 --- a/src/indexer/stamper.rs +++ b/src/indexer/stamper.rs @@ -1,8 +1,7 @@ use std::ops::Range; use std::sync::atomic::Ordering; use std::sync::Arc; - -pub type Opstamp = u64; +use Opstamp; // AtomicU64 have not landed in stable. // For the moment let's just use AtomicUsize on @@ -10,8 +9,8 @@ pub type Opstamp = u64; #[cfg(target_arch = "x86_64")] mod archicture_impl { - use indexer::stamper::Opstamp; use std::sync::atomic::{AtomicU64, Ordering}; + use Opstamp; #[derive(Default)] pub struct AtomicU64Ersatz(AtomicU64); @@ -35,10 +34,10 @@ mod archicture_impl { #[cfg(not(target_arch = "x86_64"))] mod archicture_impl { - use indexer::stamper::Opstamp; use std::sync::atomic::Ordering; /// Under other architecture, we rely on a mutex. use std::sync::RwLock; + use Opstamp; #[derive(Default)] pub struct AtomicU64Ersatz(RwLock); diff --git a/src/lib.rs b/src/lib.rs index 3a4a676dd..64cdf2e69 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -254,6 +254,14 @@ pub mod merge_policy { /// as they are added in the segment. pub type DocId = u32; +/// A u64 assigned to every operation incrementally +/// +/// Used to sequence operations in the correct order during +/// asynchronous processing of adding documents, merging segments or rollback +/// Modelled by an AtomicU64 or a u64 under a RW-lock +/// on platforms without atomic integer support. +pub type Opstamp = u64; + /// A f32 that represents the relevance of the document to the query /// /// This is modelled internally as a `f32`. The