Changelog
View Sourceerlang-rocksdb 2.5.0, released on 2026/01/07
New Features
add posting list V2 format with roaring64 bitmaps for fast set operations:
- New binary format: version byte + serialized roaring bitmap + sorted keys
- Keys automatically stored in lexicographic (binary memcmp) order
- Automatic V1 to V2 migration on first merge operation
- Binary API functions:
posting_list_version/1: get format version (1 or 2)posting_list_intersection/2: AND two posting listsposting_list_union/2: OR two posting listsposting_list_difference/2: subtract posting lists (A - B)posting_list_intersection_count/2: fast cardinality via bitmapposting_list_bitmap_contains/2: fast hash-based existence checkposting_list_intersect_all/1: intersect multiple posting lists
- CRoaring library integration for efficient bitmap operations
add postings resource API for fast repeated lookups (Lucene-style naming):
- Parse once, lookup many times with ~0.1 us/lookup performance
postings_open/1: parse binary into resourcepostings_contains/2: O(log n) exact lookuppostings_bitmap_contains/2: O(1) hash lookuppostings_count/1: get key countpostings_keys/1: get sorted keyspostings_intersection/2: AND (accepts binary or resource)postings_union/2: OR (accepts binary or resource)postings_difference/2: A - B (accepts binary or resource)postings_intersection_count/2: fast cardinalitypostings_intersect_all/1: multi-way ANDpostings_to_binary/1: convert resource back to binary
add enhanced TTL support with column family operations (PR #7, thanks @nyo16):
open_with_ttl_cf/4: open database with multiple column families, each with its own TTLget_ttl/2: get current TTL for a column familyset_ttl/2: set default TTL for the databaseset_ttl/3: set TTL for a specific column familycreate_column_family_with_ttl/4: create a new column family with a specific TTL- See
guides/ttl.mdfor documentation
Bug Fixes
- fix CRoaring bswap64 build error on FreeBSD: use
<sys/endian.h>instead of<byteswap.h> - fix compaction filter for
value_emptyandalways_deleterules:- Use FilterV2 API instead of Filter for direct Decision control
- Fix 1-tuple rule parsing using strcmp
- Use
enif_is_identical()for atom comparison
Improvements
- posting list keys are now returned in sorted order (lexicographic)
- set operations use roaring bitmap for O(1) existence checks
erlang-rocksdb 2.4.1, released on 2026/01/04
Bug Fixes
- fix posting list merge operator not recognizing operands in
batch_merge:- Fixed atom comparison in
ParseOperandto useenif_is_identical()instead of direct==comparison - Atoms decoded via
enif_binary_to_termrequire proper NIF comparison functions - Added
posting_list_batch_merge_testto verify batch operations work correctly
- Fixed atom comparison in
erlang-rocksdb 2.4.0, released on 2026/01/04
New Features
add posting list merge operator for inverted indexes and tagging systems:
- New merge operator:
posting_list_merge_operator - Merge operations:
{posting_add, Key}and{posting_delete, Key} - Tombstones automatically cleaned during merge operations (no compaction filter needed)
- Binary format:
<<KeyLength:32/big, Flag:8, KeyData:KeyLength/binary>>- simple, fast to parse - Helper functions (pure Erlang):
posting_list_decode/1: decode binary to list of entriesposting_list_fold/3: fold over all entries
- Helper functions (NIF for efficiency):
posting_list_keys/1: get active keys only (deduped, tombstones filtered)posting_list_contains/2: check if key is activeposting_list_find/2: find key with tombstone statusposting_list_count/1: count active keysposting_list_to_map/1: get full state as map
- See
guides/posting_lists.mdfor documentation
- New merge operator:
add Erlang compaction filter support with two modes:
- Declarative rules mode (fast C++ execution):
{key_prefix, Binary}: delete keys with matching prefix{key_suffix, Binary}: delete keys with matching suffix{key_contains, Binary}: delete keys containing pattern{value_empty}: delete keys with empty values{value_prefix, Binary}: delete keys with matching value prefix{ttl_from_key, Offset, Length, TTLSeconds}: delete expired keys based on timestamp in key{always_delete}: delete all keys (use with caution)
- Erlang callback mode (flexible):
- Register an Erlang process as compaction filter handler
- Handler receives
{compaction_filter, BatchRef, Keys}messages - Reply with
rocksdb:compaction_filter_reply(BatchRef, Decisions) - Supports
keep,remove, and{change_value, NewBinary}decisions - Configurable batch_size and timeout with safe fallback behavior
- Declarative rules mode (fast C++ execution):
add
bottommost_level_compactionoption tocompact_range/4,5:skip: skip bottommost level compactionif_have_compaction_filter: compact bottommost only if filter is configuredforce: force compaction filter to run on all dataforce_optimized: force with optimizations
Example Usage
%% Posting list for inverted index
{ok, Db} = rocksdb:open("mydb", [
{create_if_missing, true},
{merge_operator, posting_list_merge_operator}
]).
%% Add keys to posting list
ok = rocksdb:merge(Db, <<"term:erlang">>, {posting_add, <<"doc1">>}, []),
ok = rocksdb:merge(Db, <<"term:erlang">>, {posting_add, <<"doc2">>}, []).
%% Delete a key (adds tombstone, cleaned on next read)
ok = rocksdb:merge(Db, <<"term:erlang">>, {posting_delete, <<"doc1">>}, []).
%% Read and process - tombstones automatically removed
{ok, Binary} = rocksdb:get(Db, <<"term:erlang">>, []),
Keys = rocksdb:posting_list_keys(Binary). %% [<<"doc2">>]%% Declarative rules mode - delete temporary and expired keys
{ok, Db} = rocksdb:open("mydb", [
{create_if_missing, true},
{compaction_filter, #{
rules => [
{key_prefix, <<"tmp_">>},
{key_suffix, <<"_expired">>},
{ttl_from_key, 0, 8, 3600} % 1 hour TTL from key bytes
]
}}
]).
%% Erlang callback mode - custom filter logic
%% Handler must be a PID of a running process
HandlerPid = spawn(fun filter_loop/0),
{ok, Db} = rocksdb:open("mydb", [
{compaction_filter, #{
handler => HandlerPid, % PID of the handler process
batch_size => 100,
timeout => 5000
}}
]).
%% Force compaction filter to run on all data
ok = rocksdb:compact_range(Db, undefined, undefined, [
{bottommost_level_compaction, force}
]).Bug Fixes
- fix compaction filter resource lifetime bug: keep native reference until callback completes to prevent use-after-free when handler times out or dies
- fix FreeBSD build: add system include path for malloc_np.h in RocksDB build
- replace std::atomic with mutex-protected bool for better portability
Improvements
- FreeBSD CI now uses erlang-runtime28 with LLVM 18 for full C++20 support
erlang-rocksdb 2.3.0, released on 2026/01/03
New Features
- add SST file support:
- SST File Writer:
sst_file_writer_open/2,3,sst_file_writer_put/3,sst_file_writer_merge/3,sst_file_writer_delete/2,sst_file_writer_delete_range/3,sst_file_writer_finish/1,2 - Ingest External File:
ingest_external_file/3,4for loading SST files into database - SST File Reader:
sst_file_reader_open/2,sst_file_reader_iterator/2,sst_file_reader_table_properties/1,sst_file_reader_verify_checksum/1 - Merge operator support in SST files (counter, erlang, bitset)
- SST File Writer:
- add
sst_file_manager_tracked_files/1API to get files tracked by SST File Manager - add transaction batch get operations:
- Optimistic transactions:
transaction_get_for_update/3,4,transaction_multi_get/3,4,transaction_multi_get_for_update/3,4 - Pessimistic transactions:
pessimistic_transaction_multi_get/3,4,pessimistic_transaction_multi_get_for_update/3,4
- Optimistic transactions:
- add new read options:
readahead_size: configure readahead buffer size for sequential readsasync_io: enable asynchronous I/O for iterators
Bug Fixes
- fix memory leak in CoalescingIterator error paths
- fix memory leak in TransactionIterator error paths
- fix memory leak in PessimisticTransactionIterator error paths
- add null check for enif_alloc_env in NewBatch
Improvements
- add FreeBSD CI testing using vmactions/freebsd-vm
Documentation
- add SST files guide
- update backup guide with correct function names and additional functions
- improve transactions documentation
- add multi_get to getting started guide
- fix documentation links and typos
erlang-rocksdb 2.2.0, released on 2025/12/30
New Features
- add
multi_get/2,3,4API for efficient batch key retrieval - add extended statistics support with 45+ tickers and 13+ histograms:
- Block cache statistics:
block_cache_miss,block_cache_hit,block_cache_bytes_read/write - Read/write operation statistics:
bytes_written/read,number_keys_written/read/updated - Compaction statistics:
compact_read/write_bytes,num_files_in_single_compaction - Memtable statistics:
memtable_hit/miss,write_done_by_self/other,wal_synced - Transaction statistics:
txn_overhead_mutex,txn_duplicate_key_overhead - Core operation histograms:
db_get,db_write,db_seek,flush_time,compaction_time - I/O histograms:
sst_read/write_micros,wal_file_sync_micros,bytes_per_read/write - Transaction histograms:
num_commit/filter_per_transaction
- Block cache statistics:
- add BlobDB enhancements:
get_blob_statistics/1,2: BlobDB tickers (blobbytes_read/written, blob_gc*)get_blob_histogram/2,3: BlobDB histograms (blob_db_get/put/seek_micros)get_blob_cache_properties/1: blob cache usage and capacityallow_unprepared_valueiterator option for lazy blob loadingiterator_prepare_value/1for explicit blob value loadingget_column_family_metadata/1,2with blob file information
Bug Fixes
- fix memory leak in
parse_iterator_optionson error paths - fix null pointer dereference in
Iterators()for invalid column family handles - fix null check for
enif_allocinNewBatch()preventing crash on OOM - fix double-free in
Iterators()when using shared bound slices - fix exception handling in
Iterators()to return proper error tuple - fix typo PREPOLUATE -> PREPOPULATE in blob cache atom
Documentation
- add statistics guide
- add multi_get usage to getting started guide
erlang-rocksdb 2.1.0, released on 2025/12/28
- add Pessimistic Transaction support for high-contention workloads:
open_pessimistic_transaction_db/2,3: open a TransactionDB with row-level lockingpessimistic_transaction/2,3: begin a new transactionpessimistic_transaction_put/3,4: put with lock acquisitionpessimistic_transaction_get/3,4: read without lockpessimistic_transaction_get_for_update/3,4: read with exclusive lockpessimistic_transaction_delete/2,3: delete with lockpessimistic_transaction_iterator/2,3: create transaction iteratorpessimistic_transaction_commit/1: commit transactionpessimistic_transaction_rollback/1: rollback transactionrelease_pessimistic_transaction/1: release resources
- add Pessimistic Transaction savepoint support:
pessimistic_transaction_set_savepoint/1: mark a savepointpessimistic_transaction_rollback_to_savepoint/1: rollback to last savepointpessimistic_transaction_pop_savepoint/1: discard savepoint without rollback
- add Pessimistic Transaction introspection:
pessimistic_transaction_get_id/1: get unique transaction IDpessimistic_transaction_get_waiting_txns/1: get lock contention info
- TransactionDB options: lock_timeout, deadlock_detect, max_num_locks, num_stripes
- Transaction options: set_snapshot, deadlock_detect, lock_timeout
- all pessimistic transaction operations use dirty NIFs to prevent blocking the Erlang scheduler
erlang-rocksdb 2.0.0, released on 2025/12/28
- bump to rocksdb version 10.7.5
- add Wide-Column Entity API for structured data storage:
put_entity/4,5: store key with multiple named columnsget_entity/3,4: retrieve entity columns as proplistiterator_columns/1: get columns from current iterator positiondelete_entity/3,4: convenience wrapper for delete
- add
coalescing_iterator/3for efficient multi-column-family iteration - add
auto_readahead_sizeiterator option for automatic prefetch tuning - add
auto_refresh_iterator_with_snapshotiterator option - fix CMake 3.31 compatibility
- fix bundled snappy linking on Linux (RTTI mismatch)
- fix compiler warnings
erlang-rocksdb 1.9.0, released on 2025/02/01
- bump to rocksdb version [9.10.0]((https://github.com/facebook/rocksdb/releases/tag/v9.10.0)
- bump to snappy 1.2.1
- fix write_options
- fix memory leak
- handle manual_wal_flush option
erlang-rocksdb 1.8.0, released on 2022/11/04
- bring compatibility with with Apple Mac M1 and Erlang OTP 25
- bump to rocksdb version [7.7.3]((https://github.com/facebook/rocksdb/releases/tag/v7.7.3)
- add support for BLOB databases
- add
rocksdb:transaction_rollback/1function - add
rocksdb:release_transaction/1function - fix: bind transactions OPs that require it to IO threads.
- fix transaction iterator
- fix transaction leaks: ensure the resource is always closed
- fix specs
BREAKING CHANGES
- rocksdb:transction_commit doesn't delete the transaction
rocksdb_transaction:iterators: database handle is removed from the functions parameter. Instead only use the transaction resource.
erlang-rocksdb 1.7.0, released on 2021/11/03
- bring compatibility with with Apple Mac M1 and Erlang OTP 24
- bump to rocksdb version [6.25.3]((https://github.com/facebook/rocksdb/releases/tag/v6.25.3)
- add
rocksdb:open_readonly/3function to open databases in read only mode (useful for concurrency) - add support for read options
read_tier - add support for direct IO options
use_direct_reads&use_direct_io_for_flush_and_compaction - new staistics API, exposing
rocksdb::Statisticsobject. - fix list merge operaion when empty
- add
unordered_writeand &two_write_queuesopen options - fix
transaction_getwhen Options is unset. - fix iterator behaviour
REAKING CHANGES
return an invalid iterator if the user try to use next or prev without having set the initial location of the iterator:
- calling next, and prev without having put the iterator at a specific
key or location (first, last) will now return the tuple
{error, invalid_iterator} - fix crash when moving to next key on a new iterator.
- fix behavior of Refresh. Refresh is supposed to reset completely the state of the iterator. Fix test accordingly.
- calling next, and prev without having put the iterator at a specific
key or location (first, last) will now return the tuple
transction_get/2has been removed, and is replaced bytransction_get/3with the third argument to spass the options.transaction_get/3to get using a column family is nowtransaction_get/4
erlang-rocksdb 1.6.0, released on 2020/10/16
- bump to rocksdb version 6.13.3
- improve compression support: add comprssion_opts and bottomost_compression support
- fix memory leaks: RateLimiter, Snapshots, BitsetMergeOperator, Iterators, WriteBinaryUpdayte
- fix build for OTP 23
erlang-rocksdb 1.5.1, released on 2020/02/09
- fix memory leaks in erocksdb::WriteBinaryUpdate, erokcsdb::CompactRange & erocksdb::Repair
- fix: use code:lib_dir/1 to find correct ei dir
erlang-rocksdb 1.5.0, released on 2020/01/21
- Fix lz4 and snappy lib install dir to work on systems using lib64
- Add
atomic_flushdb option - bump rocksdb to version 6.5.2
erlang-rocksdb 1.4.0, released on 2019/11/04
- fix build on OpenBSD
- bump rocksdb to version 6.4.6
erlang-rocksdb 1.3.2, released on 2019/09/13
- fix build using installed rocksdb on the system
erlang-rocksdb 1.3.1, released on 2019/08/28
- fix cache_info segfault
erlang-rocksdb 1.3.0, released on 2019/08/26
- bump rocksdb to version 6.2.2
- new: support of the windows platform (build using MSVC)
- fix: transaction log iterator
erlang-rocksdb 1.2.0, released on 2019/06/11
- bump rocksdb to version 6.1.2
- use C++11 atomics to replace pthreads and GCC specific threading and atomics
- fix: parralelism build options
- fix: miscellaneous dialyze and C warnings
erlang-rocksdb 1.1.1, released on 2019/04/12
- fix spec
erlang-rocksdb 1.1.0, released on 2019/03/26
- bump rocksdb to version 5.18.3
- add preliminary support for optimistic transactions
- make build more parallel when cores are available
- fix iterate_upper_bound type.
erlang-rocksdb 1.0.0, released on 2019/01/31
- first stable version
- miscellaneous build improvements with new build options and optimisations
- stable API (refactored in #87, #88)
erlang-rocksdb 0.26.2, released on 2019/01/24
- fix
batch_merge/3to call the right function
erlang-rocksdb 0.26.1, released on 2018/12/11
- fix build on freebsd
- support build with the Thread Building Blocks library (TBB)
erlang-rocksdb 0.26.0, released on 2018/12/05
- allows customized builds
- fix compilations warnings
BREAKING CHANGES
- build is now using cmake instead of autotools
- corruption errors return
{error, {corruption, Reaason :: string()}}inst#ead ofcorruption.
erlang-rocksdb 0.25.0, released on 2018/11/21
- bump to rocksdb 0.17.2
- bump snappy to 1.1.7
- bump lz4 to 1.8.3
- add
rocksdb:open_with_ttl/2. - add
no_slowdownandlow_priwrite options - add
manual_wal_flushdb option - add support for WriteBuffer (#64)
- add
sst_file_manger()resource to provide SSTFileManager support and manage disk space. (#74) - fix
aproximate_sizes_testandapproximate_memtable_stats_test
BREAKING CHANGES
- handle flush options in rocksdb:flush/{2, 3}
With this change
rocksdb:flush/1has been removed while second parameter ofrocksdb:flush/2are nowFlushOptions::flush_options(). Userocksdb:flush/3to flush a column family - change signature of
rocksdb:get_approximate_memtable_stats/{2,3}torocksdb:get_approximate_memtable_stats/4.
erlang-rocksdb 0.24.0, released on 2018/11/06
- add
rocksdb:get_approximate_sizes/{3,4}: amroximate the size of a range of keys - add
rocksdb:get_approximate_memtable_stats/{2,3}: aproximate the size and the number of keys in a memtable - add
rocksdb:compact_range/{4,5}: Compact the underlying storage for a key
erlang-rocksdb 0.23.3, released on 2018/10/31
- fix possible memory leaks when trying to open a bad CF resource.
erlang-rocksdb 0.23.2, released on 2018/10/30
- fix memory leaks
erlang-rocksdb 0.23.1, released on 2018/10/08
- fix bitset merge operator under load
erlang-rocksdb 0.23.0, released on 2018/10/05
- add bytewise and reverse bytewise comparators
- add iterate_upper_bound, iterate_lower_bound_options and prefix_same_as_start to iterator options
- improve: prevernt garbage collection in batch
- fix bitset merge operator, handle exceptions
- fix counter merge operator, handle exceptions
erlang-rocksdb 0.22.0, released on 2018/09/25
- fix NIF memory leak in
erocksdb::Get - add counter_merge_operator
erlang-rocksdb 0.21.0, released on 2018/09/16
- bump to rocksdb 5.15.10
- add: erlang merge operator
- add: erlang bitset merge operator
- add: rocksdb:batch_data_size/1
- add: prefix_transform option
erlang-rocksdb 0.20.0, released on 2018/08/03
- bump to rocksdb 5.14.2
erlang-rocksdb 0.19.0, released on 2018/07/04
- bump to rocksdb 5.13.4
- add
rocksdb:set_strict_capacity_limit/2for cache - add
optimize_filters_for_hitsdatabase option - add
new_table_reader_for_compaction_inputsdatabase option - add
max_subcompactionsdatabase option
erlang-rocksdb 0.18.0, released on 2018/05/03
- bump to rocksdb 5.12.4
erlang-rocksdb 0.17.0, released on 2018/03/25
- bump ro rocksdb 5.11.3
- improve build to make it faster, only use makefiles
- optimise single operations Get/Put/Delete/DeleteSing: don't call batch
- optimise write: use batch and do less operations in the the nif: make scheduler happy
- fix leak in batch
- breaking change: rename
close_batch/1inrelase_batch/1
erlang-rocksdb 0.16.0, released on 2018/03/13
- add single_delete operation (to key/value and batch api)
- add iterator_refresh function
- add support for level_compaction_dynamic_level_bytes for column family options
- add rate_limiter support
- many optimisations to the source code and build
- bump to rocksdb 5.10.4
erlang-rocksdb 0.15.0, released on 2018/02/10
- add support for lz4 compression
- add new database option
max_background_jobs - fix: potential memory leak
erlang-rocksdb 0.14.0, released on 2018/01/31
- bump to rocksdb 5.7.5
- bump to snappy 1.1.4
erlang-rocksdb 0.13.1, released on 2017/09/07
- fix: remove memory leaks spotted with valgrind
erlang-rocksdb 0.13.0, released on 2017/09/06
add new cache api
- new_lru_cache/1,
- new_clock_cache/1,
- get_usage/1,
- get_pinned_usage/1,
- set_capacity/2,
- get_capacity/1
- release_cache/1
add new env api
- default_env/0,
- mem_env/0,
- set_env_background_threads/{2, 3},
- destroy_env/1
remove default shared block cache in private env to reduce the vm memory usage.
erlang-rocksdb 0.12.0, released on 2017/09/05
- add get_block_cache_usage/1
- add block_cache_capacity/{1, 0}
- add new db option {env, Env} where Env can be
defaultormemenv. - add new db option {db_write_buffer_size, INT}
- fix: cache usahe, correctly reuse the cache among instances
- fix: options parsing, reuse code where we can and correctly handle db optinos
BREAKING CHANGE
The following cache functions has been removed:
- new_lru_cache/1,
- new_clock_cache/1,
- get_usage/1,
- get_pinned_usage/1,
- set_capacity/2,
- get_capacity/1
instead use the new block_cache function to change the size of the shared cache. A new api to setup different caches will come in the next version.
The following functions has been removed:
- default_env/0,
- mem_env/0,
- set_background_threads/2, set_background_threads/3,
- destroy_env/1]).
For now it's not possible to create a shared environment. also the {in_memory, true} setting has been removed.
To set a memory environement use the option {env, memenv}.
erlang-rocksdb 0.11.0, released on 2017/07/29
- add rocksdb:get_snapshot_sequence/1
erlang-rocksdb 0.10.0, released on 2017/07/28
- bump to rocksdb 5.7.2
- add: rocksdb:delete_range/{4,5}
- add: support for the backup api
- add: rocksdb:destroy_column_family/1
- proper fix to handle an iterator with column family issue
erlang-rocksdb 0.9.1, released on 2017/07/26
- fix iterator with column familly issue
- fix mutex usage igit push --tagsn the db object
erlang-rocksdb 0.9.0, released on 2017/05/31
- bump to rocksdb 5.4.5
- remove
disable_data_syncdb option, optimisations removed in rocksdb - remove
timeout_hint_usdb option, was useless since 2 years - remove
verify_checksums_in_compactiondb option. it's always done. - remove
skip_table_builder_flushdb option - remove
allow_os_bufferdb option - add
{seek_for_prev, Prev}db option - allows to fold a column familly
erlang-rocksdb 0.8.2, released on 2017/05/17
- fix: fix default_env/0 & mem_env/0 spec
erlang-rocksdb 0.8.1, released on 2017/05/17
- fix: use an uint64 to set the capacity of LRU or CLOCK caches.
erlang-rocksdb 0.8.0, released on 2017/05/17
- replace custom pool by dirty-nif calls
- allows a cache to be shared between databases (option
block_cachefrom the block options) - allows an environment to be set and shared across databases (option
env) - add support of batch operations, allows you to incrementatly update it in memory
- add support for transaction log operations (iteration and replication)