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
3bac7489
Commit
3bac7489
authored
Mar 05, 2016
by
Jay Lee
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
use tempdir
parent
51a1588b
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
61 additions
and
92 deletions
+61
-92
Cargo.toml
Cargo.toml
+1
-0
ffi.rs
src/ffi.rs
+5
-2
lib.rs
src/lib.rs
+3
-0
merge_operator.rs
src/merge_operator.rs
+4
-8
rocksdb.rs
src/rocksdb.rs
+15
-31
test.rs
test/test.rs
+1
-0
test_column_family.rs
test/test_column_family.rs
+8
-8
test_iterator.rs
test/test_iterator.rs
+19
-37
test_multithreaded.rs
test/test_multithreaded.rs
+5
-6
No files found.
Cargo.toml
View file @
3bac7489
...
...
@@ -25,3 +25,4 @@ path = "test/test.rs"
[dependencies]
libc
=
"0.1.8"
tempdir
=
"0.3.4"
src/ffi.rs
View file @
3bac7489
...
...
@@ -416,6 +416,7 @@ mod test {
use
super
::
*
;
use
libc
::
*
;
use
std
::
ffi
::
CString
;
use
tempdir
::
TempDir
;
#[test]
fn
internal
()
{
...
...
@@ -427,8 +428,10 @@ mod test {
rocksdb_options_optimize_level_style_compaction
(
opts
,
0
);
rocksdb_options_set_create_if_missing
(
opts
,
true
);
let
rustpath
=
"_rust_rocksdb_internaltest"
;
let
cpath
=
CString
::
new
(
rustpath
)
.unwrap
();
let
rustpath
=
TempDir
::
new
(
"_rust_rocksdb_internaltest"
)
.expect
(
""
);
let
cpath
=
CString
::
new
(
rustpath
.path
()
.to_str
()
.unwrap
())
.unwrap
();
let
cpath_ptr
=
cpath
.as_ptr
();
let
mut
err
:
*
const
i8
=
0
as
*
const
i8
;
...
...
src/lib.rs
View file @
3bac7489
...
...
@@ -14,6 +14,9 @@
//
extern
crate
libc
;
#[cfg(test)]
extern
crate
tempdir
;
pub
mod
rocksdb
;
pub
mod
ffi
;
pub
mod
rocksdb_options
;
...
...
src/merge_operator.rs
View file @
3bac7489
...
...
@@ -156,6 +156,7 @@ mod test {
use
super
::
*
;
use
rocksdb_options
::
Options
;
use
rocksdb
::{
DB
,
DBVector
,
Writable
};
use
tempdir
::
TempDir
;
#[allow(unused_variables)]
#[allow(dead_code)]
...
...
@@ -184,12 +185,11 @@ mod test {
#[allow(dead_code)]
#[test]
fn
mergetest
()
{
let
path
=
"_rust_rocksdb_mergetest"
;
let
path
=
TempDir
::
new
(
"_rust_rocksdb_mergetest"
)
.expect
(
""
)
;
let
mut
opts
=
Options
::
new
();
opts
.create_if_missing
(
true
);
opts
.add_merge_operator
(
"test operator"
,
test_provided_merge
);
{
let
db
=
DB
::
open
(
&
opts
,
path
)
.unwrap
();
let
db
=
DB
::
open
(
&
opts
,
path
.path
()
.to_str
()
.unwrap
())
.unwrap
();
let
p
=
db
.put
(
b
"k1"
,
b
"a"
);
assert
!
(
p
.is_ok
());
let
_
=
db
.merge
(
b
"k1"
,
b
"b"
);
...
...
@@ -202,9 +202,7 @@ mod test {
Ok
(
Some
(
value
))
=>
{
match
value
.to_utf8
()
{
Some
(
v
)
=>
println!
(
"retrieved utf8 value: {}"
,
v
),
None
=>
{
println!
(
"did not read valid utf-8 out of the db"
)
}
None
=>
println!
(
"did not read valid utf-8 out of the db"
),
}
}
Err
(
e
)
=>
println!
(
"error reading value {:?}"
,
e
),
...
...
@@ -217,6 +215,4 @@ mod test {
assert
!
(
db
.delete
(
b
"k1"
)
.is_ok
());
assert
!
(
db
.get
(
b
"k1"
)
.unwrap
()
.is_none
());
}
assert
!
(
DB
::
destroy
(
&
opts
,
path
)
.is_ok
());
}
}
src/rocksdb.rs
View file @
3bac7489
...
...
@@ -868,12 +868,12 @@ mod test {
use
super
::
*
;
use
rocksdb_options
::
*
;
use
std
::
str
;
use
tempdir
::
TempDir
;
#[test]
fn
external
()
{
let
path
=
"_rust_rocksdb_externaltest"
;
{
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
let
path
=
TempDir
::
new
(
"_rust_rocksdb_externaltest"
)
.expect
(
""
);
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
())
.unwrap
();
let
p
=
db
.put
(
b
"k1"
,
b
"v1111"
);
assert
!
(
p
.is_ok
());
let
r
:
Result
<
Option
<
DBVector
>
,
String
>
=
db
.get
(
b
"k1"
);
...
...
@@ -881,34 +881,26 @@ mod test {
assert
!
(
db
.delete
(
b
"k1"
)
.is_ok
());
assert
!
(
db
.get
(
b
"k1"
)
.unwrap
()
.is_none
());
}
let
opts
=
Options
::
new
();
let
result
=
DB
::
destroy
(
&
opts
,
path
);
assert
!
(
result
.is_ok
());
}
#[allow(unused_variables)]
#[test]
fn
errors_do_stuff
()
{
let
path
=
"_rust_rocksdb_error"
;
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
let
path
=
TempDir
::
new
(
"_rust_rocksdb_error"
)
.expect
(
""
);
let
path_str
=
path
.path
()
.to_str
()
.unwrap
();
let
db
=
DB
::
open_default
(
path_str
)
.unwrap
();
let
opts
=
Options
::
new
();
// The DB will still be open when we try to destroy and the lock should fail
match
DB
::
destroy
(
&
opts
,
path
)
{
Err
(
ref
s
)
=>
{
assert
!
(
s
==
"IO error: lock _rust_rocksdb_error/LOCK: No locks
\
available"
)
}
match
DB
::
destroy
(
&
opts
,
path_str
)
{
Err
(
ref
s
)
=>
assert
!
(
s
.contains
(
"LOCK: No locks available"
)),
Ok
(
_
)
=>
panic!
(
"should fail"
),
}
}
#[test]
fn
writebatch_works
()
{
let
path
=
"_rust_rocksdb_writebacktest"
;
{
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
{
let
path
=
TempDir
::
new
(
"_rust_rocksdb_writebacktest"
)
.expect
(
""
);
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
())
.unwrap
();
// test put
let
batch
=
WriteBatch
::
new
();
assert
!
(
db
.get
(
b
"k1"
)
.unwrap
()
.is_none
());
...
...
@@ -918,8 +910,7 @@ mod test {
assert
!
(
p
.is_ok
());
let
r
:
Result
<
Option
<
DBVector
>
,
String
>
=
db
.get
(
b
"k1"
);
assert
!
(
r
.unwrap
()
.unwrap
()
.to_utf8
()
.unwrap
()
==
"v1111"
);
}
{
// test delete
let
batch
=
WriteBatch
::
new
();
let
_
=
batch
.delete
(
b
"k1"
);
...
...
@@ -927,16 +918,12 @@ mod test {
assert
!
(
p
.is_ok
());
assert
!
(
db
.get
(
b
"k1"
)
.unwrap
()
.is_none
());
}
}
let
opts
=
Options
::
new
();
assert
!
(
DB
::
destroy
(
&
opts
,
path
)
.is_ok
());
}
#[test]
fn
iterator_test
()
{
let
path
=
"_rust_rocksdb_iteratortest"
;
{
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
let
path
=
TempDir
::
new
(
"_rust_rocksdb_iteratortest"
)
.expect
(
""
)
;
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
()
)
.unwrap
();
let
p
=
db
.put
(
b
"k1"
,
b
"v1111"
);
assert
!
(
p
.is_ok
());
let
p
=
db
.put
(
b
"k2"
,
b
"v2222"
);
...
...
@@ -950,7 +937,4 @@ mod test {
str
::
from_utf8
(
&*
v
)
.unwrap
());
}
}
let
opts
=
Options
::
new
();
assert
!
(
DB
::
destroy
(
&
opts
,
path
)
.is_ok
());
}
}
test/test.rs
View file @
3bac7489
extern
crate
rocksdb
;
extern
crate
tempdir
;
mod
test_iterator
;
mod
test_multithreaded
;
...
...
test/test_column_family.rs
View file @
3bac7489
...
...
@@ -13,17 +13,19 @@
// limitations under the License.
//
use
rocksdb
::{
DB
,
MergeOperands
,
Options
,
Writable
};
use
tempdir
::
TempDir
;
#[test]
pub
fn
test_column_family
()
{
let
path
=
"_rust_rocksdb_cftest"
;
let
path
=
TempDir
::
new
(
"_rust_rocksdb_cftest"
)
.expect
(
""
);
let
path_str
=
path
.path
()
.to_str
()
.unwrap
();
// should be able to create column families
{
let
mut
opts
=
Options
::
new
();
opts
.create_if_missing
(
true
);
opts
.add_merge_operator
(
"test operator"
,
test_provided_merge
);
let
mut
db
=
DB
::
open
(
&
opts
,
path
)
.unwrap
();
let
mut
db
=
DB
::
open
(
&
opts
,
path
_str
)
.unwrap
();
let
opts
=
Options
::
new
();
match
db
.create_cf
(
"cf1"
,
&
opts
)
{
Ok
(
_
)
=>
println!
(
"cf1 created successfully"
),
...
...
@@ -37,7 +39,7 @@ pub fn test_column_family() {
{
let
mut
opts
=
Options
::
new
();
opts
.add_merge_operator
(
"test operator"
,
test_provided_merge
);
match
DB
::
open
(
&
opts
,
path
)
{
match
DB
::
open
(
&
opts
,
path
_str
)
{
Ok
(
_
)
=>
{
panic!
(
"should not have opened DB successfully without
\
specifying column
...
...
@@ -54,7 +56,7 @@ pub fn test_column_family() {
{
let
mut
opts
=
Options
::
new
();
opts
.add_merge_operator
(
"test operator"
,
test_provided_merge
);
match
DB
::
open_cf
(
&
opts
,
path
,
&
[
"cf1"
])
{
match
DB
::
open_cf
(
&
opts
,
path
_str
,
&
[
"cf1"
])
{
Ok
(
_
)
=>
println!
(
"successfully opened db with column family"
),
Err
(
e
)
=>
panic!
(
"failed to open db with column family: {}"
,
e
),
}
...
...
@@ -63,7 +65,7 @@ pub fn test_column_family() {
{
let
mut
opts
=
Options
::
new
();
opts
.add_merge_operator
(
"test operator"
,
test_provided_merge
);
let
db
=
match
DB
::
open_cf
(
&
opts
,
path
,
&
[
"cf1"
])
{
let
db
=
match
DB
::
open_cf
(
&
opts
,
path
_str
,
&
[
"cf1"
])
{
Ok
(
db
)
=>
{
println!
(
"successfully opened db with column family"
);
db
...
...
@@ -111,14 +113,12 @@ pub fn test_column_family() {
}
// should b able to drop a cf
{
let
mut
db
=
DB
::
open_cf
(
&
Options
::
new
(),
path
,
&
[
"cf1"
])
.unwrap
();
let
mut
db
=
DB
::
open_cf
(
&
Options
::
new
(),
path
_str
,
&
[
"cf1"
])
.unwrap
();
match
db
.drop_cf
(
"cf1"
)
{
Ok
(
_
)
=>
println!
(
"cf1 successfully dropped."
),
Err
(
e
)
=>
panic!
(
"failed to drop column family: {}"
,
e
),
}
}
assert
!
(
DB
::
destroy
(
&
Options
::
new
(),
path
)
.is_ok
());
}
fn
test_provided_merge
(
_
:
&
[
u8
],
...
...
test/test_iterator.rs
View file @
3bac7489
use
rocksdb
::{
DB
,
Direction
,
IteratorMode
,
Options
,
Writable
};
use
rocksdb
::{
DB
,
Direction
,
IteratorMode
,
Writable
};
use
tempdir
::
TempDir
;
fn
cba
(
input
:
&
Box
<
[
u8
]
>
)
->
Box
<
[
u8
]
>
{
input
.iter
()
.cloned
()
.collect
::
<
Vec
<
_
>>
()
.into_boxed_slice
()
...
...
@@ -6,8 +7,8 @@ fn cba(input: &Box<[u8]>) -> Box<[u8]> {
#[test]
pub
fn
test_iterator
()
{
let
path
=
"_rust_rocksdb_iteratortest"
;
{
let
path
=
TempDir
::
new
(
"_rust_rocksdb_iteratortest"
)
.expect
(
""
)
;
let
k1
:
Box
<
[
u8
]
>
=
b
"k1"
.to_vec
()
.into_boxed_slice
();
let
k2
:
Box
<
[
u8
]
>
=
b
"k2"
.to_vec
()
.into_boxed_slice
();
let
k3
:
Box
<
[
u8
]
>
=
b
"k3"
.to_vec
()
.into_boxed_slice
();
...
...
@@ -16,7 +17,7 @@ pub fn test_iterator() {
let
v2
:
Box
<
[
u8
]
>
=
b
"v2222"
.to_vec
()
.into_boxed_slice
();
let
v3
:
Box
<
[
u8
]
>
=
b
"v3333"
.to_vec
()
.into_boxed_slice
();
let
v4
:
Box
<
[
u8
]
>
=
b
"v4444"
.to_vec
()
.into_boxed_slice
();
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
()
)
.unwrap
();
let
p
=
db
.put
(
&*
k1
,
&*
v1
);
assert
!
(
p
.is_ok
());
let
p
=
db
.put
(
&*
k2
,
&*
v2
);
...
...
@@ -26,63 +27,52 @@ pub fn test_iterator() {
let
expected
=
vec!
[(
cba
(
&
k1
),
cba
(
&
v1
)),
(
cba
(
&
k2
),
cba
(
&
v2
)),
(
cba
(
&
k3
),
cba
(
&
v3
))];
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
// Test that it's idempotent
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
// Test it in reverse a few times
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
iterator1
.collect
::
<
Vec
<
_
>>
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
iterator1
.collect
::
<
Vec
<
_
>>
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
iterator1
.collect
::
<
Vec
<
_
>>
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
iterator1
.collect
::
<
Vec
<
_
>>
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
End
);
let
mut
tmp_vec
=
iterator1
.collect
::
<
Vec
<
_
>>
();
tmp_vec
.reverse
();
assert_eq!
(
tmp_vec
,
expected
);
}
// Try it forward again
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
let
old_iterator
=
db
.iterator
(
IteratorMode
::
Start
);
let
p
=
db
.put
(
&*
k4
,
&*
v4
);
...
...
@@ -91,28 +81,20 @@ pub fn test_iterator() {
(
cba
(
&
k2
),
cba
(
&
v2
)),
(
cba
(
&
k3
),
cba
(
&
v3
)),
(
cba
(
&
k4
),
cba
(
&
v4
))];
{
assert_eq!
(
old_iterator
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
Start
);
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected2
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k2"
,
Direction
::
Forward
));
let
expected
=
vec!
[(
cba
(
&
k2
),
cba
(
&
v2
)),
(
cba
(
&
k3
),
cba
(
&
v3
)),
(
cba
(
&
k4
),
cba
(
&
v4
))];
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
{
let
iterator1
=
db
.iterator
(
IteratorMode
::
From
(
b
"k2"
,
Direction
::
Reverse
));
let
expected
=
vec!
[(
cba
(
&
k2
),
cba
(
&
v2
)),
(
cba
(
&
k1
),
cba
(
&
v1
))];
assert_eq!
(
iterator1
.collect
::
<
Vec
<
_
>>
(),
expected
);
}
}
let
opts
=
Options
::
new
();
assert
!
(
DB
::
destroy
(
&
opts
,
path
)
.is_ok
());
}
test/test_multithreaded.rs
View file @
3bac7489
use
rocksdb
::{
DB
,
Options
,
Writable
};
use
rocksdb
::{
DB
,
Writable
};
use
std
::
thread
;
use
std
::
sync
::
Arc
;
use
tempdir
::
TempDir
;
const
N
:
usize
=
100
_000
;
#[test]
pub
fn
test_multithreaded
()
{
let
path
=
"_rust_rocksdb_multithreadtest"
;
{
let
db
=
DB
::
open_default
(
path
)
.unwrap
();
let
path
=
TempDir
::
new
(
"_rust_rocksdb_multithreadtest"
)
.expect
(
""
)
;
let
db
=
DB
::
open_default
(
path
.path
()
.to_str
()
.unwrap
()
)
.unwrap
();
let
db
=
Arc
::
new
(
db
);
db
.put
(
b
"key"
,
b
"value1"
)
.unwrap
();
...
...
@@ -46,6 +47,4 @@ pub fn test_multithreaded() {
j1
.join
()
.unwrap
();
j2
.join
()
.unwrap
();
j3
.join
()
.unwrap
();
}
assert
!
(
DB
::
destroy
(
&
Options
::
new
(),
path
)
.is_ok
());
}
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