Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
R
rust-rocksdb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fangzongwu
rust-rocksdb
Commits
e26d5bd6
Unverified
Commit
e26d5bd6
authored
Dec 23, 2019
by
qupeng
Committed by
GitHub
Dec 23, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iterator: fix error handling about valid (#411) (#412)
Signed-off-by:
qupeng
<
qupeng@pingcap.com
>
parent
0f27b8a6
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
164 additions
and
156 deletions
+164
-156
lib.rs
src/lib.rs
+4
-1
perf_context.rs
src/perf_context.rs
+5
-7
rocksdb.rs
src/rocksdb.rs
+31
-16
test_delete_files_in_range.rs
tests/cases/test_delete_files_in_range.rs
+15
-16
test_delete_range.rs
tests/cases/test_delete_range.rs
+9
-9
test_ingest_external_file.rs
tests/cases/test_ingest_external_file.rs
+6
-6
test_iterator.rs
tests/cases/test_iterator.rs
+60
-67
test_prefix_extractor.rs
tests/cases/test_prefix_extractor.rs
+3
-3
test_rocksdb_options.rs
tests/cases/test_rocksdb_options.rs
+11
-11
test_slice_transform.rs
tests/cases/test_slice_transform.rs
+4
-4
test_table_properties.rs
tests/cases/test_table_properties.rs
+1
-1
test_titan.rs
tests/cases/test_titan.rs
+15
-15
No files found.
src/lib.rs
View file @
e26d5bd6
...
@@ -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
;
...
...
src/perf_context.rs
View file @
e26d5bd6
...
@@ -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
);
...
...
src/rocksdb.rs
View file @
e26d5bd6
...
@@ -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 {}: {}"
,
...
...
tests/cases/test_delete_files_in_range.rs
View file @
e26d5bd6
...
@@ -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
());
}
}
tests/cases/test_delete_range.rs
View file @
e26d5bd6
...
@@ -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
()
}
}
...
...
tests/cases/test_ingest_external_file.rs
View file @
e26d5bd6
...
@@ -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!
[
...
...
tests/cases/test_iterator.rs
View file @
e26d5bd6
...
@@ -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
);
}
}
tests/cases/test_prefix_extractor.rs
View file @
e26d5bd6
...
@@ -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
);
}
}
...
...
tests/cases/test_rocksdb_options.rs
View file @
e26d5bd6
...
@@ -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]
...
...
tests/cases/test_slice_transform.rs
View file @
e26d5bd6
...
@@ -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
);
}
}
...
...
tests/cases/test_table_properties.rs
View file @
e26d5bd6
...
@@ -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
());
}
}
tests/cases/test_titan.rs
View file @
e26d5bd6
...
@@ -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
()
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment