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
a4419e76
Unverified
Commit
a4419e76
authored
May 08, 2020
by
Connor
Committed by
GitHub
May 08, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add titan stats enum (#414)
* add titan customized stats Signed-off-by:
Connor
<
zbk602423539@gmail.com
>
parent
ea1f2bb2
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
156 additions
and
33 deletions
+156
-33
c.cc
librocksdb_sys/crocksdb/c.cc
+13
-13
c.h
librocksdb_sys/crocksdb/crocksdb/c.h
+5
-3
generated.rs
librocksdb_sys/src/generated.rs
+41
-1
lib.rs
librocksdb_sys/src/lib.rs
+5
-3
rocksdb.rs
src/rocksdb.rs
+21
-7
rocksdb_options.rs
src/rocksdb_options.rs
+7
-3
test_titan.rs
tests/cases/test_titan.rs
+64
-3
No files found.
librocksdb_sys/crocksdb/c.cc
View file @
a4419e76
...
...
@@ -5530,20 +5530,14 @@ struct ctitandb_options_t {
TitanOptions
rep
;
};
// TODO: Simplify the API by merging db_options into tdb_options, and
// column_family_options into titan_column_family_options, since the later
// of the pairs already contain the former.
crocksdb_t
*
ctitandb_open_column_families
(
const
char
*
name
,
const
crocksdb_options_t
*
db_options
,
const
char
*
name
,
const
ctitandb_options_t
*
tdb_options
,
int
num_column_families
,
const
char
**
column_family_names
,
const
crocksdb_options_t
**
column_family_options
,
const
ctitandb_options_t
**
titan_column_family_options
,
crocksdb_column_family_handle_t
**
column_family_handles
,
char
**
errptr
)
{
std
::
vector
<
TitanCFDescriptor
>
column_families
;
for
(
int
i
=
0
;
i
<
num_column_families
;
i
++
)
{
*
((
ColumnFamilyOptions
*
)(
&
titan_column_family_options
[
i
]
->
rep
))
=
column_family_options
[
i
]
->
rep
;
column_families
.
push_back
(
TitanCFDescriptor
(
std
::
string
(
column_family_names
[
i
]),
TitanCFOptions
(
titan_column_family_options
[
i
]
->
rep
)));
...
...
@@ -5551,12 +5545,10 @@ crocksdb_t* ctitandb_open_column_families(
TitanDB
*
db
;
std
::
vector
<
ColumnFamilyHandle
*>
handles
;
*
(
DBOptions
*
)
&
tdb_options
->
rep
=
db_options
->
rep
;
if
(
SaveError
(
errptr
,
TitanDB
::
Open
(
tdb_options
->
rep
,
std
::
string
(
name
),
column_families
,
&
handles
,
&
db
)))
{
return
nullptr
;
}
for
(
size_t
i
=
0
;
i
<
handles
.
size
();
i
++
)
{
crocksdb_column_family_handle_t
*
c_handle
=
new
crocksdb_column_family_handle_t
;
...
...
@@ -5574,15 +5566,11 @@ crocksdb_t* ctitandb_open_column_families(
// use ctitandb_t for titan specific functions.
crocksdb_column_family_handle_t
*
ctitandb_create_column_family
(
crocksdb_t
*
db
,
const
crocksdb_options_t
*
column_family_options
,
const
ctitandb_options_t
*
titan_column_family_options
,
const
char
*
column_family_name
,
char
**
errptr
)
{
// Blindly cast db into TitanDB.
TitanDB
*
titan_db
=
reinterpret_cast
<
TitanDB
*>
(
db
->
rep
);
// Copy the ColumnFamilyOptions part of `column_family_options` into `titan_column_family_options`
*
((
ColumnFamilyOptions
*
)(
&
titan_column_family_options
->
rep
))
=
column_family_options
->
rep
;
crocksdb_column_family_handle_t
*
handle
=
new
crocksdb_column_family_handle_t
;
SaveError
(
errptr
,
titan_db
->
CreateColumnFamily
(
...
...
@@ -5605,6 +5593,11 @@ ctitandb_options_t* ctitandb_options_copy(ctitandb_options_t* src) {
return
new
ctitandb_options_t
{
src
->
rep
};
}
void
ctitandb_options_set_rocksdb_options
(
ctitandb_options_t
*
opts
,
const
crocksdb_options_t
*
rocksdb_opts
)
{
*
(
DBOptions
*
)
&
opts
->
rep
=
rocksdb_opts
->
rep
;
*
(
ColumnFamilyOptions
*
)
&
opts
->
rep
=
rocksdb_opts
->
rep
;
}
ctitandb_options_t
*
ctitandb_get_titan_options_cf
(
const
crocksdb_t
*
db
,
crocksdb_column_family_handle_t
*
column_family
)
{
...
...
@@ -5614,6 +5607,13 @@ ctitandb_options_t* ctitandb_get_titan_options_cf(
return
options
;
}
ctitandb_options_t
*
ctitandb_get_titan_db_options
(
crocksdb_t
*
db
)
{
ctitandb_options_t
*
options
=
new
ctitandb_options_t
;
TitanDB
*
titan_db
=
reinterpret_cast
<
TitanDB
*>
(
db
->
rep
);
*
static_cast
<
TitanDBOptions
*>
(
&
options
->
rep
)
=
titan_db
->
GetTitanDBOptions
();
return
options
;
}
const
char
*
ctitandb_options_dirname
(
ctitandb_options_t
*
opts
)
{
return
opts
->
rep
.
dirname
.
c_str
();
}
...
...
librocksdb_sys/crocksdb/crocksdb/c.h
View file @
a4419e76
...
...
@@ -2164,17 +2164,15 @@ typedef struct ctitandb_readoptions_t ctitandb_readoptions_t;
typedef
struct
ctitandb_blob_index_t
ctitandb_blob_index_t
;
extern
C_ROCKSDB_LIBRARY_API
crocksdb_t
*
ctitandb_open_column_families
(
const
char
*
name
,
const
crocksdb_options_t
*
options
,
const
char
*
name
,
const
ctitandb_options_t
*
tdb_options
,
int
num_column_families
,
const
char
**
column_family_names
,
const
crocksdb_options_t
**
column_family_options
,
const
ctitandb_options_t
**
titan_column_family_options
,
crocksdb_column_family_handle_t
**
column_family_handles
,
char
**
errptr
);
extern
C_ROCKSDB_LIBRARY_API
crocksdb_column_family_handle_t
*
ctitandb_create_column_family
(
crocksdb_t
*
db
,
const
crocksdb_options_t
*
column_family_options
,
const
ctitandb_options_t
*
titan_column_family_options
,
const
char
*
column_family_name
,
char
**
errptr
);
...
...
@@ -2188,9 +2186,13 @@ extern C_ROCKSDB_LIBRARY_API void ctitandb_options_destroy(ctitandb_options_t*);
extern
C_ROCKSDB_LIBRARY_API
ctitandb_options_t
*
ctitandb_options_copy
(
ctitandb_options_t
*
);
extern
C_ROCKSDB_LIBRARY_API
void
ctitandb_options_set_rocksdb_options
(
ctitandb_options_t
*
opts
,
const
crocksdb_options_t
*
rocksdb_opts
);
extern
C_ROCKSDB_LIBRARY_API
ctitandb_options_t
*
ctitandb_get_titan_options_cf
(
const
crocksdb_t
*
db
,
crocksdb_column_family_handle_t
*
column_family
);
extern
C_ROCKSDB_LIBRARY_API
ctitandb_options_t
*
ctitandb_get_titan_db_options
(
crocksdb_t
*
db
);
extern
C_ROCKSDB_LIBRARY_API
const
char
*
ctitandb_options_dirname
(
ctitandb_options_t
*
);
...
...
librocksdb_sys/src/generated.rs
View file @
a4419e76
...
...
@@ -149,6 +149,33 @@ pub enum DBStatisticsTickerType {
BlockCacheCompressionDictAdd
=
142
,
BlockCacheCompressionDictBytesInsert
=
143
,
BlockCacheCompressionDictBytesEvict
=
144
,
TitanNumGet
=
145
,
TitanNumSeek
,
TitanNumNext
,
TitanNumPrev
,
TitanBlobFileNumKeysWritten
,
TitanBlobFileNumKeysRead
,
TitanBlobFileBytesWritten
,
TitanBlobFileBytesRead
,
TitanBlobFileSynced
,
TitanGcNumFiles
,
TitanGcNumNewFiles
,
TitanGcNumKeysOverwritten
,
TitanGcNumKeysRelocated
,
TitanGcBytesOverwritten
,
TitanGcBytesRelocated
,
TitanGcBytesWritten
,
TitanGcBytesRead
,
TitanBlobCacheHit
,
TitanBlobCacheMiss
,
TitanGcNoNeed
,
TitanGcRemain
,
TitanGcDiscardable
,
TitanGcSample
,
TitanGcSmallFile
,
TitanGcFailure
,
TitanGcSuccess
,
TitanGcTriggerNext
,
}
#[derive(Copy,
Clone,
Debug,
Eq,
PartialEq)]
#[repr(C)]
...
...
@@ -202,5 +229,18 @@ pub enum DBStatisticsHistogramType {
FlushTime
=
46
,
SstBatchSize
=
47
,
DbWriteWalTime
=
48
,
HistogramEnumMax
=
49
,
TitanKeySize
=
49
,
TitanValueSize
,
TitanGetMicros
,
TitanSeekMicros
,
TitanNextMicros
,
TitanPrevMicros
,
TitanBlobFileWriteMicros
,
TitanBlobFileReadMicros
,
TitanBlobFileSyncMicros
,
TitanManifestFileSyncMicros
,
TitanGcMicros
,
TitanGcInputFileSize
,
TitanGcOutputFileSize
,
TitanIterTouchBlobFileCount
,
}
librocksdb_sys/src/lib.rs
View file @
a4419e76
...
...
@@ -2183,11 +2183,9 @@ extern "C" {
extern
"C"
{
pub
fn
ctitandb_open_column_families
(
path
:
*
const
c_char
,
options
:
*
const
Options
,
titan_options
:
*
const
DBTitanDBOptions
,
num_column_families
:
c_int
,
column_family_names
:
*
const
*
const
c_char
,
column_family_options
:
*
const
*
const
Options
,
titan_column_family_options
:
*
const
*
const
DBTitanDBOptions
,
column_family_handles
:
*
const
*
mut
DBCFHandle
,
err
:
*
mut
*
mut
c_char
,
...
...
@@ -2195,7 +2193,6 @@ extern "C" {
pub
fn
ctitandb_create_column_family
(
db
:
*
mut
DBInstance
,
column_family_options
:
*
const
Options
,
titan_column_family_options
:
*
const
DBTitanDBOptions
,
column_family_name
:
*
const
c_char
,
err
:
*
mut
*
mut
c_char
,
...
...
@@ -2204,10 +2201,15 @@ extern "C" {
pub
fn
ctitandb_options_create
()
->
*
mut
DBTitanDBOptions
;
pub
fn
ctitandb_options_destroy
(
opts
:
*
mut
DBTitanDBOptions
);
pub
fn
ctitandb_options_copy
(
opts
:
*
mut
DBTitanDBOptions
)
->
*
mut
DBTitanDBOptions
;
pub
fn
ctitandb_options_set_rocksdb_options
(
opts
:
*
mut
DBTitanDBOptions
,
rocksdb_opts
:
*
const
Options
,
);
pub
fn
ctitandb_get_titan_options_cf
(
db
:
*
mut
DBInstance
,
cf
:
*
mut
DBCFHandle
,
)
->
*
mut
DBTitanDBOptions
;
pub
fn
ctitandb_get_titan_db_options
(
db
:
*
mut
DBInstance
)
->
*
mut
DBTitanDBOptions
;
pub
fn
ctitandb_options_dirname
(
opts
:
*
mut
DBTitanDBOptions
)
->
*
const
c_char
;
pub
fn
ctitandb_options_set_dirname
(
opts
:
*
mut
DBTitanDBOptions
,
name
:
*
const
c_char
);
pub
fn
ctitandb_options_min_blob_size
(
opts
:
*
mut
DBTitanDBOptions
)
->
u64
;
...
...
src/rocksdb.rs
View file @
a4419e76
...
...
@@ -83,11 +83,15 @@ fn ensure_default_cf_exists<'a>(
fn
split_descriptors
<
'a
>
(
list
:
Vec
<
ColumnFamilyDescriptor
<
'a
>>
,
is_titan
:
bool
,
)
->
(
Vec
<&
'a
str
>
,
Vec
<
ColumnFamilyOptions
>
)
{
let
mut
v1
=
Vec
::
with_capacity
(
list
.len
());
let
mut
v2
=
Vec
::
with_capacity
(
list
.len
());
for
d
in
list
{
for
mut
d
in
list
{
v1
.push
(
d
.name
);
if
is_titan
&&
d
.options.titan_inner
.is_null
()
{
d
.options
.set_titandb_options
(
&
TitanDBOptions
::
new
());
}
v2
.push
(
d
.options
);
}
(
v1
,
v2
)
...
...
@@ -541,7 +545,7 @@ impl DB {
}
fn
open_cf_internal
<
'a
,
T
>
(
opts
:
DBOptions
,
mut
opts
:
DBOptions
,
path
:
&
str
,
cfds
:
Vec
<
T
>
,
ttls
:
&
[
i32
],
...
...
@@ -570,7 +574,7 @@ impl DB {
let
mut
ttls_vec
=
ttls
.to_vec
();
ensure_default_cf_exists
(
&
mut
descs
,
&
mut
ttls_vec
,
!
opts
.titan_inner
.is_null
());
let
(
names
,
options
)
=
split_descriptors
(
descs
);
let
(
names
,
options
)
=
split_descriptors
(
descs
,
!
opts
.titan_inner
.is_null
()
);
let
cstrings
=
build_cstring_list
(
&
names
);
let
cf_names
:
Vec
<*
const
_
>
=
cstrings
.iter
()
.map
(|
cs
|
cs
.as_ptr
())
.collect
();
...
...
@@ -642,11 +646,9 @@ impl DB {
unsafe
{
ffi_try!
(
ctitandb_open_column_families
(
db_path
,
db_options
,
titan_options
,
db_cfs_count
,
db_cf_ptrs
,
db_cf_opts
,
titan_cf_opts
,
db_cf_handles
))
...
...
@@ -677,6 +679,16 @@ impl DB {
return
Err
(
ERR_NULL_DB_ONINIT
.to_owned
());
}
unsafe
{
// the options provided when opening db may sanitized, so get the latest options.
crocksdb_ffi
::
crocksdb_options_destroy
(
opts
.inner
);
opts
.inner
=
crocksdb_ffi
::
crocksdb_get_db_options
(
db
);
if
!
opts
.titan_inner
.is_null
()
{
crocksdb_ffi
::
ctitandb_options_destroy
(
opts
.titan_inner
);
opts
.titan_inner
=
crocksdb_ffi
::
ctitandb_get_titan_db_options
(
db
);
}
}
let
cfs
=
names
.into_iter
()
.zip
(
cf_handles
)
...
...
@@ -847,7 +859,7 @@ impl DB {
where
T
:
Into
<
ColumnFamilyDescriptor
<
'a
>>
,
{
let
cfd
=
cfd
.into
();
let
mut
cfd
=
cfd
.into
();
let
cname
=
match
CString
::
new
(
cfd
.name
.as_bytes
())
{
Ok
(
c
)
=>
c
,
Err
(
_
)
=>
{
...
...
@@ -863,9 +875,11 @@ impl DB {
cname_ptr
))
}
else
{
if
cfd
.options.titan_inner
.is_null
()
{
cfd
.options
.set_titandb_options
(
&
TitanDBOptions
::
new
());
}
ffi_try!
(
ctitandb_create_column_family
(
self
.inner
,
cfd
.options.inner
,
cfd
.options.titan_inner
,
cname_ptr
))
...
...
src/rocksdb_options.rs
View file @
a4419e76
...
...
@@ -696,7 +696,10 @@ impl DBOptions {
}
pub
fn
set_titandb_options
(
&
mut
self
,
opts
:
&
TitanDBOptions
)
{
self
.titan_inner
=
unsafe
{
crocksdb_ffi
::
ctitandb_options_copy
(
opts
.inner
)
}
unsafe
{
self
.titan_inner
=
crocksdb_ffi
::
ctitandb_options_copy
(
opts
.inner
);
crocksdb_ffi
::
ctitandb_options_set_rocksdb_options
(
self
.titan_inner
,
self
.inner
);
}
}
pub
fn
increase_parallelism
(
&
mut
self
,
parallelism
:
i32
)
{
...
...
@@ -1221,8 +1224,9 @@ impl ColumnFamilyOptions {
}
pub
fn
set_titandb_options
(
&
mut
self
,
opts
:
&
TitanDBOptions
)
{
if
!
opts
.inner
.is_null
()
{
self
.titan_inner
=
unsafe
{
crocksdb_ffi
::
ctitandb_options_copy
(
opts
.inner
)
}
unsafe
{
self
.titan_inner
=
crocksdb_ffi
::
ctitandb_options_copy
(
opts
.inner
);
crocksdb_ffi
::
ctitandb_options_set_rocksdb_options
(
self
.titan_inner
,
self
.inner
);
}
}
...
...
tests/cases/test_titan.rs
View file @
a4419e76
...
...
@@ -17,9 +17,10 @@ use std::ops;
use
rand
::
Rng
;
use
rocksdb
::{
CFHandle
,
ColumnFamilyOptions
,
CompactOptions
,
DBBottommostLevelCompaction
,
DBCompressionType
,
DBEntryType
,
DBOptions
,
Range
,
ReadOptions
,
SeekKey
,
TablePropertiesCollector
,
DBEntryType
,
DBOptions
,
DBStatisticsHistogramType
as
HistogramType
,
DBStatisticsTickerType
as
TickerType
,
Range
,
ReadOptions
,
SeekKey
,
TablePropertiesCollector
,
TablePropertiesCollectorFactory
,
TitanBlobIndex
,
TitanDBOptions
,
UserCollectedProperties
,
Writable
,
DB
,
Writable
,
WriteOptions
,
DB
,
};
use
super
::
tempdir_with_prefix
;
...
...
@@ -141,7 +142,6 @@ fn test_titandb() {
let
mut
cf_opts
=
ColumnFamilyOptions
::
new
();
cf_opts
.set_num_levels
(
4
);
cf_opts
.set_titandb_options
(
&
tdb_opts
);
db
.create_cf
((
"cf1"
,
cf_opts
))
.unwrap
();
let
cf1
=
db
.cf_handle
(
"cf1"
)
.unwrap
();
assert_eq!
(
db
.get_options_cf
(
cf1
)
.get_num_levels
(),
4
);
...
...
@@ -373,3 +373,64 @@ fn test_blob_cache_capacity() {
assert_eq!
(
db
.get_options
()
.get_blob_cache_capacity
(),
32
*
1024
*
1024
);
}
#[test]
fn
test_titan_statistics
()
{
let
path
=
tempdir_with_prefix
(
"_rust_rocksdb_statistics"
);
let
mut
tdb_opts
=
TitanDBOptions
::
new
();
tdb_opts
.set_min_blob_size
(
0
);
let
mut
opts
=
DBOptions
::
new
();
opts
.enable_statistics
(
true
);
opts
.create_if_missing
(
true
);
opts
.set_titandb_options
(
&
tdb_opts
);
let
mut
cf_opts
=
ColumnFamilyOptions
::
new
();
cf_opts
.set_titandb_options
(
&
tdb_opts
);
let
db
=
DB
::
open_cf
(
opts
,
path
.path
()
.to_str
()
.unwrap
(),
vec!
[(
"default"
,
cf_opts
)],
)
.unwrap
();
let
wopts
=
WriteOptions
::
new
();
db
.put_opt
(
b
"k0"
,
b
"a"
,
&
wopts
)
.unwrap
();
db
.put_opt
(
b
"k1"
,
b
"b"
,
&
wopts
)
.unwrap
();
db
.put_opt
(
b
"k2"
,
b
"c"
,
&
wopts
)
.unwrap
();
db
.flush
(
true
/* sync */
)
.unwrap
();
// flush memtable to sst file.
assert_eq!
(
db
.get
(
b
"k0"
)
.unwrap
()
.unwrap
(),
b
"a"
);
assert_eq!
(
db
.get
(
b
"k1"
)
.unwrap
()
.unwrap
(),
b
"b"
);
assert_eq!
(
db
.get
(
b
"k2"
)
.unwrap
()
.unwrap
(),
b
"c"
);
assert
!
(
db
.get_statistics_ticker_count
(
TickerType
::
TitanNumGet
)
>
0
);
assert
!
(
db
.get_and_reset_statistics_ticker_count
(
TickerType
::
TitanNumGet
)
>
0
);
assert_eq!
(
db
.get_statistics_ticker_count
(
TickerType
::
TitanNumGet
),
0
);
assert
!
(
db
.get_statistics_histogram_string
(
HistogramType
::
TitanGetMicros
)
.is_some
());
assert
!
(
db
.get_statistics_histogram
(
HistogramType
::
TitanGetMicros
)
.is_some
());
let
get_micros
=
db
.get_statistics_histogram
(
HistogramType
::
TitanGetMicros
)
.unwrap
();
assert
!
(
get_micros
.max
>
0.0
);
db
.reset_statistics
();
let
get_micros
=
db
.get_statistics_histogram
(
HistogramType
::
TitanGetMicros
)
.unwrap
();
assert_eq!
(
db
.get_property_int
(
"rocksdb.titandb.num-discardable-ratio-le0-file"
)
.unwrap
(),
1
);
assert_eq!
(
db
.get_property_int
(
"rocksdb.titandb.num-blob-files-at-level0"
)
.unwrap
(),
1
);
assert_eq!
(
get_micros
.max
,
0.0
);
}
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