Unverified Commit e26d5bd6 authored by qupeng's avatar qupeng Committed by GitHub

iterator: fix error handling about valid (#411) (#412)

Signed-off-by: 's avatarqupeng <qupeng@pingcap.com>
parent 0f27b8a6
...@@ -35,7 +35,7 @@ pub use metadata::{ColumnFamilyMetaData, LevelMetaData, SstFileMetaData}; ...@@ -35,7 +35,7 @@ pub use metadata::{ColumnFamilyMetaData, LevelMetaData, SstFileMetaData};
pub use perf_context::{get_perf_level, set_perf_level, IOStatsContext, PerfContext, PerfLevel}; pub use perf_context::{get_perf_level, set_perf_level, IOStatsContext, PerfContext, PerfLevel};
pub use rocksdb::{ pub use rocksdb::{
load_latest_options, run_ldb_tool, set_external_sst_file_global_seq_no, BackupEngine, CFHandle, load_latest_options, run_ldb_tool, set_external_sst_file_global_seq_no, BackupEngine, CFHandle,
Cache, DBIterator, DBVector, Env, ExternalSstFileInfo, Kv, MemoryAllocator, Range, SeekKey, Cache, DBIterator, DBVector, Env, ExternalSstFileInfo, MemoryAllocator, Range, SeekKey,
SequentialFile, SstFileReader, SstFileWriter, Writable, WriteBatch, DB, SequentialFile, SstFileReader, SstFileWriter, Writable, WriteBatch, DB,
}; };
pub use rocksdb_options::{ pub use rocksdb_options::{
...@@ -54,6 +54,9 @@ pub use table_properties_collector::TablePropertiesCollector; ...@@ -54,6 +54,9 @@ pub use table_properties_collector::TablePropertiesCollector;
pub use table_properties_collector_factory::TablePropertiesCollectorFactory; pub use table_properties_collector_factory::TablePropertiesCollectorFactory;
pub use titan::{TitanBlobIndex, TitanDBOptions}; pub use titan::{TitanBlobIndex, TitanDBOptions};
#[allow(deprecated)]
pub use rocksdb::Kv;
mod compaction_filter; mod compaction_filter;
pub mod comparator; pub mod comparator;
mod event_listener; mod event_listener;
......
...@@ -423,10 +423,8 @@ mod test { ...@@ -423,10 +423,8 @@ mod test {
let mut ctx = PerfContext::get(); let mut ctx = PerfContext::get();
let mut iter = db.iter(); let mut iter = db.iter();
assert!(iter.seek(SeekKey::Start)); assert!(iter.seek(SeekKey::Start).unwrap());
while iter.valid() { while iter.next().unwrap() {}
iter.next();
}
assert_eq!(ctx.internal_key_skipped_count(), n); assert_eq!(ctx.internal_key_skipped_count(), n);
assert_eq!(ctx.internal_delete_skipped_count(), n / 2); assert_eq!(ctx.internal_delete_skipped_count(), n / 2);
assert_eq!(ctx.seek_internal_seek_time(), 0); assert_eq!(ctx.seek_internal_seek_time(), 0);
...@@ -440,9 +438,9 @@ mod test { ...@@ -440,9 +438,9 @@ mod test {
assert_eq!(get_perf_level(), PerfLevel::EnableTime); assert_eq!(get_perf_level(), PerfLevel::EnableTime);
let mut iter = db.iter(); let mut iter = db.iter();
assert!(iter.seek(SeekKey::End)); assert!(iter.seek(SeekKey::End).unwrap());
while iter.valid() { while iter.valid().unwrap() {
iter.prev(); iter.prev().unwrap();
} }
assert_eq!(ctx.internal_key_skipped_count(), n + n / 2); assert_eq!(ctx.internal_key_skipped_count(), n + n / 2);
assert_eq!(ctx.internal_delete_skipped_count(), n / 2); assert_eq!(ctx.internal_delete_skipped_count(), n / 2);
......
...@@ -187,7 +187,7 @@ impl<D: Deref<Target = DB>> DBIterator<D> { ...@@ -187,7 +187,7 @@ impl<D: Deref<Target = DB>> DBIterator<D> {
} }
impl<D> DBIterator<D> { impl<D> DBIterator<D> {
pub fn seek(&mut self, key: SeekKey) -> bool { pub fn seek(&mut self, key: SeekKey) -> Result<bool, String> {
unsafe { unsafe {
match key { match key {
SeekKey::Start => crocksdb_ffi::crocksdb_iter_seek_to_first(self.inner), SeekKey::Start => crocksdb_ffi::crocksdb_iter_seek_to_first(self.inner),
...@@ -200,7 +200,7 @@ impl<D> DBIterator<D> { ...@@ -200,7 +200,7 @@ impl<D> DBIterator<D> {
self.valid() self.valid()
} }
pub fn seek_for_prev(&mut self, key: SeekKey) -> bool { pub fn seek_for_prev(&mut self, key: SeekKey) -> Result<bool, String> {
unsafe { unsafe {
match key { match key {
SeekKey::Start => crocksdb_ffi::crocksdb_iter_seek_to_first(self.inner), SeekKey::Start => crocksdb_ffi::crocksdb_iter_seek_to_first(self.inner),
...@@ -215,22 +215,24 @@ impl<D> DBIterator<D> { ...@@ -215,22 +215,24 @@ impl<D> DBIterator<D> {
self.valid() self.valid()
} }
pub fn prev(&mut self) -> bool { pub fn prev(&mut self) -> Result<bool, String> {
unsafe { unsafe {
crocksdb_ffi::crocksdb_iter_prev(self.inner); crocksdb_ffi::crocksdb_iter_prev(self.inner);
} }
self.valid() self.valid()
} }
pub fn next(&mut self) -> bool { #[allow(clippy::should_implement_trait)]
pub fn next(&mut self) -> Result<bool, String> {
unsafe { unsafe {
crocksdb_ffi::crocksdb_iter_next(self.inner); crocksdb_ffi::crocksdb_iter_next(self.inner);
} }
self.valid() self.valid()
} }
/// Get the key pointed by the iterator. Must be called when `self.valid() == Ok(true)`.
pub fn key(&self) -> &[u8] { pub fn key(&self) -> &[u8] {
assert!(self.valid()); debug_assert_eq!(self.valid(), Ok(true));
let mut key_len: size_t = 0; let mut key_len: size_t = 0;
let key_len_ptr: *mut size_t = &mut key_len; let key_len_ptr: *mut size_t = &mut key_len;
unsafe { unsafe {
...@@ -239,8 +241,9 @@ impl<D> DBIterator<D> { ...@@ -239,8 +241,9 @@ impl<D> DBIterator<D> {
} }
} }
/// Get the value pointed by the iterator. Must be called when `self.valid() == Ok(true)`.
pub fn value(&self) -> &[u8] { pub fn value(&self) -> &[u8] {
assert!(self.valid()); debug_assert_eq!(self.valid(), Ok(true));
let mut val_len: size_t = 0; let mut val_len: size_t = 0;
let val_len_ptr: *mut size_t = &mut val_len; let val_len_ptr: *mut size_t = &mut val_len;
unsafe { unsafe {
...@@ -249,19 +252,24 @@ impl<D> DBIterator<D> { ...@@ -249,19 +252,24 @@ impl<D> DBIterator<D> {
} }
} }
#[deprecated]
pub fn kv(&self) -> Option<(Vec<u8>, Vec<u8>)> { pub fn kv(&self) -> Option<(Vec<u8>, Vec<u8>)> {
if self.valid() { if self.valid().unwrap() {
Some((self.key().to_vec(), self.value().to_vec())) Some((self.key().to_vec(), self.value().to_vec()))
} else { } else {
None None
} }
} }
pub fn valid(&self) -> bool { pub fn valid(&self) -> Result<bool, String> {
unsafe { crocksdb_ffi::crocksdb_iter_valid(self.inner) } let valid = unsafe { crocksdb_ffi::crocksdb_iter_valid(self.inner) };
if !valid {
self.status()?;
}
Ok(valid)
} }
pub fn status(&self) -> Result<(), String> { fn status(&self) -> Result<(), String> {
unsafe { unsafe {
ffi_try!(crocksdb_iter_get_error(self.inner)); ffi_try!(crocksdb_iter_get_error(self.inner));
} }
...@@ -269,17 +277,24 @@ impl<D> DBIterator<D> { ...@@ -269,17 +277,24 @@ impl<D> DBIterator<D> {
} }
} }
#[deprecated]
pub type Kv = (Vec<u8>, Vec<u8>); pub type Kv = (Vec<u8>, Vec<u8>);
#[deprecated]
impl<'b, D> Iterator for &'b mut DBIterator<D> { impl<'b, D> Iterator for &'b mut DBIterator<D> {
#[allow(deprecated)]
type Item = Kv; type Item = Kv;
fn next(&mut self) -> Option<Kv> { fn next(&mut self) -> Option<Self::Item> {
let kv = self.kv(); match self.valid() {
if kv.is_some() { Ok(true) => {}
DBIterator::next(self); Ok(false) => return None,
Err(e) => panic!("invalid iterator: {}", e),
} }
kv let k = self.key().to_vec();
let v = self.value().to_vec();
let _ = DBIterator::next(self);
Some((k, v))
} }
} }
...@@ -2677,7 +2692,7 @@ mod test { ...@@ -2677,7 +2692,7 @@ mod test {
db.put(b"k2", b"v2222").expect(""); db.put(b"k2", b"v2222").expect("");
db.put(b"k3", b"v3333").expect(""); db.put(b"k3", b"v3333").expect("");
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for (k, v) in &mut iter { for (k, v) in &mut iter {
println!( println!(
"Hello {}: {}", "Hello {}: {}",
......
...@@ -65,9 +65,9 @@ fn test_delete_files_in_range_with_iter() { ...@@ -65,9 +65,9 @@ fn test_delete_files_in_range_with_iter() {
db.delete_files_in_range(b"key2", b"key7", false).unwrap(); db.delete_files_in_range(b"key2", b"key7", false).unwrap();
let mut count = 0; let mut count = 0;
assert!(iter.seek(SeekKey::Start)); assert!(iter.seek(SeekKey::Start).unwrap());
while iter.valid() { while iter.valid().unwrap() {
iter.next(); iter.next().unwrap();
count = count + 1; count = count + 1;
} }
...@@ -88,11 +88,11 @@ fn test_delete_files_in_range_with_snap() { ...@@ -88,11 +88,11 @@ fn test_delete_files_in_range_with_snap() {
db.delete_files_in_range(b"key2", b"key7", false).unwrap(); db.delete_files_in_range(b"key2", b"key7", false).unwrap();
let mut iter = snap.iter(); let mut iter = snap.iter();
assert!(iter.seek(SeekKey::Start)); assert!(iter.seek(SeekKey::Start).unwrap());
let mut count = 0; let mut count = 0;
while iter.valid() { while iter.valid().unwrap() {
iter.next(); iter.next().unwrap();
count = count + 1; count = count + 1;
} }
...@@ -158,12 +158,12 @@ fn test_delete_files_in_range_with_delete_range() { ...@@ -158,12 +158,12 @@ fn test_delete_files_in_range_with_delete_range() {
db.compact_range(None, None); db.compact_range(None, None);
let mut it = db.iter(); let mut it = db.iter();
it.seek(SeekKey::Start); it.seek(SeekKey::Start).unwrap();
assert!(it.valid()); assert!(it.valid().unwrap());
assert_eq!(it.key(), b"4"); assert_eq!(it.key(), b"4");
assert!(it.next()); assert!(it.next().unwrap());
assert_eq!(it.key(), b"5"); assert_eq!(it.key(), b"5");
assert!(!it.next()); assert!(!it.next().unwrap());
} }
#[test] #[test]
...@@ -185,19 +185,18 @@ fn test_delete_files_in_ranges() { ...@@ -185,19 +185,18 @@ fn test_delete_files_in_ranges() {
// Check that ["key0", "key5"] have been deleted, but ["key6", "key8"] still exist. // Check that ["key0", "key5"] have been deleted, but ["key6", "key8"] still exist.
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for i in 6..9 { for i in 6..9 {
assert!(iter.valid()); assert!(iter.valid().unwrap());
let k = format!("key{}", i); let k = format!("key{}", i);
assert_eq!(iter.key(), k.as_bytes()); assert_eq!(iter.key(), k.as_bytes());
iter.next(); iter.next().unwrap();
} }
assert!(!iter.valid()); assert!(!iter.valid().unwrap());
// Delete the last file. // Delete the last file.
let ranges = vec![Range::new(b"key6", b"key8")]; let ranges = vec![Range::new(b"key6", b"key8")];
db.delete_files_in_ranges_cf(cf, &ranges, true).unwrap(); db.delete_files_in_ranges_cf(cf, &ranges, true).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); assert!(!iter.seek(SeekKey::Start).unwrap());
assert!(!iter.valid());
} }
...@@ -42,10 +42,10 @@ fn gen_sst_from_db(opt: ColumnFamilyOptions, cf: Option<&CFHandle>, path: &str, ...@@ -42,10 +42,10 @@ fn gen_sst_from_db(opt: ColumnFamilyOptions, cf: Option<&CFHandle>, path: &str,
}; };
writer.open(path).unwrap(); writer.open(path).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
while iter.valid() { while iter.valid().unwrap() {
writer.put(iter.key(), iter.value()).unwrap(); writer.put(iter.key(), iter.value()).unwrap();
iter.next(); iter.next().unwrap();
} }
writer.finish().unwrap(); writer.finish().unwrap();
} }
...@@ -53,11 +53,11 @@ fn gen_sst_from_db(opt: ColumnFamilyOptions, cf: Option<&CFHandle>, path: &str, ...@@ -53,11 +53,11 @@ fn gen_sst_from_db(opt: ColumnFamilyOptions, cf: Option<&CFHandle>, path: &str,
fn gen_crc32_from_db(db: &DB) -> u32 { fn gen_crc32_from_db(db: &DB) -> u32 {
let mut digest = Digest::new(crc32::IEEE); let mut digest = Digest::new(crc32::IEEE);
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
while iter.valid() { while iter.valid().unwrap() {
digest.write(iter.key()); digest.write(iter.key());
digest.write(iter.value()); digest.write(iter.value());
iter.next(); iter.next().unwrap();
} }
digest.sum32() digest.sum32()
} }
...@@ -65,14 +65,14 @@ fn gen_crc32_from_db(db: &DB) -> u32 { ...@@ -65,14 +65,14 @@ fn gen_crc32_from_db(db: &DB) -> u32 {
fn gen_crc32_from_db_in_range(db: &DB, start_key: &[u8], end_key: &[u8]) -> u32 { fn gen_crc32_from_db_in_range(db: &DB, start_key: &[u8], end_key: &[u8]) -> u32 {
let mut digest = Digest::new(crc32::IEEE); let mut digest = Digest::new(crc32::IEEE);
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Key(start_key)); iter.seek(SeekKey::Key(start_key)).unwrap();
while iter.valid() { while iter.valid().unwrap() {
if iter.key() >= end_key { if iter.key() >= end_key {
break; break;
} }
digest.write(iter.key()); digest.write(iter.key());
digest.write(iter.value()); digest.write(iter.value());
iter.next(); iter.next().unwrap();
} }
digest.sum32() digest.sum32()
} }
......
...@@ -280,16 +280,16 @@ fn gen_sst_from_cf(opt: ColumnFamilyOptions, db: &DB, cf: &CFHandle, path: &str) ...@@ -280,16 +280,16 @@ fn gen_sst_from_cf(opt: ColumnFamilyOptions, db: &DB, cf: &CFHandle, path: &str)
let mut writer = SstFileWriter::new_cf(env_opt, opt, cf); let mut writer = SstFileWriter::new_cf(env_opt, opt, cf);
writer.open(path).unwrap(); writer.open(path).unwrap();
let mut iter = db.iter_cf(cf); let mut iter = db.iter_cf(cf);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
while iter.valid() { while iter.valid().unwrap() {
writer.put(iter.key(), iter.value()).unwrap(); writer.put(iter.key(), iter.value()).unwrap();
iter.next(); iter.next().unwrap();
} }
let info = writer.finish().unwrap(); let info = writer.finish().unwrap();
assert_eq!(info.file_path().to_str().unwrap(), path); assert_eq!(info.file_path().to_str().unwrap(), path);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(info.smallest_key(), iter.key()); assert_eq!(info.smallest_key(), iter.key());
iter.seek(SeekKey::End); iter.seek(SeekKey::End).unwrap();
assert_eq!(info.largest_key(), iter.key()); assert_eq!(info.largest_key(), iter.key());
assert_eq!(info.sequence_number(), 0); assert_eq!(info.sequence_number(), 0);
assert!(info.file_size() > 0); assert!(info.file_size() > 0);
...@@ -520,7 +520,7 @@ fn test_read_sst() { ...@@ -520,7 +520,7 @@ fn test_read_sst() {
assert_eq!(props.num_entries(), 3); assert_eq!(props.num_entries(), 3);
}); });
let mut it = reader.iter(); let mut it = reader.iter();
it.seek(SeekKey::Start); it.seek(SeekKey::Start).unwrap();
assert_eq!( assert_eq!(
it.collect::<Vec<_>>(), it.collect::<Vec<_>>(),
vec![ vec![
......
...@@ -46,20 +46,25 @@ impl SliceTransform for FixedSuffixTransform { ...@@ -46,20 +46,25 @@ impl SliceTransform for FixedSuffixTransform {
} }
} }
#[allow(deprecated)]
fn prev_collect<D: Deref<Target = DB>>(iter: &mut DBIterator<D>) -> Vec<Kv> { fn prev_collect<D: Deref<Target = DB>>(iter: &mut DBIterator<D>) -> Vec<Kv> {
let mut buf = vec![]; let mut buf = vec![];
while iter.valid() { while iter.valid().unwrap() {
buf.push(iter.kv().unwrap()); let k = iter.key().to_vec();
iter.prev(); let v = iter.value().to_vec();
buf.push((k, v));
let _ = iter.prev();
} }
buf buf
} }
fn next_collect<D: Deref<Target = DB>>(iter: &mut DBIterator<D>) -> Vec<Kv> { fn next_collect<D: Deref<Target = DB>>(iter: &mut DBIterator<D>) -> Vec<(Vec<u8>, Vec<u8>)> {
let mut buf = vec![]; let mut buf = vec![];
while iter.valid() { while iter.valid().unwrap() {
buf.push(iter.kv().unwrap()); let k = iter.key().to_vec();
iter.next(); let v = iter.value().to_vec();
buf.push((k, v));
let _ = iter.next();
} }
buf buf
} }
...@@ -91,33 +96,33 @@ pub fn test_iterator() { ...@@ -91,33 +96,33 @@ pub fn test_iterator() {
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
// Test that it's idempotent // Test that it's idempotent
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
// Test it in reverse a few times // Test it in reverse a few times
iter.seek(SeekKey::End); iter.seek(SeekKey::End).unwrap();
let mut tmp_vec = prev_collect(&mut iter); let mut tmp_vec = prev_collect(&mut iter);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
iter.seek(SeekKey::End); iter.seek(SeekKey::End).unwrap();
let mut tmp_vec = prev_collect(&mut iter); let mut tmp_vec = prev_collect(&mut iter);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
// Try it forward again // Try it forward again
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let mut old_iterator = db.iter(); let mut old_iterator = db.iter();
old_iterator.seek(SeekKey::Start); old_iterator.seek(SeekKey::Start).unwrap();
let p = db.put(&*k4, &*v4); let p = db.put(&*k4, &*v4);
assert!(p.is_ok()); assert!(p.is_ok());
let expected2 = vec![ let expected2 = vec![
...@@ -129,10 +134,10 @@ pub fn test_iterator() { ...@@ -129,10 +134,10 @@ pub fn test_iterator() {
assert_eq!(old_iterator.collect::<Vec<_>>(), expected); assert_eq!(old_iterator.collect::<Vec<_>>(), expected);
iter = db.iter(); iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.collect::<Vec<_>>(), expected2); assert_eq!(iter.collect::<Vec<_>>(), expected2);
iter.seek(SeekKey::Key(k2)); iter.seek(SeekKey::Key(k2)).unwrap();
let expected = vec![ let expected = vec![
(k2.to_vec(), v2.to_vec()), (k2.to_vec(), v2.to_vec()),
(k3.to_vec(), v3.to_vec()), (k3.to_vec(), v3.to_vec()),
...@@ -140,35 +145,23 @@ pub fn test_iterator() { ...@@ -140,35 +145,23 @@ pub fn test_iterator() {
]; ];
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
iter.seek(SeekKey::Key(k2)); iter.seek(SeekKey::Key(k2)).unwrap();
let expected = vec![(k2.to_vec(), v2.to_vec()), (k1.to_vec(), v1.to_vec())]; let expected = vec![(k2.to_vec(), v2.to_vec()), (k1.to_vec(), v1.to_vec())];
assert_eq!(prev_collect(&mut iter), expected); assert_eq!(prev_collect(&mut iter), expected);
iter.seek(SeekKey::Key(b"k0")); assert!(iter.seek(SeekKey::Key(b"k0")).unwrap());
assert!(iter.valid()); assert!(iter.seek(SeekKey::Key(b"k1")).unwrap());
iter.seek(SeekKey::Key(b"k1")); assert!(iter.seek(SeekKey::Key(b"k11")).unwrap());
assert!(iter.valid()); assert!(!iter.seek(SeekKey::Key(b"k5")).unwrap());
iter.seek(SeekKey::Key(b"k11")); assert!(iter.seek(SeekKey::Key(b"k0")).unwrap());
assert!(iter.valid()); assert!(iter.seek(SeekKey::Key(b"k1")).unwrap());
iter.seek(SeekKey::Key(b"k5")); assert!(iter.seek(SeekKey::Key(b"k11")).unwrap());
assert!(!iter.valid()); assert!(!iter.seek(SeekKey::Key(b"k5")).unwrap());
iter.seek(SeekKey::Key(b"k0"));
assert!(iter.valid()); assert!(iter.seek(SeekKey::Key(b"k4")).unwrap());
iter.seek(SeekKey::Key(b"k1")); assert!(iter.prev().unwrap());
assert!(iter.valid()); assert!(iter.next().unwrap());
iter.seek(SeekKey::Key(b"k11")); assert!(!iter.next().unwrap());
assert!(iter.valid());
iter.seek(SeekKey::Key(b"k5"));
assert!(!iter.valid());
iter.seek(SeekKey::Key(b"k4"));
assert!(iter.valid());
iter.prev();
assert!(iter.valid());
iter.next();
assert!(iter.valid());
iter.next();
assert!(!iter.valid());
// Once iterator is invalid, it can't be reverted. // Once iterator is invalid, it can't be reverted.
//iter.prev(); //iter.prev();
//assert!(!iter.valid()); //assert!(!iter.valid());
...@@ -188,7 +181,7 @@ fn test_send_iterator() { ...@@ -188,7 +181,7 @@ fn test_send_iterator() {
let (tx, rx) = mpsc::channel(); let (tx, rx) = mpsc::channel();
let j = thread::spawn(move || { let j = thread::spawn(move || {
rx.recv().unwrap(); rx.recv().unwrap();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert_eq!(iter.key(), b"k1"); assert_eq!(iter.key(), b"k1");
assert_eq!(iter.value(), b"v1"); assert_eq!(iter.value(), b"v1");
}); });
...@@ -230,36 +223,36 @@ fn test_seek_for_prev() { ...@@ -230,36 +223,36 @@ fn test_seek_for_prev() {
db.put_opt(b"k1-3", b"d", &writeopts).unwrap(); db.put_opt(b"k1-3", b"d", &writeopts).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::Key(b"k1-2")); iter.seek_for_prev(SeekKey::Key(b"k1-2")).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1-1"); assert_eq!(iter.key(), b"k1-1");
assert_eq!(iter.value(), b"b"); assert_eq!(iter.value(), b"b");
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::Key(b"k1-3")); iter.seek_for_prev(SeekKey::Key(b"k1-3")).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1-3"); assert_eq!(iter.key(), b"k1-3");
assert_eq!(iter.value(), b"d"); assert_eq!(iter.value(), b"d");
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::Start); iter.seek_for_prev(SeekKey::Start).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1-0"); assert_eq!(iter.key(), b"k1-0");
assert_eq!(iter.value(), b"a"); assert_eq!(iter.value(), b"a");
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::End); iter.seek_for_prev(SeekKey::End).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1-3"); assert_eq!(iter.key(), b"k1-3");
assert_eq!(iter.value(), b"d"); assert_eq!(iter.value(), b"d");
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::Key(b"k0-0")); iter.seek_for_prev(SeekKey::Key(b"k0-0")).unwrap();
assert!(!iter.valid()); assert!(!iter.valid().unwrap());
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek_for_prev(SeekKey::Key(b"k2-0")); iter.seek_for_prev(SeekKey::Key(b"k2-0")).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1-3"); assert_eq!(iter.key(), b"k1-3");
assert_eq!(iter.value(), b"d"); assert_eq!(iter.value(), b"d");
} }
...@@ -282,7 +275,7 @@ fn read_with_upper_bound() { ...@@ -282,7 +275,7 @@ fn read_with_upper_bound() {
readopts.set_iterate_upper_bound(upper_bound); readopts.set_iterate_upper_bound(upper_bound);
assert_eq!(readopts.iterate_upper_bound(), b"k2"); assert_eq!(readopts.iterate_upper_bound(), b"k2");
let mut iter = db.iter_opt(readopts); let mut iter = db.iter_opt(readopts);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
let vec = next_collect(&mut iter); let vec = next_collect(&mut iter);
assert_eq!(vec.len(), 2); assert_eq!(vec.len(), 2);
} }
...@@ -340,12 +333,12 @@ fn test_total_order_seek() { ...@@ -340,12 +333,12 @@ fn test_total_order_seek() {
let mut iter = db.iter_opt(ropts); let mut iter = db.iter_opt(ropts);
// only iterate sst files and memtables that contain keys with the same prefix as b"k1" // only iterate sst files and memtables that contain keys with the same prefix as b"k1"
// and the keys is iterated as valid when prefixed as b"k1" // and the keys is iterated as valid when prefixed as b"k1"
iter.seek(SeekKey::Key(b"k1-0")); iter.seek(SeekKey::Key(b"k1-0")).unwrap();
let mut key_count = 0; let mut key_count = 0;
while iter.valid() { while iter.valid().unwrap() {
assert_eq!(keys[key_count], iter.key()); assert_eq!(keys[key_count], iter.key());
key_count = key_count + 1; key_count = key_count + 1;
iter.next(); iter.next().unwrap();
} }
assert!(key_count == 3); assert!(key_count == 3);
...@@ -353,25 +346,25 @@ fn test_total_order_seek() { ...@@ -353,25 +346,25 @@ fn test_total_order_seek() {
// only iterate sst files and memtables that contain keys with the same prefix as b"k1" // only iterate sst files and memtables that contain keys with the same prefix as b"k1"
// but it still can next/prev to the keys which is not prefixed as b"k1" with // but it still can next/prev to the keys which is not prefixed as b"k1" with
// prefix_same_as_start // prefix_same_as_start
iter.seek(SeekKey::Key(b"k1-0")); iter.seek(SeekKey::Key(b"k1-0")).unwrap();
let mut key_count = 0; let mut key_count = 0;
while iter.valid() { while iter.valid().unwrap() {
assert_eq!(keys[key_count], iter.key()); assert_eq!(keys[key_count], iter.key());
key_count = key_count + 1; key_count = key_count + 1;
iter.next(); iter.next().unwrap();
} }
assert!(key_count == 4); assert!(key_count == 4);
let mut ropts = ReadOptions::new(); let mut ropts = ReadOptions::new();
ropts.set_total_order_seek(true); ropts.set_total_order_seek(true);
let mut iter = db.iter_opt(ropts); let mut iter = db.iter_opt(ropts);
iter.seek(SeekKey::Key(b"k1-0")); iter.seek(SeekKey::Key(b"k1-0")).unwrap();
let mut key_count = 0; let mut key_count = 0;
while iter.valid() { while iter.valid().unwrap() {
// iterator all sst files and memtables // iterator all sst files and memtables
assert_eq!(keys[key_count], iter.key()); assert_eq!(keys[key_count], iter.key());
key_count = key_count + 1; key_count = key_count + 1;
iter.next(); iter.next().unwrap();
} }
assert!(key_count == 9); assert!(key_count == 9);
} }
...@@ -405,12 +398,12 @@ fn test_fixed_suffix_seek() { ...@@ -405,12 +398,12 @@ fn test_fixed_suffix_seek() {
db.flush(true).unwrap(); db.flush(true).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Key(b"k-24yfae-8")); iter.seek(SeekKey::Key(b"k-24yfae-8")).unwrap();
let vec = prev_collect(&mut iter); let vec = prev_collect(&mut iter);
assert!(vec.len() == 2); assert!(vec.len() == 2);
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Key(b"k-24yfa-9")); iter.seek(SeekKey::Key(b"k-24yfa-9")).unwrap();
let vec = prev_collect(&mut iter); let vec = prev_collect(&mut iter);
assert!(vec.len() == 0); assert!(vec.len() == 0);
} }
...@@ -86,13 +86,13 @@ fn test_prefix_extractor_compatibility() { ...@@ -86,13 +86,13 @@ fn test_prefix_extractor_compatibility() {
db.put_opt(b"k1-8", b"c", &wopts).unwrap(); db.put_opt(b"k1-8", b"c", &wopts).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Key(b"k1-0")); iter.seek(SeekKey::Key(b"k1-0")).unwrap();
let mut key_count = 0; let mut key_count = 0;
while iter.valid() { while iter.valid().unwrap() {
// If sst file has no prefix bloom, don't use prefix seek model. // If sst file has no prefix bloom, don't use prefix seek model.
assert_eq!(keys[key_count], iter.key()); assert_eq!(keys[key_count], iter.key());
key_count = key_count + 1; key_count = key_count + 1;
iter.next(); iter.next().unwrap();
} }
assert!(key_count == 9); assert!(key_count == 9);
} }
......
...@@ -676,12 +676,12 @@ fn test_read_options() { ...@@ -676,12 +676,12 @@ fn test_read_options() {
let keys = vec![b"k1", b"k2", b"k3"]; let keys = vec![b"k1", b"k2", b"k3"];
let mut iter = db.iter_opt(read_opts); let mut iter = db.iter_opt(read_opts);
iter.seek(SeekKey::Key(b"k1")); iter.seek(SeekKey::Key(b"k1")).unwrap();
let mut key_count = 0; let mut key_count = 0;
while iter.valid() { while iter.valid().unwrap() {
assert_eq!(keys[key_count], iter.key()); assert_eq!(keys[key_count], iter.key());
key_count = key_count + 1; key_count = key_count + 1;
iter.next(); iter.next().unwrap();
} }
assert!(key_count == 3); assert!(key_count == 3);
} }
...@@ -699,11 +699,11 @@ fn test_readoptions_lower_bound() { ...@@ -699,11 +699,11 @@ fn test_readoptions_lower_bound() {
let lower_bound = b"k2".to_vec(); let lower_bound = b"k2".to_vec();
read_opts.set_iterate_lower_bound(lower_bound); read_opts.set_iterate_lower_bound(lower_bound);
let mut iter = db.iter_opt(read_opts); let mut iter = db.iter_opt(read_opts);
iter.seek(SeekKey::Key(b"k3")); iter.seek(SeekKey::Key(b"k3")).unwrap();
let mut count = 0; let mut count = 0;
while iter.valid() { while iter.valid().unwrap() {
count += 1; count += 1;
iter.prev(); iter.prev().unwrap();
} }
assert_eq!(count, 2); assert_eq!(count, 2);
} }
...@@ -781,15 +781,15 @@ fn test_vector_memtable_factory_options() { ...@@ -781,15 +781,15 @@ fn test_vector_memtable_factory_options() {
db.flush(true).unwrap(); db.flush(true).unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), b"k1"); assert_eq!(iter.key(), b"k1");
assert_eq!(iter.value(), b"v1"); assert_eq!(iter.value(), b"v1");
assert!(iter.next()); assert!(iter.next().unwrap());
assert_eq!(iter.key(), b"k2"); assert_eq!(iter.key(), b"k2");
assert_eq!(iter.value(), b"v2"); assert_eq!(iter.value(), b"v2");
assert!(!iter.next()); assert!(!iter.next().unwrap());
assert!(!iter.valid()); assert!(!iter.valid().unwrap());
} }
#[test] #[test]
......
...@@ -77,8 +77,8 @@ fn test_slice_transform() { ...@@ -77,8 +77,8 @@ fn test_slice_transform() {
]; ];
for key in invalid_seeks { for key in invalid_seeks {
it.seek(SeekKey::Key(&key)); it.seek(SeekKey::Key(&key)).unwrap();
assert!(!it.valid()); assert!(!it.valid().unwrap());
} }
let valid_seeks = vec![ let valid_seeks = vec![
...@@ -88,8 +88,8 @@ fn test_slice_transform() { ...@@ -88,8 +88,8 @@ fn test_slice_transform() {
]; ];
for (key, expect_key) in valid_seeks { for (key, expect_key) in valid_seeks {
it.seek(SeekKey::Key(&key)); it.seek(SeekKey::Key(&key)).unwrap();
assert!(it.valid()); assert!(it.valid().unwrap());
assert_eq!(it.key(), &*expect_key); assert_eq!(it.key(), &*expect_key);
} }
......
...@@ -282,7 +282,7 @@ fn test_table_properties_with_table_filter() { ...@@ -282,7 +282,7 @@ fn test_table_properties_with_table_filter() {
let mut iter = db.iter_opt(ropts); let mut iter = db.iter_opt(ropts);
let key = b"key"; let key = b"key";
let key5 = b"key5"; let key5 = b"key5";
assert!(iter.seek(SeekKey::from(key.as_ref()))); assert!(iter.seek(SeekKey::from(key.as_ref())).unwrap());
// First sst will be skipped // First sst will be skipped
assert_eq!(iter.key(), key5.as_ref()); assert_eq!(iter.key(), key5.as_ref());
} }
...@@ -145,31 +145,31 @@ fn test_titandb() { ...@@ -145,31 +145,31 @@ fn test_titandb() {
assert_eq!(db.get_options_cf(cf1).get_num_levels(), 4); assert_eq!(db.get_options_cf(cf1).get_num_levels(), 4);
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for i in 0..n { for i in 0..n {
for j in 0..n { for j in 0..n {
let k = (i * n + j) as u8; let k = (i * n + j) as u8;
let v = vec![k; (j + 1) as usize]; let v = vec![k; (j + 1) as usize];
assert_eq!(db.get(&[k]).unwrap().unwrap(), &v); assert_eq!(db.get(&[k]).unwrap().unwrap(), &v);
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), &[k]); assert_eq!(iter.key(), &[k]);
assert_eq!(iter.value(), v.as_slice()); assert_eq!(iter.value(), v.as_slice());
iter.next(); iter.next().unwrap();
} }
} }
let mut readopts = ReadOptions::new(); let mut readopts = ReadOptions::new();
readopts.set_titan_key_only(true); readopts.set_titan_key_only(true);
iter = db.iter_opt(readopts); iter = db.iter_opt(readopts);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for i in 0..n { for i in 0..n {
for j in 0..n { for j in 0..n {
let k = (i * n + j) as u8; let k = (i * n + j) as u8;
let v = vec![k; (j + 1) as usize]; let v = vec![k; (j + 1) as usize];
assert_eq!(db.get(&[k]).unwrap().unwrap(), &v); assert_eq!(db.get(&[k]).unwrap().unwrap(), &v);
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), &[k]); assert_eq!(iter.key(), &[k]);
iter.next(); iter.next().unwrap();
} }
} }
...@@ -177,15 +177,15 @@ fn test_titandb() { ...@@ -177,15 +177,15 @@ fn test_titandb() {
readopts = ReadOptions::new(); readopts = ReadOptions::new();
readopts.set_titan_key_only(true); readopts.set_titan_key_only(true);
iter = db.iter_cf_opt(&cf_handle, readopts); iter = db.iter_cf_opt(&cf_handle, readopts);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for i in 0..n { for i in 0..n {
for j in 0..n { for j in 0..n {
let k = (i * n + j) as u8; let k = (i * n + j) as u8;
let v = vec![k; (j + 1) as usize]; let v = vec![k; (j + 1) as usize];
assert_eq!(db.get(&[k]).unwrap().unwrap(), &v); assert_eq!(db.get(&[k]).unwrap().unwrap(), &v);
assert!(iter.valid()); assert!(iter.valid().unwrap());
assert_eq!(iter.key(), &[k]); assert_eq!(iter.key(), &[k]);
iter.next(); iter.next().unwrap();
} }
} }
...@@ -267,20 +267,20 @@ fn test_titan_delete_files_in_ranges() { ...@@ -267,20 +267,20 @@ fn test_titan_delete_files_in_ranges() {
let mut readopts = ReadOptions::new(); let mut readopts = ReadOptions::new();
readopts.set_titan_key_only(true); readopts.set_titan_key_only(true);
let mut iter = db.iter_cf_opt(&cf_handle, readopts); let mut iter = db.iter_cf_opt(&cf_handle, readopts);
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
for i in 6..9 { for i in 6..9 {
assert!(iter.valid()); assert!(iter.valid().unwrap());
let k = format!("key{}", i); let k = format!("key{}", i);
assert_eq!(iter.key(), k.as_bytes()); assert_eq!(iter.key(), k.as_bytes());
iter.next(); iter.next().unwrap();
} }
assert!(!iter.valid()); assert!(!iter.valid().unwrap());
// Delete the last file. // Delete the last file.
let ranges = vec![Range::new(b"key6", b"key8")]; let ranges = vec![Range::new(b"key6", b"key8")];
db.delete_files_in_ranges_cf(cf_handle, &ranges, true) db.delete_files_in_ranges_cf(cf_handle, &ranges, true)
.unwrap(); .unwrap();
let mut iter = db.iter(); let mut iter = db.iter();
iter.seek(SeekKey::Start); iter.seek(SeekKey::Start).unwrap();
assert!(!iter.valid()); assert!(!iter.valid().unwrap());
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment