Mercurial > lbo > hg > sstable
changeset 31:db6eae79024a
Eradicate even more obsolete code
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Jan 2017 20:05:19 +0100 |
parents | cf6c50c9a5e7 |
children | f4caa5af5b93 |
files | src/cmp.rs src/filter.rs src/key_types.rs src/lib.rs src/table_builder.rs src/table_reader.rs |
diffstat | 6 files changed, 27 insertions(+), 209 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cmp.rs Tue Jan 03 19:59:01 2017 +0100 +++ b/src/cmp.rs Tue Jan 03 20:05:19 2017 +0100 @@ -1,8 +1,4 @@ -use key_types::{self, LookupKey}; -use types; - use std::cmp::Ordering; -use std::sync::Arc; /// Comparator trait, supporting types that can be nested (i.e., add additional functionality on /// top of an inner comparator) @@ -62,50 +58,9 @@ } } -/// Same as memtable_key_cmp, but for InternalKeys. -#[derive(Clone)] -pub struct InternalKeyCmp(pub Arc<Box<Cmp>>); - -impl Cmp for InternalKeyCmp { - fn cmp(&self, a: &[u8], b: &[u8]) -> Ordering { - let (_, seqa, keya) = key_types::parse_internal_key(a); - let (_, seqb, keyb) = key_types::parse_internal_key(b); - - match self.0.cmp(keya, keyb) { - Ordering::Less => Ordering::Less, - Ordering::Greater => Ordering::Greater, - // reverse comparison! - Ordering::Equal => seqb.cmp(&seqa), - } - } - - fn find_shortest_sep(&self, a: &[u8], b: &[u8]) -> Vec<u8> { - let (_, seqa, keya) = key_types::parse_internal_key(a); - let (_, _, keyb) = key_types::parse_internal_key(b); - - let sep: Vec<u8> = self.0.find_shortest_sep(keya, keyb); - - if sep.len() < keya.len() && self.0.cmp(keya, &sep) == Ordering::Less { - return LookupKey::new(&sep, types::MAX_SEQUENCE_NUMBER).internal_key().to_vec(); - } - - return LookupKey::new(&sep, seqa).internal_key().to_vec(); - } - - fn find_short_succ(&self, a: &[u8]) -> Vec<u8> { - let (_, seq, key) = key_types::parse_internal_key(a); - let succ: Vec<u8> = self.0.find_short_succ(key); - return LookupKey::new(&succ, seq).internal_key().to_vec(); - } -} - #[cfg(test)] mod tests { use super::*; - use key_types::LookupKey; - use types; - - use std::sync::Arc; #[test] fn test_cmp_defaultcmp_shortest_sep() { @@ -135,27 +90,4 @@ assert_eq!(DefaultCmp.find_short_succ(&[0xff, 0xff, 0xff]), &[0xff, 0xff, 0xff, 0xff]); } - - #[test] - fn test_cmp_internalkeycmp_shortest_sep() { - let cmp = InternalKeyCmp(Arc::new(Box::new(DefaultCmp))); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("abcd".as_bytes(), 1).internal_key(), - LookupKey::new("abcf".as_bytes(), 2).internal_key()), - LookupKey::new("abce".as_bytes(), 1).internal_key()); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("abc".as_bytes(), 1).internal_key(), - LookupKey::new("zzz".as_bytes(), 2).internal_key()), - LookupKey::new("b".as_bytes(), types::MAX_SEQUENCE_NUMBER).internal_key()); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("abc".as_bytes(), 1).internal_key(), - LookupKey::new("acd".as_bytes(), 2).internal_key()), - LookupKey::new("abc".as_bytes(), 1).internal_key()); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("abc".as_bytes(), 1).internal_key(), - LookupKey::new("abe".as_bytes(), 2).internal_key()), - LookupKey::new("abd".as_bytes(), 1).internal_key()); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("".as_bytes(), 1).internal_key(), - LookupKey::new("".as_bytes(), 2).internal_key()), - LookupKey::new("".as_bytes(), 1).internal_key()); - assert_eq!(cmp.find_shortest_sep(LookupKey::new("abc".as_bytes(), 2).internal_key(), - LookupKey::new("abc".as_bytes(), 2).internal_key()), - LookupKey::new("abc".as_bytes(), 2).internal_key()); - } }
--- a/src/filter.rs Tue Jan 03 19:59:01 2017 +0100 +++ b/src/filter.rs Tue Jan 03 20:05:19 2017 +0100 @@ -215,7 +215,6 @@ #[cfg(test)] mod tests { use super::*; - use key_types::LookupKey; const _BITS_PER_KEY: u32 = 12; @@ -236,20 +235,6 @@ filter } - /// Creates a filter using the keys from input_data() but converted to InternalKey format. - fn create_internalkey_filter() -> Vec<u8> { - let fpol = InternalFilterPolicy::new(BloomPolicy::new(_BITS_PER_KEY)); - let input: Vec<Vec<u8>> = input_data() - .into_iter() - .map(|k| LookupKey::new(k, 123).internal_key().to_vec()) - .collect(); - let input_ = input.iter().map(|k| k.as_slice()).collect(); - - let filter = fpol.create_filter(&input_); - - filter - } - #[test] fn test_filter_bloom() { let f = create_filter(); @@ -260,12 +245,6 @@ } } - /// This test verifies that InternalFilterPolicy works correctly. - #[test] - fn test_filter_internal_keys_identical() { - assert_eq!(create_filter(), create_internalkey_filter()); - } - #[test] fn test_filter_bloom_hash() { let d1 = vec![0x62];
--- a/src/key_types.rs Tue Jan 03 19:59:01 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -use options::{CompressionType, int_to_compressiontype}; -use types::{ValueType, SequenceNumber}; - -use integer_encoding::{FixedInt, VarInt}; - -// The following typedefs are used to distinguish between the different key formats used internally -// by different modules. - -// TODO: At some point, convert those into actual types with conversions between them. That's a lot -// of boilerplate, but increases type safety. - -/// A UserKey is the actual key supplied by the calling application, without any internal -/// decorations. -pub type UserKey<'a> = &'a [u8]; - -/// An InternalKey consists of [key, tag], and is used as item type for Table iterators. -pub type InternalKey<'a> = &'a [u8]; - -/// A LookupKey is the first part of a memtable key, consisting of [keylen: varint32, key: *u8, -/// tag: u64] -/// keylen is the length of key plus 8 (for the tag; this for LevelDB compatibility) -#[derive(Clone, Debug)] -pub struct LookupKey { - key: Vec<u8>, - key_offset: usize, -} - -impl LookupKey { - #[allow(unused_assignments)] - pub fn new(k: &[u8], s: SequenceNumber) -> LookupKey { - let mut key = Vec::with_capacity(k.len() + k.len().required_space() + - <u64 as FixedInt>::required_space()); - let internal_keylen = k.len() + 8; - let mut i = 0; - - key.reserve(internal_keylen.required_space() + internal_keylen); - - key.resize(internal_keylen.required_space(), 0); - i += internal_keylen.encode_var(&mut key[i..]); - - key.extend_from_slice(k); - i += k.len(); - - key.resize(i + <u64 as FixedInt>::required_space(), 0); - (s << 8 | ValueType::TypeValue as u64).encode_fixed(&mut key[i..]); - i += <u64 as FixedInt>::required_space(); - - LookupKey { - key: key, - key_offset: k.len().required_space(), - } - } - - // Returns only key - #[allow(dead_code)] - pub fn user_key<'a>(&'a self) -> UserKey<'a> { - &self.key[self.key_offset..self.key.len() - 8] - } - - // Returns key+tag - pub fn internal_key<'a>(&'a self) -> InternalKey<'a> { - &self.key[self.key_offset..] - } -} - -/// Parses a tag into (type, sequence number) -pub fn parse_tag(tag: u64) -> (ValueType, u64) { - let seq = tag >> 8; - let typ = tag & 0xff; - - match typ { - 0 => (ValueType::TypeDeletion, seq), - 1 => (ValueType::TypeValue, seq), - _ => (ValueType::TypeValue, seq), - } -} - -/// Parse a key in InternalKey format. -pub fn parse_internal_key<'a>(ikey: InternalKey<'a>) -> (CompressionType, u64, UserKey<'a>) { - assert!(ikey.len() >= 8); - - let (ctype, seq) = parse_tag(FixedInt::decode_fixed(&ikey[ikey.len() - 8..])); - let ctype = int_to_compressiontype(ctype as u32).unwrap_or(CompressionType::CompressionNone); - - return (ctype, seq, &ikey[0..ikey.len() - 8]); -} - -#[cfg(test)] -mod tests {}
--- a/src/lib.rs Tue Jan 03 19:59:01 2017 +0100 +++ b/src/lib.rs Tue Jan 03 20:05:19 2017 +0100 @@ -3,17 +3,17 @@ mod block; mod blockhandle; -mod cmp; mod filter; mod filter_block; -mod key_types; mod types; +pub mod cmp; pub mod iterator; pub mod options; pub mod table_builder; pub mod table_reader; +pub use cmp::Cmp; pub use iterator::StandardComparator; pub use iterator::SSIterator; pub use options::{Options, ReadOptions};
--- a/src/table_builder.rs Tue Jan 03 19:59:01 2017 +0100 +++ b/src/table_builder.rs Tue Jan 03 20:05:19 2017 +0100 @@ -2,7 +2,6 @@ use blockhandle::BlockHandle; use filter::{BoxedFilterPolicy, NoFilterPolicy}; use filter_block::FilterBlockBuilder; -use key_types::InternalKey; use options::{CompressionType, Options}; use std::io::Write; @@ -96,8 +95,6 @@ /// TableBuilder is used for building a new SSTable. It groups entries into blocks, /// calculating checksums and bloom filters. -/// It's recommended that you use InternalFilterPolicy as FilterPol, as that policy extracts the -/// underlying user keys from the InternalKeys used as keys in the table. impl<'a, Dst: Write> TableBuilder<'a, Dst> { /// Create a new TableBuilder. Currently the best choice for `fpol` is `NoFilterPolicy` (mod /// filter; or use new_no_filter()) @@ -143,7 +140,7 @@ /// Writes an index entry for the current data_block where `next_key` is the first key of the /// next block. /// Calls write_block() for writing the block to disk. - fn write_data_block<'b>(&mut self, next_key: InternalKey<'b>) { + fn write_data_block(&mut self, next_key: &[u8]) { assert!(self.data_block.is_some()); let block = self.data_block.take().unwrap();
--- a/src/table_reader.rs Tue Jan 03 19:59:01 2017 +0100 +++ b/src/table_reader.rs Tue Jan 03 20:05:19 2017 +0100 @@ -2,7 +2,6 @@ use blockhandle::BlockHandle; use filter::BoxedFilterPolicy; use filter_block::FilterBlockReader; -use key_types::InternalKey; use options::{self, CompressionType, Options}; use table_builder::{self, Footer}; use iterator::SSIterator; @@ -165,13 +164,13 @@ /// Retrieve value from table. This function uses the attached filters, so is better suited if /// you frequently look for non-existing values (as it will detect the non-existence of an /// entry in a block without having to load the block). - pub fn get<'a>(&mut self, to: InternalKey<'a>) -> Option<Vec<u8>> { + pub fn get(&mut self, key: &[u8]) -> Option<Vec<u8>> { let mut iter = self.iter(); - iter.seek(to); + iter.seek(key); if let Some((k, v)) = iter.current() { - if k == to { Some(v) } else { None } + if k == key { Some(v) } else { None } } else { None } @@ -377,9 +376,9 @@ src[10] += 1; let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); assert!(table.filters.is_some()); @@ -410,9 +409,9 @@ let data = build_data(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); let mut iter = table.iter(); let mut i = 0; @@ -446,9 +445,9 @@ let (src, size) = build_table(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); let filter_reader = table.filters.clone().unwrap(); let mut iter = table.iter(); @@ -469,9 +468,9 @@ let (src, size) = build_table(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); let mut iter = table.iter(); @@ -503,9 +502,9 @@ let data = build_data(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); let mut iter = table.iter(); let mut i = 0; @@ -540,9 +539,9 @@ let (src, size) = build_table(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); let mut iter = table.iter(); @@ -561,9 +560,9 @@ let (src, size) = build_table(); let mut table = Table::new(Options::default(), - Cursor::new(&src as &[u8]), - size, - BloomPolicy::new(4)) + Cursor::new(&src as &[u8]), + size, + BloomPolicy::new(4)) .unwrap(); assert!(table.get("aaa".as_bytes()).is_none());