11.8.0 (07/28/2026)
Public API Changes
- Add callback-based asynchronous read APIs,
DB::GetAsync()andDB::MultiGetAsync(). The idea is that when IO is required, RocksDB can suspend its internal coroutine read path, allowing the read executor thread to do other work. When the IO is complete, RocksDB invokes the user callback. This requires filesystem support for full performance benefits. A new filesystem APIFSRandomAccessFile::SubmitReadAsync()is introduced for this. UnlikeReadAsync, the filesystem is responsible for eventually calling the callback.FileSystem::GetReadExecutor()returns the IO executor whose EventBases run coroutine read processing. In the Posix filesystem, an IO-uring based event loop is used to complete the IO. - Added
FlushOptions::listener_wait(defaultfalse). When set together withFlushOptions::wait == true,DB::Flush()will not return until the registeredEventListener::OnFlushCompletedcallbacks for the flushed memtables have finished running. By default (false),Flush(wait=true)may return as soon as the flush result is committed, which can be before (or while) theOnFlushCompletedcallbacks execute on the background flush thread. Also added the corresponding C APIrocksdb_flushoptions_set_listener_wait()/rocksdb_flushoptions_get_listener_wait(). - Deprecated
PinnableWideColumns::serialized_size()in favor of the newPinnableWideColumns::payload_size(), which returns the total size of the columns' names and values (for a plain value this equals the value size). Relatedly, wide-column read accounting changed subtly: read statistics for entities (BYTES_READ,BYTES_PER_READ, and the per-key byte counts forGetEntity/MultiGetEntity) and theReadOptions::value_size_soft_limitthreshold now measure entities by this payload size instead of the serialized entity size. This drops serialization framing bytes from those measurements (so reported/limited sizes for entity reads are slightly smaller than before) and makes plain-value and wide-column accounting consistent.
Behavior Changes
ReadOptions::value_size_soft_limitnow also bounds the blob values resolved from pre-flush blob direct write references duringMultiGet/MultiGetEntity(previously these were resolved after the limit check and read without bound). Enforcement is "always make progress": at least one key is read even if its value alone exceeds the limit, and only once the returned size exceeds the limit do subsequent keys getStatus::Aborted-- so a caller retrying the aborted keys cannot loop forever on a single value that by itself exceeds the limit.
Performance Improvements
- Reduced copying when reading wide-column entities that have blob-referenced columns, whether stored in separate blob files or embedded (same-file) as blob records in the same SST. On the point-lookup (
GetEntity/MultiGetEntity) and blob-backed memtable/direct-write read paths, resolving these columns no longer re-serializes the whole entity into a fresh buffer: inline columns are referenced in place in the pinned entity and each resolved blob value is referenced in place from its fetched buffer. This is enabled by an internal change toPinnableWideColumnsthat lets its columns reference multiple backing buffers.