Commit dab2ef77 authored by follitude's avatar follitude Committed by siddontang

*: format code (#121)

parent 4fd63913
# Complete list of style options can be found at:
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
---
BasedOnStyle: Google
...
...@@ -12,13 +12,8 @@ cache: ...@@ -12,13 +12,8 @@ cache:
os: os:
- linux - linux
# - osx
before_script:
- make -f travis-build/Makefile prepare-rustfmt
script: script:
- cargo fmt -- --write-mode diff || (echo please make format and run tests before creating a pr!; exit 1)
- cargo build --features static-link - cargo build --features static-link
- cargo test --all --features static-link - cargo test --all --features static-link
...@@ -26,4 +21,3 @@ env: ...@@ -26,4 +21,3 @@ env:
global: global:
- RUST_TEST_THREADS=1 - RUST_TEST_THREADS=1
- LD_LIBRARY_PATH: "/usr/local/lib" - LD_LIBRARY_PATH: "/usr/local/lib"
- RUSTFMT_VERSION=v0.6.0
...@@ -8,14 +8,13 @@ machine: ...@@ -8,14 +8,13 @@ machine:
CPPFLAGS: "-I$HOME/.local/include" CPPFLAGS: "-I$HOME/.local/include"
CXXFLAGS: "-I$HOME/.local/include" CXXFLAGS: "-I$HOME/.local/include"
PKG_CONFIG_PATH: "$PKG_CONFIG_PATH:$HOME/.local/lib/pkgconfig" PKG_CONFIG_PATH: "$PKG_CONFIG_PATH:$HOME/.local/lib/pkgconfig"
RUSTC_DATE: "2017-03-28" RUSTC_DATE: "2017-08-09"
LOCAL_PREFIX: "$HOME/.local" LOCAL_PREFIX: "$HOME/.local"
# used by cargo # used by cargo
LIBRARY_PATH: "$LIBRARY_PATH:$HOME/.local/lib" LIBRARY_PATH: "$LIBRARY_PATH:$HOME/.local/lib"
RUST_TEST_THREADS: 1 RUST_TEST_THREADS: 1
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1
RUSTFLAGS: "-Dwarnings" RUSTFLAGS: "-Dwarnings"
RUSTFMT_VERSION: "v0.6.0"
pre: pre:
- | - |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y; sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y;
......
extern crate gcc; extern crate gcc;
use gcc::Build;
use std::{env, fs, str}; use std::{env, fs, str};
use std::path::PathBuf; use std::path::PathBuf;
use std::process::Command; use std::process::Command;
use gcc::Config;
macro_rules! t { macro_rules! t {
($e:expr) => (match $e { ($e:expr) => (match $e {
Ok(n) => n, Ok(n) => n,
...@@ -26,8 +25,8 @@ fn main() { ...@@ -26,8 +25,8 @@ fn main() {
println!("cargo:rustc-link-lib=static=crocksdb"); println!("cargo:rustc-link-lib=static=crocksdb");
} }
fn build_rocksdb() -> Config { fn build_rocksdb() -> Build {
let mut cfg = Config::new(); let mut cfg = Build::new();
if !cfg!(feature = "static-link") { if !cfg!(feature = "static-link") {
if cfg!(target_os = "windows") { if cfg!(target_os = "windows") {
...@@ -89,10 +88,12 @@ fn build_rocksdb() -> Config { ...@@ -89,10 +88,12 @@ fn build_rocksdb() -> Config {
} }
if let Err(e) = fs::rename(src.as_path(), dst.as_path()) { if let Err(e) = fs::rename(src.as_path(), dst.as_path()) {
panic!("failed to move {} to {}: {:?}", panic!(
src.display(), "failed to move {} to {}: {:?}",
dst.display(), src.display(),
e); dst.display(),
e
);
} }
} }
...@@ -124,23 +125,29 @@ fn build_rocksdb() -> Config { ...@@ -124,23 +125,29 @@ fn build_rocksdb() -> Config {
return cfg; return cfg;
} }
let output = let output = Command::new(p.as_path())
Command::new(p.as_path()).args(&["find_library", std_lib_name]).output().unwrap(); .args(&["find_library", std_lib_name])
.output()
.unwrap();
if output.status.success() && !output.stdout.is_empty() { if output.status.success() && !output.stdout.is_empty() {
if let Ok(path_str) = str::from_utf8(&output.stdout) { if let Ok(path_str) = str::from_utf8(&output.stdout) {
let path = PathBuf::from(path_str); let path = PathBuf::from(path_str);
if path.is_absolute() { if path.is_absolute() {
println!("cargo:rustc-link-lib=static=stdc++"); println!("cargo:rustc-link-lib=static=stdc++");
println!("cargo:rustc-link-search=native={}", println!(
path.parent().unwrap().display()); "cargo:rustc-link-search=native={}",
path.parent().unwrap().display()
);
cfg.cpp_link_stdlib(None); cfg.cpp_link_stdlib(None);
return cfg; return cfg;
} }
} }
} }
println!("failed to detect {}: {:?}, fallback to dynamic", println!(
std_lib_name, "failed to detect {}: {:?}, fallback to dynamic",
output); std_lib_name,
output
);
cfg cfg
} }
......
...@@ -628,7 +628,8 @@ crocksdb_compactionjobinfo_table_properties( ...@@ -628,7 +628,8 @@ crocksdb_compactionjobinfo_table_properties(
extern C_ROCKSDB_LIBRARY_API uint64_t extern C_ROCKSDB_LIBRARY_API uint64_t
crocksdb_compactionjobinfo_elapsed_micros(const crocksdb_compactionjobinfo_t*); crocksdb_compactionjobinfo_elapsed_micros(const crocksdb_compactionjobinfo_t*);
extern C_ROCKSDB_LIBRARY_API uint64_t extern C_ROCKSDB_LIBRARY_API uint64_t
crocksdb_compactionjobinfo_num_corrupt_keys(const crocksdb_compactionjobinfo_t*); crocksdb_compactionjobinfo_num_corrupt_keys(
const crocksdb_compactionjobinfo_t*);
/* External file ingestion info */ /* External file ingestion info */
......
This diff is collapsed.
use crocksdb_ffi::{self, DBCompactionFilter}; use crocksdb_ffi::{self, DBCompactionFilter};
use libc::{c_void, c_char, c_int, size_t}; use libc::{c_char, c_int, c_void, size_t};
use std::ffi::CString; use std::ffi::CString;
use std::slice; use std::slice;
...@@ -34,16 +34,17 @@ extern "C" fn destructor(filter: *mut c_void) { ...@@ -34,16 +34,17 @@ extern "C" fn destructor(filter: *mut c_void) {
} }
} }
extern "C" fn filter(filter: *mut c_void, extern "C" fn filter(
level: c_int, filter: *mut c_void,
key: *const u8, level: c_int,
key_len: size_t, key: *const u8,
value: *const u8, key_len: size_t,
value_len: size_t, value: *const u8,
_: *mut *mut u8, value_len: size_t,
_: *mut size_t, _: *mut *mut u8,
value_changed: *mut bool) _: *mut size_t,
-> bool { value_changed: *mut bool,
) -> bool {
unsafe { unsafe {
let filter = &mut *(filter as *mut CompactionFilterProxy); let filter = &mut *(filter as *mut CompactionFilterProxy);
let key = slice::from_raw_parts(key, key_len); let key = slice::from_raw_parts(key, key_len);
...@@ -65,18 +66,21 @@ impl Drop for CompactionFilterHandle { ...@@ -65,18 +66,21 @@ impl Drop for CompactionFilterHandle {
} }
} }
pub unsafe fn new_compaction_filter(c_name: CString, pub unsafe fn new_compaction_filter(
ignore_snapshots: bool, c_name: CString,
f: Box<CompactionFilter>) ignore_snapshots: bool,
-> Result<CompactionFilterHandle, String> { f: Box<CompactionFilter>,
) -> Result<CompactionFilterHandle, String> {
let proxy = Box::into_raw(Box::new(CompactionFilterProxy { let proxy = Box::into_raw(Box::new(CompactionFilterProxy {
name: c_name, name: c_name,
filter: f, filter: f,
})); }));
let filter = crocksdb_ffi::crocksdb_compactionfilter_create(proxy as *mut c_void, let filter = crocksdb_ffi::crocksdb_compactionfilter_create(
destructor, proxy as *mut c_void,
filter, destructor,
name); filter,
name,
);
crocksdb_ffi::crocksdb_compactionfilter_set_ignore_snapshots(filter, ignore_snapshots); crocksdb_ffi::crocksdb_compactionfilter_set_ignore_snapshots(filter, ignore_snapshots);
Ok(CompactionFilterHandle { inner: filter }) Ok(CompactionFilterHandle { inner: filter })
} }
...@@ -36,12 +36,13 @@ pub extern "C" fn name_callback(raw_cb: *mut c_void) -> *const c_char { ...@@ -36,12 +36,13 @@ pub extern "C" fn name_callback(raw_cb: *mut c_void) -> *const c_char {
} }
} }
pub extern "C" fn compare_callback(raw_cb: *mut c_void, pub extern "C" fn compare_callback(
a_raw: *const c_char, raw_cb: *mut c_void,
a_len: size_t, a_raw: *const c_char,
b_raw: *const c_char, a_len: size_t,
b_len: size_t) b_raw: *const c_char,
-> c_int { b_len: size_t,
) -> c_int {
unsafe { unsafe {
let cb: &mut ComparatorCallback = &mut *(raw_cb as *mut ComparatorCallback); let cb: &mut ComparatorCallback = &mut *(raw_cb as *mut ComparatorCallback);
let a: &[u8] = slice::from_raw_parts(a_raw as *const u8, a_len as usize); let a: &[u8] = slice::from_raw_parts(a_raw as *const u8, a_len as usize);
......
...@@ -13,10 +13,10 @@ ...@@ -13,10 +13,10 @@
use {TableProperties, TablePropertiesCollectionView}; use {TableProperties, TablePropertiesCollectionView};
use crocksdb_ffi::{self, DBInstance, DBFlushJobInfo, DBCompactionJobInfo, DBIngestionInfo, use crocksdb_ffi::{self, DBCompactionJobInfo, DBEventListener, DBFlushJobInfo, DBIngestionInfo,
DBEventListener}; DBInstance};
use libc::c_void; use libc::c_void;
use std::{slice, mem, str}; use std::{mem, slice, str};
use std::path::Path; use std::path::Path;
...@@ -98,8 +98,11 @@ impl IngestionInfo { ...@@ -98,8 +98,11 @@ impl IngestionInfo {
} }
pub fn internal_file_path(&self) -> &Path { pub fn internal_file_path(&self) -> &Path {
let p = let p = unsafe {
unsafe { fetch_str!(crocksdb_externalfileingestioninfo_internal_file_path(&self.0)) }; fetch_str!(crocksdb_externalfileingestioninfo_internal_file_path(
&self.0
))
};
Path::new(p) Path::new(p)
} }
...@@ -134,23 +137,29 @@ extern "C" fn destructor(ctx: *mut c_void) { ...@@ -134,23 +137,29 @@ extern "C" fn destructor(ctx: *mut c_void) {
// Maybe we should reuse db instance? // Maybe we should reuse db instance?
// TODO: refactor DB implement so that we can convert DBInstance to DB. // TODO: refactor DB implement so that we can convert DBInstance to DB.
extern "C" fn on_flush_completed(ctx: *mut c_void, extern "C" fn on_flush_completed(
_: *mut DBInstance, ctx: *mut c_void,
info: *const DBFlushJobInfo) { _: *mut DBInstance,
info: *const DBFlushJobInfo,
) {
let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) }; let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) };
ctx.on_flush_completed(info); ctx.on_flush_completed(info);
} }
extern "C" fn on_compaction_completed(ctx: *mut c_void, extern "C" fn on_compaction_completed(
_: *mut DBInstance, ctx: *mut c_void,
info: *const DBCompactionJobInfo) { _: *mut DBInstance,
info: *const DBCompactionJobInfo,
) {
let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) }; let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) };
ctx.on_compaction_completed(info); ctx.on_compaction_completed(info);
} }
extern "C" fn on_external_file_ingested(ctx: *mut c_void, extern "C" fn on_external_file_ingested(
_: *mut DBInstance, ctx: *mut c_void,
info: *const DBIngestionInfo) { _: *mut DBInstance,
info: *const DBIngestionInfo,
) {
let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) }; let (ctx, info) = unsafe { (&*(ctx as *mut Box<EventListener>), mem::transmute(&*info)) };
ctx.on_external_file_ingested(info); ctx.on_external_file_ingested(info);
} }
...@@ -158,10 +167,12 @@ extern "C" fn on_external_file_ingested(ctx: *mut c_void, ...@@ -158,10 +167,12 @@ extern "C" fn on_external_file_ingested(ctx: *mut c_void,
pub fn new_event_listener<L: EventListener>(l: L) -> *mut DBEventListener { pub fn new_event_listener<L: EventListener>(l: L) -> *mut DBEventListener {
let p: Box<EventListener> = Box::new(l); let p: Box<EventListener> = Box::new(l);
unsafe { unsafe {
crocksdb_ffi::crocksdb_eventlistener_create(Box::into_raw(Box::new(p)) as *mut c_void, crocksdb_ffi::crocksdb_eventlistener_create(
destructor, Box::into_raw(Box::new(p)) as *mut c_void,
on_flush_completed, destructor,
on_compaction_completed, on_flush_completed,
on_external_file_ingested) on_compaction_completed,
on_external_file_ingested,
)
} }
} }
...@@ -32,16 +32,16 @@ mod table_properties_collector_factory; ...@@ -32,16 +32,16 @@ mod table_properties_collector_factory;
mod event_listener; mod event_listener;
pub use compaction_filter::CompactionFilter; pub use compaction_filter::CompactionFilter;
pub use event_listener::{EventListener, CompactionJobInfo, IngestionInfo, FlushJobInfo}; pub use event_listener::{CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo};
pub use librocksdb_sys::{DBCompactionStyle, DBCompressionType, DBRecoveryMode, DBInfoLogLevel, pub use librocksdb_sys::{self as crocksdb_ffi, new_bloom_filter, CompactionPriority,
DBStatisticsTickerType, DBStatisticsHistogramType, new_bloom_filter, DBCompactionStyle, DBCompressionType, DBEntryType, DBInfoLogLevel,
CompactionPriority, DBEntryType, self as crocksdb_ffi}; DBRecoveryMode, DBStatisticsHistogramType, DBStatisticsTickerType};
pub use merge_operator::MergeOperands; pub use merge_operator::MergeOperands;
pub use rocksdb::{DB, DBIterator, DBVector, Kv, SeekKey, Writable, WriteBatch, CFHandle, Range, pub use rocksdb::{BackupEngine, CFHandle, DBIterator, DBVector, Kv, Range, SeekKey, SstFileWriter,
BackupEngine, SstFileWriter}; Writable, WriteBatch, DB};
pub use rocksdb_options::{BlockBasedOptions, DBOptions, ColumnFamilyOptions, ReadOptions, pub use rocksdb_options::{BlockBasedOptions, ColumnFamilyOptions, CompactOptions, DBOptions,
WriteOptions, RestoreOptions, IngestExternalFileOptions, EnvOptions, EnvOptions, HistogramData, IngestExternalFileOptions, ReadOptions,
HistogramData, CompactOptions}; RestoreOptions, WriteOptions};
pub use slice_transform::SliceTransform; pub use slice_transform::SliceTransform;
pub use table_properties::{TableProperties, TablePropertiesCollection, pub use table_properties::{TableProperties, TablePropertiesCollection,
TablePropertiesCollectionView, UserCollectedProperties}; TablePropertiesCollectionView, UserCollectedProperties};
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
// //
extern crate rocksdb; extern crate rocksdb;
use rocksdb::{DB, MergeOperands, DBOptions, Writable, ColumnFamilyOptions}; use rocksdb::{ColumnFamilyOptions, DBOptions, MergeOperands, Writable, DB};
// fn snapshot_test() { // fn snapshot_test() {
// let path = "_rust_rocksdb_iteratortest"; // let path = "_rust_rocksdb_iteratortest";
...@@ -52,12 +52,10 @@ fn main() { ...@@ -52,12 +52,10 @@ fn main() {
let db = DB::open_default(path).unwrap(); let db = DB::open_default(path).unwrap();
assert!(db.put(b"my key", b"my value").is_ok()); assert!(db.put(b"my key", b"my value").is_ok());
match db.get(b"my key") { match db.get(b"my key") {
Ok(Some(value)) => { Ok(Some(value)) => match value.to_utf8() {
match value.to_utf8() { Some(v) => println!("retrieved utf8 value: {}", v),
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"), },
}
}
Ok(None) => panic!("value not present!"), Ok(None) => panic!("value not present!"),
Err(e) => println!("error retrieving value: {}", e), Err(e) => println!("error retrieving value: {}", e),
} }
...@@ -70,11 +68,9 @@ fn main() { ...@@ -70,11 +68,9 @@ fn main() {
fn concat_merge(_: &[u8], existing_val: Option<&[u8]>, operands: &mut MergeOperands) -> Vec<u8> { fn concat_merge(_: &[u8], existing_val: Option<&[u8]>, operands: &mut MergeOperands) -> Vec<u8> {
let mut result: Vec<u8> = Vec::with_capacity(operands.size_hint().0); let mut result: Vec<u8> = Vec::with_capacity(operands.size_hint().0);
match existing_val { match existing_val {
Some(v) => { Some(v) => for e in v {
for e in v { result.push(*e)
result.push(*e) },
}
}
None => (), None => (),
} }
for op in operands { for op in operands {
...@@ -100,12 +96,10 @@ fn custom_merge() { ...@@ -100,12 +96,10 @@ fn custom_merge() {
db.merge(b"k1", b"efg").unwrap(); db.merge(b"k1", b"efg").unwrap();
db.merge(b"k1", b"h").unwrap(); db.merge(b"k1", b"h").unwrap();
match db.get(b"k1") { match db.get(b"k1") {
Ok(Some(value)) => { Ok(Some(value)) => match value.to_utf8() {
match value.to_utf8() { Some(v) => println!("retrieved utf8 value: {}", v),
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"), },
}
}
Ok(None) => panic!("value not present!"), Ok(None) => panic!("value not present!"),
Err(e) => println!("error retrieving value: {}", e), Err(e) => println!("error retrieving value: {}", e),
} }
...@@ -116,22 +110,25 @@ fn custom_merge() { ...@@ -116,22 +110,25 @@ fn custom_merge() {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use rocksdb::{BlockBasedOptions, DB, DBCompressionType, ColumnFamilyOptions, DBOptions}; use rocksdb::{BlockBasedOptions, ColumnFamilyOptions, DBCompressionType, DBOptions, DB};
use rocksdb::DBCompactionStyle; use rocksdb::DBCompactionStyle;
use rocksdb::DBRecoveryMode; use rocksdb::DBRecoveryMode;
#[allow(dead_code)] #[allow(dead_code)]
fn tuned_for_somebody_elses_disk(path: &str, fn tuned_for_somebody_elses_disk(
mut opts: DBOptions, path: &str,
blockopts: &mut BlockBasedOptions) mut opts: DBOptions,
-> DB { blockopts: &mut BlockBasedOptions,
let per_level_compression: [DBCompressionType; 7] = [DBCompressionType::No, ) -> DB {
DBCompressionType::No, let per_level_compression: [DBCompressionType; 7] = [
DBCompressionType::No, DBCompressionType::No,
DBCompressionType::Lz4, DBCompressionType::No,
DBCompressionType::Lz4, DBCompressionType::No,
DBCompressionType::Lz4, DBCompressionType::Lz4,
DBCompressionType::Lz4]; DBCompressionType::Lz4,
DBCompressionType::Lz4,
DBCompressionType::Lz4,
];
let mut cf_opts = ColumnFamilyOptions::new(); let mut cf_opts = ColumnFamilyOptions::new();
opts.create_if_missing(true); opts.create_if_missing(true);
opts.set_max_open_files(10000); opts.set_max_open_files(10000);
......
...@@ -41,23 +41,24 @@ pub extern "C" fn name_callback(raw_cb: *mut c_void) -> *const c_char { ...@@ -41,23 +41,24 @@ pub extern "C" fn name_callback(raw_cb: *mut c_void) -> *const c_char {
} }
} }
pub extern "C" fn full_merge_callback(raw_cb: *mut c_void, pub extern "C" fn full_merge_callback(
raw_key: *const c_char, raw_cb: *mut c_void,
key_len: size_t, raw_key: *const c_char,
existing_value: *const c_char, key_len: size_t,
existing_value_len: size_t, existing_value: *const c_char,
operands_list: *const *const c_char, existing_value_len: size_t,
operands_list_len: *const size_t, operands_list: *const *const c_char,
num_operands: c_int, operands_list_len: *const size_t,
success: *mut u8, num_operands: c_int,
new_value_length: *mut size_t) success: *mut u8,
-> *const c_char { new_value_length: *mut size_t,
) -> *const c_char {
unsafe { unsafe {
let cb: &mut MergeOperatorCallback = &mut *(raw_cb as *mut MergeOperatorCallback); let cb: &mut MergeOperatorCallback = &mut *(raw_cb as *mut MergeOperatorCallback);
let operands = &mut MergeOperands::new(operands_list, operands_list_len, num_operands); let operands = &mut MergeOperands::new(operands_list, operands_list_len, num_operands);
let key: &[u8] = slice::from_raw_parts(raw_key as *const u8, key_len as usize); let key: &[u8] = slice::from_raw_parts(raw_key as *const u8, key_len as usize);
let oldval: &[u8] = slice::from_raw_parts(existing_value as *const u8, let oldval: &[u8] =
existing_value_len as usize); slice::from_raw_parts(existing_value as *const u8, existing_value_len as usize);
let mut result = (cb.merge_fn)(key, Some(oldval), operands); let mut result = (cb.merge_fn)(key, Some(oldval), operands);
result.shrink_to_fit(); result.shrink_to_fit();
// TODO(tan) investigate zero-copy techniques to improve performance // TODO(tan) investigate zero-copy techniques to improve performance
...@@ -70,15 +71,16 @@ pub extern "C" fn full_merge_callback(raw_cb: *mut c_void, ...@@ -70,15 +71,16 @@ pub extern "C" fn full_merge_callback(raw_cb: *mut c_void,
} }
} }
pub extern "C" fn partial_merge_callback(raw_cb: *mut c_void, pub extern "C" fn partial_merge_callback(
raw_key: *const c_char, raw_cb: *mut c_void,
key_len: size_t, raw_key: *const c_char,
operands_list: *const *const c_char, key_len: size_t,
operands_list_len: *const size_t, operands_list: *const *const c_char,
num_operands: c_int, operands_list_len: *const size_t,
success: *mut u8, num_operands: c_int,
new_value_length: *mut size_t) success: *mut u8,
-> *const c_char { new_value_length: *mut size_t,
) -> *const c_char {
unsafe { unsafe {
let cb: &mut MergeOperatorCallback = &mut *(raw_cb as *mut MergeOperatorCallback); let cb: &mut MergeOperatorCallback = &mut *(raw_cb as *mut MergeOperatorCallback);
let operands = &mut MergeOperands::new(operands_list, operands_list_len, num_operands); let operands = &mut MergeOperands::new(operands_list, operands_list_len, num_operands);
...@@ -104,10 +106,11 @@ pub struct MergeOperands { ...@@ -104,10 +106,11 @@ pub struct MergeOperands {
} }
impl MergeOperands { impl MergeOperands {
fn new(operands_list: *const *const c_char, fn new(
operands_list_len: *const size_t, operands_list: *const *const c_char,
num_operands: c_int) operands_list_len: *const size_t,
-> MergeOperands { num_operands: c_int,
) -> MergeOperands {
assert!(num_operands >= 0); assert!(num_operands >= 0);
MergeOperands { MergeOperands {
operands_list: operands_list, operands_list: operands_list,
...@@ -133,8 +136,10 @@ impl<'a> Iterator for &'a mut MergeOperands { ...@@ -133,8 +136,10 @@ impl<'a> Iterator for &'a mut MergeOperands {
let len = *len_ptr as usize; let len = *len_ptr as usize;
let ptr = base + (spacing * self.cursor); let ptr = base + (spacing * self.cursor);
self.cursor += 1; self.cursor += 1;
Some(mem::transmute(slice::from_raw_parts(*(ptr as *const *const u8) as *const u8, Some(mem::transmute(slice::from_raw_parts(
len))) *(ptr as *const *const u8) as *const u8,
len,
)))
} }
} }
} }
...@@ -147,17 +152,18 @@ impl<'a> Iterator for &'a mut MergeOperands { ...@@ -147,17 +152,18 @@ impl<'a> Iterator for &'a mut MergeOperands {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use rocksdb::{DB, DBVector, Writable};
use rocksdb_options::{DBOptions, ColumnFamilyOptions};
use super::*; use super::*;
use rocksdb::{DBVector, Writable, DB};
use rocksdb_options::{ColumnFamilyOptions, DBOptions};
use tempdir::TempDir; use tempdir::TempDir;
#[allow(unused_variables)] #[allow(unused_variables)]
#[allow(dead_code)] #[allow(dead_code)]
fn test_provided_merge(new_key: &[u8], fn test_provided_merge(
existing_val: Option<&[u8]>, new_key: &[u8],
operands: &mut MergeOperands) existing_val: Option<&[u8]>,
-> Vec<u8> { operands: &mut MergeOperands,
) -> Vec<u8> {
let nops = operands.size_hint().0; let nops = operands.size_hint().0;
let mut result: Vec<u8> = Vec::with_capacity(nops); let mut result: Vec<u8> = Vec::with_capacity(nops);
if let Some(v) = existing_val { if let Some(v) = existing_val {
...@@ -181,11 +187,12 @@ mod test { ...@@ -181,11 +187,12 @@ mod test {
opts.create_if_missing(true); opts.create_if_missing(true);
let mut cf_opts = ColumnFamilyOptions::new(); let mut cf_opts = ColumnFamilyOptions::new();
cf_opts.add_merge_operator("test operator", test_provided_merge); cf_opts.add_merge_operator("test operator", test_provided_merge);
let db = DB::open_cf(opts, let db = DB::open_cf(
path.path().to_str().unwrap(), opts,
vec!["default"], path.path().to_str().unwrap(),
vec![cf_opts]) vec!["default"],
.unwrap(); vec![cf_opts],
).unwrap();
let p = db.put(b"k1", b"a"); let p = db.put(b"k1", b"a");
assert!(p.is_ok()); assert!(p.is_ok());
let _ = db.merge(b"k1", b"b"); let _ = db.merge(b"k1", b"b");
...@@ -195,12 +202,10 @@ mod test { ...@@ -195,12 +202,10 @@ mod test {
let m = db.merge(b"k1", b"h"); let m = db.merge(b"k1", b"h");
assert!(m.is_ok()); assert!(m.is_ok());
match db.get(b"k1") { match db.get(b"k1") {
Ok(Some(value)) => { Ok(Some(value)) => match value.to_utf8() {
match value.to_utf8() { Some(v) => println!("retrieved utf8 value: {}", v),
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), Err(e) => println!("error reading value {:?}", e),
_ => panic!("value not present"), _ => panic!("value not present"),
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
use crocksdb_ffi::{self, DBSliceTransform}; use crocksdb_ffi::{self, DBSliceTransform};
use libc::{c_void, c_char, size_t}; use libc::{c_char, c_void, size_t};
use std::ffi::CString; use std::ffi::CString;
use std::slice; use std::slice;
...@@ -54,11 +54,12 @@ extern "C" fn destructor(transform: *mut c_void) { ...@@ -54,11 +54,12 @@ extern "C" fn destructor(transform: *mut c_void) {
} }
} }
extern "C" fn transform(transform: *mut c_void, extern "C" fn transform(
key: *const u8, transform: *mut c_void,
key_len: size_t, key: *const u8,
dest_len: *mut size_t) key_len: size_t,
-> *const u8 { dest_len: *mut size_t,
) -> *const u8 {
unsafe { unsafe {
let transform = &mut *(transform as *mut SliceTransformProxy); let transform = &mut *(transform as *mut SliceTransformProxy);
let key = slice::from_raw_parts(key, key_len); let key = slice::from_raw_parts(key, key_len);
...@@ -85,18 +86,21 @@ extern "C" fn in_range(transform: *mut c_void, key: *const u8, key_len: size_t) ...@@ -85,18 +86,21 @@ extern "C" fn in_range(transform: *mut c_void, key: *const u8, key_len: size_t)
} }
pub unsafe fn new_slice_transform(c_name: CString, pub unsafe fn new_slice_transform(
f: Box<SliceTransform>) c_name: CString,
-> Result<*mut DBSliceTransform, String> { f: Box<SliceTransform>,
) -> Result<*mut DBSliceTransform, String> {
let proxy = Box::into_raw(Box::new(SliceTransformProxy { let proxy = Box::into_raw(Box::new(SliceTransformProxy {
name: c_name, name: c_name,
transform: f, transform: f,
})); }));
let transform = crocksdb_ffi::crocksdb_slicetransform_create(proxy as *mut c_void, let transform = crocksdb_ffi::crocksdb_slicetransform_create(
destructor, proxy as *mut c_void,
transform, destructor,
in_domain, transform,
in_range, in_domain,
name); in_range,
name,
);
Ok(transform) Ok(transform)
} }
...@@ -12,20 +12,21 @@ ...@@ -12,20 +12,21 @@
// limitations under the License. // limitations under the License.
use crocksdb_ffi::{self, DBTableProperties, DBTableProperty, DBUserCollectedPropertiesIterator, use crocksdb_ffi::{self, DBTableProperties, DBTablePropertiesCollection,
DBTablePropertiesCollection, DBTablePropertiesCollectionIterator, DBTablePropertiesCollectionIterator, DBTableProperty,
DBUserCollectedProperties}; DBUserCollectedProperties, DBUserCollectedPropertiesIterator};
use libc::size_t; use libc::size_t;
use std::{slice, str, mem}; use std::{mem, slice, str};
use std::marker::PhantomData; use std::marker::PhantomData;
use std::ops::{Index, Deref}; use std::ops::{Deref, Index};
pub struct TablePropertiesCollectionView(DBTablePropertiesCollection); pub struct TablePropertiesCollectionView(DBTablePropertiesCollection);
impl TablePropertiesCollectionView { impl TablePropertiesCollectionView {
pub unsafe fn from_ptr<'a>(collection: *const DBTablePropertiesCollection) pub unsafe fn from_ptr<'a>(
-> &'a TablePropertiesCollectionView { collection: *const DBTablePropertiesCollection,
) -> &'a TablePropertiesCollectionView {
let c = &*collection; let c = &*collection;
mem::transmute(c) mem::transmute(c)
} }
...@@ -86,8 +87,8 @@ impl<'a> Iterator for TablePropertiesCollectionIter<'a> { ...@@ -86,8 +87,8 @@ impl<'a> Iterator for TablePropertiesCollectionIter<'a> {
} }
let mut klen: size_t = 0; let mut klen: size_t = 0;
let k = crocksdb_ffi::crocksdb_table_properties_collection_iter_key(self.inner, let k =
&mut klen); crocksdb_ffi::crocksdb_table_properties_collection_iter_key(self.inner, &mut klen);
let bytes = slice::from_raw_parts(k, klen); let bytes = slice::from_raw_parts(k, klen);
let key = str::from_utf8(bytes).unwrap(); let key = str::from_utf8(bytes).unwrap();
let props = crocksdb_ffi::crocksdb_table_properties_collection_iter_value(self.inner); let props = crocksdb_ffi::crocksdb_table_properties_collection_iter_value(self.inner);
...@@ -237,10 +238,12 @@ impl UserCollectedProperties { ...@@ -237,10 +238,12 @@ impl UserCollectedProperties {
let bytes = index.as_ref(); let bytes = index.as_ref();
let mut size = 0; let mut size = 0;
unsafe { unsafe {
let ptr = crocksdb_ffi::crocksdb_user_collected_properties_get(&self.inner, let ptr = crocksdb_ffi::crocksdb_user_collected_properties_get(
bytes.as_ptr(), &self.inner,
bytes.len(), bytes.as_ptr(),
&mut size); bytes.len(),
&mut size,
);
if ptr.is_null() { if ptr.is_null() {
return None; return None;
} }
...@@ -262,7 +265,8 @@ impl<Q: AsRef<[u8]>> Index<Q> for UserCollectedProperties { ...@@ -262,7 +265,8 @@ impl<Q: AsRef<[u8]>> Index<Q> for UserCollectedProperties {
fn index(&self, index: Q) -> &[u8] { fn index(&self, index: Q) -> &[u8] {
let key = index.as_ref(); let key = index.as_ref();
self.get(key).unwrap_or_else(|| panic!("no entry found for key {:?}", key)) self.get(key)
.unwrap_or_else(|| panic!("no entry found for key {:?}", key))
} }
} }
...@@ -308,13 +312,13 @@ impl<'a> Iterator for UserCollectedPropertiesIter<'a> { ...@@ -308,13 +312,13 @@ impl<'a> Iterator for UserCollectedPropertiesIter<'a> {
return None; return None;
} }
let mut klen: size_t = 0; let mut klen: size_t = 0;
let k = crocksdb_ffi::crocksdb_user_collected_properties_iter_key(self.inner, let k =
&mut klen); crocksdb_ffi::crocksdb_user_collected_properties_iter_key(self.inner, &mut klen);
let key = slice::from_raw_parts(k, klen); let key = slice::from_raw_parts(k, klen);
let mut vlen: size_t = 0; let mut vlen: size_t = 0;
let v = crocksdb_ffi::crocksdb_user_collected_properties_iter_value(self.inner, let v =
&mut vlen); crocksdb_ffi::crocksdb_user_collected_properties_iter_value(self.inner, &mut vlen);
let val = slice::from_raw_parts(v, vlen); let val = slice::from_raw_parts(v, vlen);
crocksdb_ffi::crocksdb_user_collected_properties_iter_next(self.inner); crocksdb_ffi::crocksdb_user_collected_properties_iter_next(self.inner);
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use crocksdb_ffi::{self, DBEntryType, DBUserCollectedProperties, DBTablePropertiesCollector}; use crocksdb_ffi::{self, DBEntryType, DBTablePropertiesCollector, DBUserCollectedProperties};
use libc::{c_void, c_char, c_int, uint8_t, uint64_t, size_t}; use libc::{c_char, c_int, c_void, size_t, uint64_t, uint8_t};
use std::collections::HashMap; use std::collections::HashMap;
use std::ffi::CString; use std::ffi::CString;
use std::mem; use std::mem;
...@@ -26,12 +26,7 @@ use std::slice; ...@@ -26,12 +26,7 @@ use std::slice;
/// TablePropertiesCollector object per table and then call it sequentially /// TablePropertiesCollector object per table and then call it sequentially
pub trait TablePropertiesCollector { pub trait TablePropertiesCollector {
/// Will be called when a new key/value pair is inserted into the table. /// Will be called when a new key/value pair is inserted into the table.
fn add(&mut self, fn add(&mut self, key: &[u8], value: &[u8], entry_type: DBEntryType, seq: u64, file_size: u64);
key: &[u8],
value: &[u8],
entry_type: DBEntryType,
seq: u64,
file_size: u64);
/// Will be called when a table has already been built and is ready for /// Will be called when a table has already been built and is ready for
/// writing the properties block. /// writing the properties block.
...@@ -65,19 +60,23 @@ extern "C" fn destruct(handle: *mut c_void) { ...@@ -65,19 +60,23 @@ extern "C" fn destruct(handle: *mut c_void) {
} }
} }
pub extern "C" fn add(handle: *mut c_void, pub extern "C" fn add(
key: *const uint8_t, handle: *mut c_void,
key_len: size_t, key: *const uint8_t,
value: *const uint8_t, key_len: size_t,
value_len: size_t, value: *const uint8_t,
entry_type: c_int, value_len: size_t,
seq: uint64_t, entry_type: c_int,
file_size: uint64_t) { seq: uint64_t,
file_size: uint64_t,
) {
unsafe { unsafe {
let handle = &mut *(handle as *mut TablePropertiesCollectorHandle); let handle = &mut *(handle as *mut TablePropertiesCollectorHandle);
let key = slice::from_raw_parts(key, key_len); let key = slice::from_raw_parts(key, key_len);
let value = slice::from_raw_parts(value, value_len); let value = slice::from_raw_parts(value, value_len);
handle.rep.add(key, value, mem::transmute(entry_type), seq, file_size); handle
.rep
.add(key, value, mem::transmute(entry_type), seq, file_size);
} }
} }
...@@ -85,18 +84,21 @@ pub extern "C" fn finish(handle: *mut c_void, props: *mut DBUserCollectedPropert ...@@ -85,18 +84,21 @@ pub extern "C" fn finish(handle: *mut c_void, props: *mut DBUserCollectedPropert
unsafe { unsafe {
let handle = &mut *(handle as *mut TablePropertiesCollectorHandle); let handle = &mut *(handle as *mut TablePropertiesCollectorHandle);
for (key, value) in handle.rep.finish() { for (key, value) in handle.rep.finish() {
crocksdb_ffi::crocksdb_user_collected_properties_add(props, crocksdb_ffi::crocksdb_user_collected_properties_add(
key.as_ptr(), props,
key.len(), key.as_ptr(),
value.as_ptr(), key.len(),
value.len()); value.as_ptr(),
value.len(),
);
} }
} }
} }
pub unsafe fn new_table_properties_collector(cname: &str, pub unsafe fn new_table_properties_collector(
collector: Box<TablePropertiesCollector>) cname: &str,
-> *mut DBTablePropertiesCollector { collector: Box<TablePropertiesCollector>,
) -> *mut DBTablePropertiesCollector {
let handle = TablePropertiesCollectorHandle::new(cname, collector); let handle = TablePropertiesCollectorHandle::new(cname, collector);
crocksdb_ffi::crocksdb_table_properties_collector_create( crocksdb_ffi::crocksdb_table_properties_collector_create(
Box::into_raw(Box::new(handle)) as *mut c_void, Box::into_raw(Box::new(handle)) as *mut c_void,
......
...@@ -12,9 +12,9 @@ ...@@ -12,9 +12,9 @@
// limitations under the License. // limitations under the License.
use crocksdb_ffi::{self, DBTablePropertiesCollector, DBTablePropertiesCollectorFactory}; use crocksdb_ffi::{self, DBTablePropertiesCollector, DBTablePropertiesCollectorFactory};
use libc::{c_void, c_char, uint32_t}; use libc::{c_char, c_void, uint32_t};
use std::ffi::CString; use std::ffi::CString;
use table_properties_collector::{TablePropertiesCollector, new_table_properties_collector}; use table_properties_collector::{new_table_properties_collector, TablePropertiesCollector};
/// Constructs `TablePropertiesCollector`. /// Constructs `TablePropertiesCollector`.
/// Internals create a new `TablePropertiesCollector` for each new table. /// Internals create a new `TablePropertiesCollector` for each new table.
...@@ -29,9 +29,10 @@ struct TablePropertiesCollectorFactoryHandle { ...@@ -29,9 +29,10 @@ struct TablePropertiesCollectorFactoryHandle {
} }
impl TablePropertiesCollectorFactoryHandle { impl TablePropertiesCollectorFactoryHandle {
fn new(name: &str, fn new(
rep: Box<TablePropertiesCollectorFactory>) name: &str,
-> TablePropertiesCollectorFactoryHandle { rep: Box<TablePropertiesCollectorFactory>,
) -> TablePropertiesCollectorFactoryHandle {
TablePropertiesCollectorFactoryHandle { TablePropertiesCollectorFactoryHandle {
name: CString::new(name).unwrap(), name: CString::new(name).unwrap(),
rep: rep, rep: rep,
...@@ -52,9 +53,10 @@ extern "C" fn destruct(handle: *mut c_void) { ...@@ -52,9 +53,10 @@ extern "C" fn destruct(handle: *mut c_void) {
} }
} }
extern "C" fn create_table_properties_collector(handle: *mut c_void, extern "C" fn create_table_properties_collector(
cf: uint32_t) handle: *mut c_void,
-> *mut DBTablePropertiesCollector { cf: uint32_t,
) -> *mut DBTablePropertiesCollector {
unsafe { unsafe {
let handle = &mut *(handle as *mut TablePropertiesCollectorFactoryHandle); let handle = &mut *(handle as *mut TablePropertiesCollectorFactoryHandle);
let collector = handle.rep.create_table_properties_collector(cf); let collector = handle.rep.create_table_properties_collector(cf);
...@@ -62,14 +64,15 @@ extern "C" fn create_table_properties_collector(handle: *mut c_void, ...@@ -62,14 +64,15 @@ extern "C" fn create_table_properties_collector(handle: *mut c_void,
} }
} }
pub unsafe fn new_table_properties_collector_factory pub unsafe fn new_table_properties_collector_factory(
(fname: &str, factory: Box<TablePropertiesCollectorFactory>) fname: &str,
-> *mut DBTablePropertiesCollectorFactory { factory: Box<TablePropertiesCollectorFactory>,
) -> *mut DBTablePropertiesCollectorFactory {
let handle = TablePropertiesCollectorFactoryHandle::new(fname, factory); let handle = TablePropertiesCollectorFactoryHandle::new(fname, factory);
crocksdb_ffi::crocksdb_table_properties_collector_factory_create( crocksdb_ffi::crocksdb_table_properties_collector_factory_create(
Box::into_raw(Box::new(handle)) as *mut c_void, Box::into_raw(Box::new(handle)) as *mut c_void,
name, name,
destruct, destruct,
create_table_properties_collector, create_table_properties_collector,
) )
} }
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
// //
use rocksdb::{DB, MergeOperands, DBOptions, ColumnFamilyOptions, Writable}; use rocksdb::{ColumnFamilyOptions, DBOptions, MergeOperands, Writable, DB};
use tempdir::TempDir; use tempdir::TempDir;
#[test] #[test]
...@@ -43,15 +43,15 @@ pub fn test_column_family() { ...@@ -43,15 +43,15 @@ pub fn test_column_family() {
let mut cf_opts = ColumnFamilyOptions::new(); let mut cf_opts = ColumnFamilyOptions::new();
cf_opts.add_merge_operator("test operator", test_provided_merge); cf_opts.add_merge_operator("test operator", test_provided_merge);
match DB::open_cf(DBOptions::new(), path_str, vec!["default"], vec![cf_opts]) { match DB::open_cf(DBOptions::new(), path_str, vec!["default"], vec![cf_opts]) {
Ok(_) => { Ok(_) => panic!(
panic!("should not have opened DB successfully without \ "should not have opened DB successfully without \
specifying column specifying column
families") families"
} ),
Err(e) => { Err(e) => assert!(e.starts_with(
assert!(e.starts_with("Invalid argument: You have to open \ "Invalid argument: You have to open \
all column families.")) all column families."
} )),
} }
} }
...@@ -77,11 +77,7 @@ pub fn test_column_family() { ...@@ -77,11 +77,7 @@ pub fn test_column_family() {
}; };
let cf1 = db.cf_handle("cf1").unwrap(); let cf1 = db.cf_handle("cf1").unwrap();
assert!(db.put_cf(cf1, b"k1", b"v1").is_ok()); assert!(db.put_cf(cf1, b"k1", b"v1").is_ok());
assert!(db.get_cf(cf1, b"k1") assert!(db.get_cf(cf1, b"k1").unwrap().unwrap().to_utf8().unwrap() == "v1");
.unwrap()
.unwrap()
.to_utf8()
.unwrap() == "v1");
let p = db.put_cf(cf1, b"k1", b"a"); let p = db.put_cf(cf1, b"k1", b"a");
assert!(p.is_ok()); assert!(p.is_ok());
/* /*
...@@ -117,11 +113,12 @@ pub fn test_column_family() { ...@@ -117,11 +113,12 @@ pub fn test_column_family() {
{} {}
// should be able to drop a cf // should be able to drop a cf
{ {
let mut db = DB::open_cf(DBOptions::new(), let mut db = DB::open_cf(
path_str, DBOptions::new(),
vec!["cf1"], path_str,
vec![ColumnFamilyOptions::new()]) vec!["cf1"],
.unwrap(); vec![ColumnFamilyOptions::new()],
).unwrap();
match db.drop_cf("cf1") { match db.drop_cf("cf1") {
Ok(_) => println!("cf1 successfully dropped."), Ok(_) => println!("cf1 successfully dropped."),
Err(e) => panic!("failed to drop column family: {}", e), Err(e) => panic!("failed to drop column family: {}", e),
...@@ -129,18 +126,17 @@ pub fn test_column_family() { ...@@ -129,18 +126,17 @@ pub fn test_column_family() {
} }
} }
fn test_provided_merge(_: &[u8], fn test_provided_merge(
existing_val: Option<&[u8]>, _: &[u8],
operands: &mut MergeOperands) existing_val: Option<&[u8]>,
-> Vec<u8> { operands: &mut MergeOperands,
) -> Vec<u8> {
let nops = operands.size_hint().0; let nops = operands.size_hint().0;
let mut result: Vec<u8> = Vec::with_capacity(nops); let mut result: Vec<u8> = Vec::with_capacity(nops);
match existing_val { match existing_val {
Some(v) => { Some(v) => for e in v {
for e in v { result.push(*e);
result.push(*e); },
}
}
None => (), None => (),
} }
for op in operands { for op in operands {
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use rocksdb::{DB, DBOptions, Range, Writable}; use rocksdb::{DBOptions, Range, Writable, DB};
use tempdir::TempDir; use tempdir::TempDir;
...@@ -21,11 +21,13 @@ fn test_compact_range() { ...@@ -21,11 +21,13 @@ fn test_compact_range() {
let mut opts = DBOptions::new(); let mut opts = DBOptions::new();
opts.create_if_missing(true); opts.create_if_missing(true);
let db = DB::open(opts, path.path().to_str().unwrap()).unwrap(); let db = DB::open(opts, path.path().to_str().unwrap()).unwrap();
let samples = vec![(b"k1".to_vec(), b"value--------1".to_vec()), let samples = vec![
(b"k2".to_vec(), b"value--------2".to_vec()), (b"k1".to_vec(), b"value--------1".to_vec()),
(b"k3".to_vec(), b"value--------3".to_vec()), (b"k2".to_vec(), b"value--------2".to_vec()),
(b"k4".to_vec(), b"value--------4".to_vec()), (b"k3".to_vec(), b"value--------3".to_vec()),
(b"k5".to_vec(), b"value--------5".to_vec())]; (b"k4".to_vec(), b"value--------4".to_vec()),
(b"k5".to_vec(), b"value--------5".to_vec()),
];
for &(ref k, ref v) in &samples { for &(ref k, ref v) in &samples {
db.put(k, v).unwrap(); db.put(k, v).unwrap();
assert_eq!(v.as_slice(), &*db.get(k).unwrap().unwrap()); assert_eq!(v.as_slice(), &*db.get(k).unwrap().unwrap());
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use rocksdb::{Writable, DB, CompactionFilter, DBOptions, ColumnFamilyOptions}; use rocksdb::{ColumnFamilyOptions, CompactionFilter, DBOptions, Writable, DB};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use tempdir::TempDir; use tempdir::TempDir;
...@@ -44,22 +44,28 @@ fn test_compaction_filter() { ...@@ -44,22 +44,28 @@ fn test_compaction_filter() {
let drop_called = Arc::new(AtomicBool::new(false)); let drop_called = Arc::new(AtomicBool::new(false));
let filtered_kvs = Arc::new(RwLock::new(vec![])); let filtered_kvs = Arc::new(RwLock::new(vec![]));
// set ignore_snapshots to false // set ignore_snapshots to false
cf_opts.set_compaction_filter("test", cf_opts
false, .set_compaction_filter(
Box::new(Filter { "test",
drop_called: drop_called.clone(), false,
filtered_kvs: filtered_kvs.clone(), Box::new(Filter {
})) drop_called: drop_called.clone(),
filtered_kvs: filtered_kvs.clone(),
}),
)
.unwrap(); .unwrap();
let mut opts = DBOptions::new(); let mut opts = DBOptions::new();
opts.create_if_missing(true); opts.create_if_missing(true);
let db = DB::open_cf(opts, let db = DB::open_cf(
path.path().to_str().unwrap(), opts,
vec!["default"], path.path().to_str().unwrap(),
vec![cf_opts]) vec!["default"],
.unwrap(); vec![cf_opts],
let samples = vec![(b"key1".to_vec(), b"value1".to_vec()), ).unwrap();
(b"key2".to_vec(), b"value2".to_vec())]; let samples = vec![
(b"key1".to_vec(), b"value1".to_vec()),
(b"key2".to_vec(), b"value2".to_vec()),
];
for &(ref k, ref v) in &samples { for &(ref k, ref v) in &samples {
db.put(k, v).unwrap(); db.put(k, v).unwrap();
assert_eq!(v.as_slice(), &*db.get(k).unwrap().unwrap()); assert_eq!(v.as_slice(), &*db.get(k).unwrap().unwrap());
...@@ -79,21 +85,25 @@ fn test_compaction_filter() { ...@@ -79,21 +85,25 @@ fn test_compaction_filter() {
// reregister with ignore_snapshots set to true // reregister with ignore_snapshots set to true
let mut cf_opts = ColumnFamilyOptions::new(); let mut cf_opts = ColumnFamilyOptions::new();
let opts = DBOptions::new(); let opts = DBOptions::new();
cf_opts.set_compaction_filter("test", cf_opts
true, .set_compaction_filter(
Box::new(Filter { "test",
drop_called: drop_called.clone(), true,
filtered_kvs: filtered_kvs.clone(), Box::new(Filter {
})) drop_called: drop_called.clone(),
filtered_kvs: filtered_kvs.clone(),
}),
)
.unwrap(); .unwrap();
assert!(drop_called.load(Ordering::Relaxed)); assert!(drop_called.load(Ordering::Relaxed));
drop_called.store(false, Ordering::Relaxed); drop_called.store(false, Ordering::Relaxed);
{ {
let db = DB::open_cf(opts, let db = DB::open_cf(
path.path().to_str().unwrap(), opts,
vec!["default"], path.path().to_str().unwrap(),
vec![cf_opts]) vec!["default"],
.unwrap(); vec![cf_opts],
).unwrap();
let _snap = db.snapshot(); let _snap = db.snapshot();
// Because ignore_snapshots is true, so all the keys will be compacted. // Because ignore_snapshots is true, so all the keys will be compacted.
db.compact_range(Some(b"key1"), Some(b"key3")); db.compact_range(Some(b"key1"), Some(b"key3"));
......
This diff is collapsed.
...@@ -86,17 +86,19 @@ fn test_event_listener_basic() { ...@@ -86,17 +86,19 @@ fn test_event_listener_basic() {
opts.create_if_missing(true); opts.create_if_missing(true);
let db = DB::open(opts, path_str).unwrap(); let db = DB::open(opts, path_str).unwrap();
for i in 1..8000 { for i in 1..8000 {
db.put(format!("{:04}", i).as_bytes(), db.put(
format!("{:04}", i).as_bytes()) format!("{:04}", i).as_bytes(),
.unwrap(); format!("{:04}", i).as_bytes(),
).unwrap();
} }
db.flush(true).unwrap(); db.flush(true).unwrap();
assert_ne!(counter.flush.load(Ordering::SeqCst), 0); assert_ne!(counter.flush.load(Ordering::SeqCst), 0);
for i in 1..8000 { for i in 1..8000 {
db.put(format!("{:04}", i).as_bytes(), db.put(
format!("{:04}", i).as_bytes()) format!("{:04}", i).as_bytes(),
.unwrap(); format!("{:04}", i).as_bytes(),
).unwrap();
} }
db.flush(true).unwrap(); db.flush(true).unwrap();
let flush_cnt = counter.flush.load(Ordering::SeqCst); let flush_cnt = counter.flush.load(Ordering::SeqCst);
...@@ -125,10 +127,12 @@ fn test_event_listener_ingestion() { ...@@ -125,10 +127,12 @@ fn test_event_listener_ingestion() {
let test_sstfile_str = test_sstfile.to_str().unwrap(); let test_sstfile_str = test_sstfile.to_str().unwrap();
let default_options = db.get_options(); let default_options = db.get_options();
gen_sst(default_options, gen_sst(
Some(db.cf_handle("default").unwrap()), default_options,
test_sstfile_str, Some(db.cf_handle("default").unwrap()),
&[(b"k1", b"v1"), (b"k2", b"v2")]); test_sstfile_str,
&[(b"k1", b"v1"), (b"k2", b"v2")],
);
let ingest_opt = IngestExternalFileOptions::new(); let ingest_opt = IngestExternalFileOptions::new();
db.ingest_external_file(&ingest_opt, &[test_sstfile_str]) db.ingest_external_file(&ingest_opt, &[test_sstfile_str])
......
This diff is collapsed.
This diff is collapsed.
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use rocksdb::{DB, Writable}; use rocksdb::{Writable, DB};
use std::sync::Arc; use std::sync::Arc;
use std::thread; use std::thread;
use tempdir::TempDir; use tempdir::TempDir;
...@@ -40,11 +40,9 @@ pub fn test_multithreaded() { ...@@ -40,11 +40,9 @@ pub fn test_multithreaded() {
let db3 = db.clone(); let db3 = db.clone();
let j3 = thread::spawn(move || for _ in 1..N { let j3 = thread::spawn(move || for _ in 1..N {
match db3.get(b"key") { match db3.get(b"key") {
Ok(Some(v)) => { Ok(Some(v)) => if &v[..] != b"value1" && &v[..] != b"value2" {
if &v[..] != b"value1" && &v[..] != b"value2" { assert!(false);
assert!(false); },
}
}
_ => { _ => {
assert!(false); assert!(false);
} }
......
...@@ -31,8 +31,17 @@ impl SliceTransform for FixedPrefixTransform { ...@@ -31,8 +31,17 @@ impl SliceTransform for FixedPrefixTransform {
#[test] #[test]
fn test_prefix_extractor_compatibility() { fn test_prefix_extractor_compatibility() {
let path = TempDir::new("_rust_rocksdb_prefix_extractor_compatibility").expect(""); let path = TempDir::new("_rust_rocksdb_prefix_extractor_compatibility").expect("");
let keys = vec![b"k1-0", b"k1-1", b"k1-2", b"k1-3", b"k1-4", b"k1-5", b"k1-6", b"k1-7", let keys = vec![
b"k1-8"]; b"k1-0",
b"k1-1",
b"k1-2",
b"k1-3",
b"k1-4",
b"k1-5",
b"k1-6",
b"k1-7",
b"k1-8",
];
// create db with no prefix extractor, and insert data // create db with no prefix extractor, and insert data
{ {
...@@ -57,16 +66,20 @@ fn test_prefix_extractor_compatibility() { ...@@ -57,16 +66,20 @@ fn test_prefix_extractor_compatibility() {
let mut cf_opts = ColumnFamilyOptions::new(); let mut cf_opts = ColumnFamilyOptions::new();
opts.create_if_missing(false); opts.create_if_missing(false);
cf_opts.set_block_based_table_factory(&bbto); cf_opts.set_block_based_table_factory(&bbto);
cf_opts.set_prefix_extractor("FixedPrefixTransform", cf_opts
Box::new(FixedPrefixTransform { prefix_len: 2 })) .set_prefix_extractor(
"FixedPrefixTransform",
Box::new(FixedPrefixTransform { prefix_len: 2 }),
)
.unwrap(); .unwrap();
// also create prefix bloom for memtable // also create prefix bloom for memtable
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let db = DB::open_cf(opts, let db = DB::open_cf(
path.path().to_str().unwrap(), opts,
vec!["default"], path.path().to_str().unwrap(),
vec![cf_opts]) vec!["default"],
.unwrap(); vec![cf_opts],
).unwrap();
let wopts = WriteOptions::new(); let wopts = WriteOptions::new();
// sst2 with prefix bloom. // sst2 with prefix bloom.
......
This diff is collapsed.
This diff is collapsed.
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
// limitations under the License. // limitations under the License.
use rocksdb::*; use rocksdb::*;
use rocksdb::{DBStatisticsTickerType as TickerType, DBStatisticsHistogramType as HistogramType}; use rocksdb::{DBStatisticsHistogramType as HistogramType, DBStatisticsTickerType as TickerType};
use tempdir::TempDir; use tempdir::TempDir;
#[test] #[test]
...@@ -35,8 +35,12 @@ fn test_db_statistics() { ...@@ -35,8 +35,12 @@ fn test_db_statistics() {
assert!(db.get_statistics_ticker_count(TickerType::BlockCacheHit) > 0); assert!(db.get_statistics_ticker_count(TickerType::BlockCacheHit) > 0);
assert!(db.get_and_reset_statistics_ticker_count(TickerType::BlockCacheHit) > 0); assert!(db.get_and_reset_statistics_ticker_count(TickerType::BlockCacheHit) > 0);
assert_eq!(db.get_statistics_ticker_count(TickerType::BlockCacheHit), 0); assert_eq!(db.get_statistics_ticker_count(TickerType::BlockCacheHit), 0);
assert!(db.get_statistics_histogram_string(HistogramType::GetMicros) assert!(
.is_some()); db.get_statistics_histogram_string(HistogramType::GetMicros)
assert!(db.get_statistics_histogram(HistogramType::GetMicros) .is_some()
.is_some()); );
assert!(
db.get_statistics_histogram(HistogramType::GetMicros)
.is_some()
);
} }
This diff is collapsed.
This diff is collapsed.
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