From 9118a60fe265f4c425a162a3958a96e008be646f Mon Sep 17 00:00:00 2001 From: Oleksandr Anyshchenko Date: Fri, 5 Aug 2022 15:51:51 +0200 Subject: [PATCH] Release 0.19.0 (#669) --- CHANGELOG.md | 34 +++++++++++++++++++++-- Cargo.toml | 2 +- README.md | 3 ++- src/transactions/options.rs | 13 +++++---- tests/test_optimistic_transaction_db.rs | 32 +++++++++++++--------- tests/test_transaction_db.rs | 36 ++++++++++++++----------- 6 files changed, 81 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9edfa6e..55c7aa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,39 @@ ## [Unreleased] +## 0.19.0 (2022-08-05) + +* Add support for building with `io_uring` on Linux (parazyd) +* Change iterators to return Result (mina86) +* Support RocksDB transaction (yiyuanliu) +* Avoid pulling in dependencies via static feature flag (niklasf) +* Bump `rocksdb` to 7.4.4 (niklasf) +* Bump `tikv-jemalloc-sys` to 0.5 (niklasf) +* Update `set_use_fsync` comment (nazar-pc) +* Introduce ReadOptions::set_iterate_range and PrefixRange (mina86) +* Bump `rocksdb` to 7.4.3 (aleksuss) +* Don’t hold onto ReadOptions.inner when iterating (mina86) +* Bump `zstd-sys` from 1.6 to 2.0 (slightknack) +* Enable a building on the iOS platform (dignifiedquire) +* Add DBRawIteratorWithThreadMode::item method (mina86) +* Use NonNull in DBRawIteratorWithThreadMode (mina86) +* Tiny refactoring including fix for UB (niklasf) +* Add batched version MultiGet API (yhchiang-sol) +* Upgrade to rocksdb v7.3.1 (yhchiang-sol) +* Consistently use `ffi_util::to_cpath` to convert `Path` to `CString` (mina86) +* Convert properties to `&CStr` (mina86) +* Allow passing `&CStr` arguments (mina86) +* Fix memory leak when reading properties and avoid memory allocation (mina86) +* Fix Windows UTF-8 build flag (rajivshah3) +* Use more target features to build librocksdb-sys (niklasf) +* Fix `bz_internal_error` symbol multiply defined (nanpuyue) +* Bump rocksdb to 7.1.2 (dignifiedquire) +* Add BlobDB options (dignifiedquire) +* Add snapshot `PinnableSlice` based API (zheland) + ## 0.18.0 (2022-02-03) -* Add open_cf_descriptor methods for Seoncdary and ReadOnly AccessType (steviez) +* Add open_cf_descriptor methods for Secondary and ReadOnly AccessType (steviez) * Make Ribbon filters available (niklasf) * Change versioning scheme of `librocksdb-sys` crate (aleksuss) * Upgrade to RocksDB 6.28.2 (akrylysov) @@ -30,7 +60,7 @@ * Support UTF-8 file paths on Windows (rajivshah3) * Support building RocksDB with jemalloc (akrylysov) * Add rocksdb WAL flush api (duarten) -* Update rocksdb to v6.22.1 (#540) +* Update rocksdb to v6.22.1 (duarten) ## 0.17.0 (2021-07-22) diff --git a/Cargo.toml b/Cargo.toml index ada5dba..9e82f07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rocksdb" description = "Rust wrapper for Facebook's RocksDB embeddable database" -version = "0.18.0" +version = "0.19.0" edition = "2018" authors = ["Tyler Neely ", "David Greenberg "] repository = "https://github.com/rust-rocksdb/rust-rocksdb" diff --git a/README.md b/README.md index 79b0f09..8b59c94 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ rust-rocksdb [![documentation](https://docs.rs/rocksdb/badge.svg)](https://docs.rs/rocksdb) [![license](https://img.shields.io/crates/l/rocksdb.svg)](https://github.com/rust-rocksdb/rust-rocksdb/blob/master/LICENSE) [![Gitter chat](https://badges.gitter.im/rust-rocksdb/gitter.png)](https://gitter.im/rust-rocksdb/lobby) +![rust 1.60.0 required](https://img.shields.io/badge/rust-1.60.0-blue.svg?label=MSRV) ![GitHub commits (since latest release)](https://img.shields.io/github/commits-since/rust-rocksdb/rust-rocksdb/latest.svg) @@ -42,7 +43,7 @@ default-features = false features = ["lz4"] ``` -## Multi-threaded ColumnFamily alternation +## Multithreaded ColumnFamily alternation The underlying RocksDB does allow column families to be created and dropped from multiple threads concurrently. But this crate doesn't allow it by default diff --git a/src/transactions/options.rs b/src/transactions/options.rs index ac33147..c4e7a93 100644 --- a/src/transactions/options.rs +++ b/src/transactions/options.rs @@ -14,7 +14,6 @@ // use crate::ffi; -use core::panic; pub struct TransactionOptions { pub(crate) inner: *mut ffi::rocksdb_transaction_options_t, @@ -51,7 +50,7 @@ impl TransactionOptions { /// /// If a transaction has a snapshot set, the transaction will ensure that /// any keys successfully written(or fetched via `get_for_update`) have not - /// been modified outside of this transaction since the time the snapshot was + /// been modified outside this transaction since the time the snapshot was /// set. /// If a snapshot has not been set, the transaction guarantees that keys have /// not been modified since the time each key was first written (or fetched via @@ -149,7 +148,7 @@ impl Default for TransactionDBOptions { let txn_db_opts = unsafe { ffi::rocksdb_transactiondb_options_create() }; assert!( !txn_db_opts.is_null(), - "Could not create RocksDB transactiondb options" + "Could not create RocksDB transaction_db options" ); Self { inner: txn_db_opts } } @@ -161,7 +160,7 @@ impl TransactionDBOptions { } /// Specifies the wait timeout in milliseconds when writing a key - /// outside of a transaction (ie. by calling `TransactionDB::put` directly). + /// outside a transaction (i.e. by calling `TransactionDB::put` directly). /// /// If 0, no waiting is done if a lock cannot instantly be acquired. /// If negative, there is no timeout and will block indefinitely when acquiring @@ -183,8 +182,8 @@ impl TransactionDBOptions { } } - /// Specifies the default wait timeout in milliseconds when a stransaction - /// attempts to lock a key if not secified in `TransactionOptions`. + /// Specifies the default wait timeout in milliseconds when a transaction + /// attempts to lock a key if not specified in `TransactionOptions`. /// /// If 0, no waiting is done if a lock cannot instantly be acquired. /// If negative, there is no timeout. Not using a timeout is not recommended @@ -266,7 +265,7 @@ impl OptimisticTransactionOptions { /// /// If a transaction has a snapshot set, the transaction will ensure that /// any keys successfully written(or fetched via `get_for_update`) have not - /// been modified outside of this transaction since the time the snapshot was + /// been modified outside the transaction since the time the snapshot was /// set. /// If a snapshot has not been set, the transaction guarantees that keys have /// not been modified since the time each key was first written (or fetched via diff --git a/tests/test_optimistic_transaction_db.rs b/tests/test_optimistic_transaction_db.rs index 4ae625a..1d81f2c 100644 --- a/tests/test_optimistic_transaction_db.rs +++ b/tests/test_optimistic_transaction_db.rs @@ -269,13 +269,13 @@ fn iterator_test() { ]; let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test that it's idempotent let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test in reverse let iter = db.iterator(IteratorMode::End); @@ -290,13 +290,16 @@ fn iterator_test() { (k3.clone(), v3.clone()), (k4.clone(), v4.clone()), ]; - assert_eq!(old_iter.collect::>(), expected); + assert_eq!(old_iter.map(Result::unwrap).collect::>(), expected); let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected2); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected2); let iter = db.iterator(IteratorMode::From(b"k3", Direction::Forward)); - assert_eq!(iter.collect::>(), vec![(k3, v3), (k4, v4)]); + assert_eq!( + iter.map(Result::unwrap).collect::>(), + vec![(k3, v3), (k4, v4)] + ); } } @@ -344,7 +347,7 @@ fn prefix_extract_and_iterate_test() { .into_iter() .map(|(k, v)| (k.to_vec().into_boxed_slice(), v.to_vec().into_boxed_slice())) .collect(); - assert_eq!(expected, iter.collect::>()); + assert_eq!(expected, iter.map(Result::unwrap).collect::>()); } } @@ -448,13 +451,13 @@ fn transaction_iterator() { let txn = db.transaction(); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test that it's idempotent let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test in reverse let iter = txn.iterator(IteratorMode::End); @@ -469,13 +472,16 @@ fn transaction_iterator() { (k3.clone(), v3.clone()), (k4.clone(), v4.clone()), ]; - assert_eq!(old_iter.collect::>(), expected); + assert_eq!(old_iter.map(Result::unwrap).collect::>(), expected); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected2); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected2); let iter = txn.iterator(IteratorMode::From(b"k3", Direction::Forward)); - assert_eq!(iter.collect::>(), vec![(k3, v3), (k4, v4)]); + assert_eq!( + iter.map(Result::unwrap).collect::>(), + vec![(k3, v3), (k4, v4)] + ); } } diff --git a/tests/test_transaction_db.rs b/tests/test_transaction_db.rs index 5bb5513..5cd37c5 100644 --- a/tests/test_transaction_db.rs +++ b/tests/test_transaction_db.rs @@ -296,17 +296,17 @@ fn iterator_test() { ]; let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test that it's idempotent let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test in reverse let iter = db.iterator(IteratorMode::End); - let mut tmp_vec = iter.collect::>(); + let mut tmp_vec = iter.map(Result::unwrap).collect::>(); tmp_vec.reverse(); let old_iter = db.iterator(IteratorMode::Start); @@ -317,13 +317,16 @@ fn iterator_test() { (k3.clone(), v3.clone()), (k4.clone(), v4.clone()), ]; - assert_eq!(old_iter.collect::>(), expected); + assert_eq!(old_iter.map(Result::unwrap).collect::>(), expected); let iter = db.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected2); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected2); let iter = db.iterator(IteratorMode::From(b"k3", Direction::Forward)); - assert_eq!(iter.collect::>(), vec![(k3, v3), (k4, v4)]); + assert_eq!( + iter.map(Result::unwrap).collect::>(), + vec![(k3, v3), (k4, v4)] + ); } } @@ -372,7 +375,7 @@ fn prefix_extract_and_iterate_test() { .into_iter() .map(|(k, v)| (k.to_vec().into_boxed_slice(), v.to_vec().into_boxed_slice())) .collect(); - assert_eq!(expected, iter.collect::>()); + assert_eq!(expected, iter.map(Result::unwrap).collect::>()); } } @@ -469,17 +472,17 @@ fn transaction_iterator() { let txn = db.transaction(); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test that it's idempotent let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected); // Test in reverse let iter = txn.iterator(IteratorMode::End); - let mut tmp_vec = iter.collect::>(); + let mut tmp_vec = iter.map(Result::unwrap).collect::>(); tmp_vec.reverse(); let old_iter = txn.iterator(IteratorMode::Start); @@ -490,13 +493,16 @@ fn transaction_iterator() { (k3.clone(), v3.clone()), (k4.clone(), v4.clone()), ]; - assert_eq!(old_iter.collect::>(), expected); + assert_eq!(old_iter.map(Result::unwrap).collect::>(), expected); let iter = txn.iterator(IteratorMode::Start); - assert_eq!(iter.collect::>(), expected2); + assert_eq!(iter.map(Result::unwrap).collect::>(), expected2); let iter = txn.iterator(IteratorMode::From(b"k3", Direction::Forward)); - assert_eq!(iter.collect::>(), vec![(k3, v3), (k4, v4)]); + assert_eq!( + iter.map(Result::unwrap).collect::>(), + vec![(k3, v3), (k4, v4)] + ); } }