- Fix a major data corruption issue that was introduced in version 0.12.0. It caused databases
greater than ~4GB to become irrecoverably corrupted due to an integer overflow in
PageNumber::address_range
that was introduced by commitb2c44a824d1ba69f526a1a75c56ae8484bae7248
- Add
drain_filter()
toTable
- Make key and value type bounds more clear for tables
- Fix
open()
on platforms with OS page size != 4KiB - Relax lifetime requirements on argument to
range()
anddrain()
- Add
pop_first()
andpop_last()
toTable
- Add
drain()
toTable
- Add support for
Option<T>
as a value type - Add support for user defined key and value types. Users must implement
RedbKey
and/orRedbValue
- Change
get()
,insert()
,remove()
...etc to take arguments of typeimpl Borrow<SelfType>
- Return
Error::UpgradeRequired
when opening a file with an outdated file format - Improve support for 32bit platforms
- Performance optimizations
- Remove
[u8]
andstr
type support. Use&[u8]
and&str
instead. - Change
get()
,range()
and several other methods to returnAccessGuard
. - Rename
AccessGuard::to_value()
tovalue()
- Add a non-mmap based backend which is now the default. This makes
Database::create()
andDatabase::open()
safe, but has worse performance in some cases. The mmap backend is available viacreate_mmapped()
/open_mmapped()
. There is no difference in the file format, so applications can switch from one backend to the other. - Better handling of fsync failures
- Remove maximum database size argument from
create()
. Databases are now unbounded in size - Reduce address space usage on Windows
- Remove
set_dynamic_growth()
- Add
set_initial_size()
toBuilder
- Optimize cleanup of deleted pages. This resolves a performance issue where openning a Database or performing a small transaction, could be slow if the last committed transaction deleted a large number of pages
- Remove
set_page_size()
. 4kB pages are always used now - Add
iter()
method toTable
andMultimapTable
- Fix various lifetime issues with type that had a lifetime, such as
&str
and(&[u8], u64)
- Add support for dynamic file growth on Windows
- Add support for tuple types as keys and values
- Remove
Builder::set_region_size
- Save lifetime from
Savepoint
- Fix crash when using
create()
to open an existing database created withWriteStrategy::TwoPhase
- Fix rare crash when writing a mix of small and very large values into the same table
- Performance optimizations
- Performance improvements for database files that are too large to fit in RAM
- Fix deadlock in concurrent calls to
savepoint()
andrestore_savepoint()
- Fix crash if
restore_savepoint()
failed - Move
savepoint()
andrestore_savepoint()
methods toWriteTransaction
- Implement
Iterator
for the types returned fromrange()
andremove_all()
- Add support for Windows
- Add
Database::set_write_strategy
which allows theWriteStrategy
of the database to be changed after creation - Make
Database::begin_write
block, instead of panic'ing, if there is another write already in progress - Add
Database::savepoint
andDatabase::restore_savepoint
which can be used to snapshot and rollback the database - Rename
DatabaseBuilder
toBuilder
- Performance optimizations for large databases
- Fix crash when
Database::open()
was called on a database that had been created withWriteStrategy::TwoPhase
- Change default region size on 32bit platforms to 4GiB
- Return
Err
instead of panic'ing when opening a database file with an incompatible file format version - Many optimizations to the file format, and progress toward stabilizing it
- Fix race between read & write transactions, which could cause reads to return corrupted data
- Better document the different
WriteStrategy
s - Fix panic when recovering a database that was uncleanly shutdown, which had been created with
WriteStrategy::Checksum
(which is the default) - Fix panic when using
insert_reserve()
in certain cases
- Optimize
MultimapTable
storage format to useO(k * log(n_k) + v * log(n_v / n_k))
space instead ofO(k * log(n_k + n_v) + v * log(n_k + n_v))
space, where k is the size of the stored keys, v is the size of the stored values, n_k is the number of stored keys, n_v is the number of stored values - Fix compilation errors for 32bit x86 targets
- Add support for the unit type,
()
, as a value - Return an error when attempting to open the same database file for writing in multiple locations, concurrently
- More robust handling of fsync failures
- Change
MultimapTable::range
to return an iterator of key-value-collection pairs, instead of key-value pairs - Automatically abort
WriteTransaction
on drop
- Add single phase with checksum commit strategy. This is now the default and reduces commit latency by ~2x. For more details,
see the design doc and
blog post. The previous behavior is available
via
WriteStrategy::Throughput
, and can have better performance when writing a large number of bytes per transaction.
- Fix a bug where re-opening a
Table
during aWriteTransaction
lead to stale results being read
- Fix a serious data corruption issue that caused many write operations to corrupt the database
- Make redb region size configurable
- Implement garbage collection of empty regions
- Fixes and optimizations to make the file format more efficient
- Add information log messages which can be enabled with the
logging
feature - Add support for
[u8; N]
type - Optimize storage of fixed width types. The value length is no longer stored, which reduces storage space by ~50% for
u64
, 2x foru32
, and also improves performance.
- Change
insert()
to return anOption<V>
with the previous value, instead of()
- Improved documentation
- Initial beta release