- #1079
Transactional
is now implemented for[&Tree]
and[Tree]
so you can avoid the previous friction of using tuples, as was necessary previously. - #1058 The minimum supported Rust version (MSRV) is now 1.39.0.
- #1037
Subscriber
now implementsFuture
(non-fused) so prefix watching may now be iterated over viawhile let Some(event) = (&mut subscriber).await {}
- #965 concurrency control is now dynamically enabled for atomic point operations, so that it may be avoided unless transactional functionality is being used in the system. This significantly increases performance for workloads that do not use transactions.
- A number of memory optimizations have been implemented.
- Disk usage has been significantly reduced for many workloads.
- #1016 On 64-bit systems, we can now store 1-2 trillion items.
- #993 Added DerefMut and AsMut<[u8]> for
IVec
where it works similarly to aCow
, making a private copy if the backingArc
's strong count is not 1. - #1020 The sled wiki has been moved into the documentation
itself, and is accessible through the
doc
module exported in lib.
- #975 Changed the default
segment_size
from 8m to 512k. This will result in far smaller database files due to better file garbage collection granularity. - #975 deprecated several
Config
options that will be removed over time. - #1000 rearranged some transaction-related imports, and
moved them to the
transaction
module away from the library root to keep the top level docs clean. - #1015
TransactionalTree::apply_batch
now accepts its argument by reference instead of by value. Event
has been changed to make the inner fields named instead of anonymous.- #1057 read-only mode has been removed due to not having the resources to properly keep it tested while making progress on high priority issues. This may be correctly implemented in the future if resources permit.
- #947 dramatic read and recovery optimizations
- #921 reduced the reliance on locks while performing multithreaded IO on windows.
- #928 use
sync_file_range
on linux instead of a full fsync for most writes. - #946 io_uring support changed to the
rio
crate - #939 reduced memory consumption during zstd decompression
- #927 use SQLite-style varints for serializing
u64
. This dramatically reduces the written bytes for databases that store small keys and values. - #943 use varints for most of the fields in message headers, causing an additional large space reduction. combined with #927, these changes reduce bytes written by 68% for workloads writing small items.
- Documentation-only release
- Added the
open
function for quickly opening a database at a path with default configuration.
- Fixed an issue where an idle threadpool worker would spin in a hot loop until work arrived
- Migrated to a new storage format
- Fixed a bug where cache was not being evicted.
- Fixed a bug with using transactions with compression.
- The
create_new
option has been added toConfig
, allowing the user to specify that a database should only be freshly created, rather than re-opened.
- Fixed a bug where prefix encoding could be incorrectly handled when merging nodes together.
- The
Config::open
method has been added to giveConfig
a similar feel to std'sfs::OpenOptions
. TheConfig::build
andDb::start
methods are now deprecated in favor of callingConfig::open
directly. - A
checksum
method has been added to Tree and Db for use in verifying backups and migrations. - Transactions may now involve up to 69 different tables. Nice.
- The
TransactionError::Abort
variant has had a generic member added that can be returned as a way to return information from a manually-aborted transaction. Anabort
helper function has been added to reduce the boiler- plate required to return aborted results.
- The
ConfigBuilder
structure has been removed in favor of a simplifiedConfig
structure with the same functionality. - The way that sled versions are detected at initialization time is now independent of serde.
- The
cas
method is deprecated in favor of the newcompare_and_swap
method which now returns the proposed value that failed to be applied. - Tree nodes now have constant prefix encoding lengths.
- The
io_buf_size
configurable renamed tosegment_size
. - The
io_buf_size
configurable method has been removed from ConfigBuilder. This can be manually set by setting the attribute directly on the ConfigBuilder, but this is discouraged. Additionally, this must now be a power of 2. - The
page_consolidation_threshold
method has been removed from ConfigBuilder, and this is now a constant of 10.
Iter
no longer has a lifetime parameter.Db::open_tree
now returns aTree
instead of anArc<Tree>
.Tree
now has an inner type that uses anArc
, so you don't need to think about it.
- A bug with prefix encoding has been fixed that led to nodes with keys longer than 256 bytes being stored incorrectly, which led to them being inaccessible and also leading to infinite loops during iteration.
- Several cases of incorrect unsafe code were removed from the sled crate. No bugs are known to have been encountered, but they may have resulted in incorrect optimizations in future refactors.
Event::Set
has been renamed toEvent::Insert
andEvent::Del
has been renamed toEvent::Remove
. These names better align with the methods of BTreeMap from the standard library.
- A deadlock was possible in very high write volume situations when the segment accountant lock was taken by all IO threads while a task was blocked trying to submit a file truncation request to the threadpool while holding the segment accountant lock.
flush_async
has been added to perform time-intensive flushing in an asynchronous manner, returning a Future.
- std::thread is no longer used on platforms other than linux, macos, and windows, which increases portability.
- Transactions! You may now call
Tree::transaction
and perform reads, writes, and deletes within a provided closure with aTransactionalTree
argument. This closure may be called multiple times if the transaction encounters a concurrent update in the process of its execution. Transactions may also be used on tuples ofTree
objects, where the closure will then be parameterized onTransactionalTree
instances providing access to each of the providedTree
instances. This allows you to atomically read and modify multipleTree
instances in a single atomic operation. These transactions are serializable, fully ACID, and optimistic. Tree::apply_batch
allows you to apply aBatch
TransactionalTree::apply_batch
allow you to apply aBatch
from within a transaction.
Tree::batch
has been removed. Now you can directly create aBatch
withBatch::default()
and then apply it to aTree
withTree::apply_batch
or during a transaction usingTransactionalTree::apply_batch
. This facilitates multi-Tree
batches via transactions.Event::Merge
has been removed, andTree::merge
will now send a completeEvent::Set
item to be distributed to all listening subscribers.