Project: YugabyteDB (App Definition and Development / Database)
File: HISTORY.md

Change default of BlockBasedTableOptions.format_version to 2. It means default DB created by 4.6 or up cannot be opened by RocksDB version 3.9 or earlier. Added strictcapacitylimit option to NewLRUCache. If the flag is set to true, insert to cache will fail if no enough capacity can be free. Signiture of Cache::Insert() is updated accordingly. Add CompactionPri::kMinOverlappingRatio, a compaction picking mode friendly to write amplification. Deprecate Iterator::IsKeyPinned() and replace it with Iterator::GetProperty() with prop_name="rocksdb.iterator.is.key.pinned" Add a new perf context level between kEnableCount and kEnableTime. Level 2 now does not include timers for mutexes. Statistics of mutex operation durations will not be measured by default. If you want to have them enabled, you need to set Statistics::statslevel to kAll. DBOptions::deletescheduler and NewDeleteScheduler() are removed, please use DBOptions::sstfile_manager and NewSstFileManager() instead ldb tool now supports operations to non-default column families. Add kPersistedTier to ReadTier. This option allows Get and MultiGet to read only the persited data and skip mem-tables if writes were done with disableWAL = true. Add DBOptions::sstfilemanager. Use NewSstFileManager() in include/rocksdb/sstfilemanager.h to create a SstFileManager that can be used to track the total size of SST files and control the SST files deletion rate. Change names in CompactionPri and add a new one. Deprecate options.softratelimit and add options.softpendingcompactionbyteslimit. If options.maxwritebuffer_number > 3, writes will be slowed down when writing to the last write buffer to delay a full stop. Introduce CompactionJobInfo::compaction_reason, this field include the reason to trigger the compaction. After slow down is triggered, if estimated pending compaction bytes keep increasing, slowdown more. Increase default options.delayedwriterate to 2MB/s. Added a new parameter --path to ldb tool. --path accepts the name of either MANIFEST, SST or a WAL file. Either --db or --path can be used when calling ldb. CompactionFilter has new member function called IgnoreSnapshots which allows CompactionFilter to be called even if there are snapshots later than the key. RocksDB will now persist options under the same directory as the RocksDB database on successful DB::Open, CreateColumnFamily, DropColumnFamily, and SetOptions. Introduce LoadLatestOptions() in rocksdb/utilities/options_util.h. This function can construct the latest DBOptions / ColumnFamilyOptions used by the specified RocksDB intance. Introduce CheckOptionsCompatibility() in rocksdb/utilities/options_util.h. This function checks whether the input set of options is able to open the specified DB successfully. When options.dbwritebuffer_size triggers, only the column family with the largest column family size will be flushed, not all the column families. Introduce CreateLoggerFromOptions(), this function create a Logger for provided DBOptions. Add GetAggregatedIntProperty(), which returns the sum of the GetIntProperty of all the column families. Add MemoryUtil in rocksdb/utilities/memory.h. It currently offers a way to get the memory usage by type from a list rocksdb instances. CompactionFilter::Context includes information of Column Family ID The need-compaction hint given by TablePropertiesCollector::NeedCompact() will be persistent and recoverable after DB recovery. This introduces a breaking format change. If you use this experimental feature, including NewCompactOnDeletionCollectorFactory() in the new version, you may not be able to directly downgrade the DB back to version 4.0 or lower. TablePropertiesCollectorFactory::CreateTablePropertiesCollector() now takes an option Context, containing the information of column family ID for the file being written. Remove DefaultCompactionFilterFactory. Added single delete operation as a more efficient way to delete keys that have not been overwritten. Added experimental AddFile() to DB interface that allow users to add files created by SstFileWriter into an empty Database, see include/rocksdb/sstfilewriter.h and DB::AddFile() for more info. Added support for opening SST files with

suffix which enables opening LevelDB databases. CompactionFilter now supports filtering of merge operands and merge results. Added SingleDelete() to the DB interface. Added AddFile() to DB interface. Added SstFileWriter class. CompactionFilter has a new method FilterMergeOperand() that RocksDB applies to every merge operand during compaction to decide whether to filter the operand. We removed CompactionFilterV2 interfaces from include/rocksdb/compaction_filter.h. The functionality was deprecated already in version 3.13. Added support for transactions. See include/rocksdb/utilities/transaction.h for more info. DB::GetProperty() now accepts "rocksdb.aggregated-table-properties" and "rocksdb.aggregated-table-properties-at-levelN", in which case it returns aggregated table properties of the target column family, or the aggregated table properties of the specified level N if the "at-level" version is used. Add compression option kZSTDNotFinalCompression for people to experiment ZSTD although its format is not finalized. We removed the need for LATEST_BACKUP file in BackupEngine. We still keep writing it when we create new backups (because of backward compatibility), but we don't read it anymore. Removed class Env::RandomRWFile and Env::NewRandomRWFile(). Renamed DBOptions.numsubcompactions to DBOptions.maxsubcompactions to make the name better match the actual functionality of the option. Added Equal() method to the Comparator interface that can optionally be overwritten in cases where equality comparisons can be done more efficiently than three-way comparisons. Previous 'experimental' OptimisticTransaction class has been replaced by Transaction class. RollbackToSavePoint() in WriteBatch/WriteBatchWithIndex Add NewCompactOnDeletionCollectorFactory() in utilities/tablepropertiescollectors, which allows rocksdb to mark a SST file as need-compaction when it observes at least D deletion entries in any N consecutive entries in that SST file. Note that this feature depends on an experimental NeedCompact() API the result of this API will not persist after DB restart. Add DBOptions::deletescheduler. Use NewDeleteScheduler() in include/rocksdb/deletescheduler.h to create a DeleteScheduler that can be shared among multiple RocksDB instances to control the file deletion rate of SST files that exist in the first db_path. Deprecated WriteOptions::timeouthintus. We no longer support write timeout. If you really need this option, talk to us and we might consider returning it. Deprecated purgeredundantkvswhileflush option. Removed BackupEngine::NewBackupEngine() and NewReadOnlyBackupEngine() that were deprecated in RocksDB 3.8. Please use BackupEngine::Open() instead. Deprecated Compaction Filter V2. We are not aware of any existing use-cases. If you use this filter, your compile will break with RocksDB 3.13. Please let us know if you use it and we'll put it back in RocksDB 3.14. Env::FileExists now returns a Status instead of a boolean Add statistics::getHistogramString() to print detailed distribution of a histogram metric. Add DBOptions::skipstatsupdateondb_open. When it is on, DB::Open() will run faster as it skips the random reads required for loading necessary stats from SST files to optimize compaction. Added experimental support for optimistic transactions. See include/rocksdb/utilities/optimistic_transaction.h for more info. Added a new way to report QPS from dbbench (check out --reportfile and --reportintervalseconds) Added a cache for individual rows. See DBOptions::row_cache for more info. Several new features on EventListener (see include/rocksdb/listener.h): OnCompationCompleted() now returns per-compaciton job statistics, defined in include/rocksdb/compactionjobstats.h. Added OnTableFileCreated() and OnTableFileDeleted(). Add compactionoptionsuniversal.enabletrivialmove to true, to allow trivial move while performing universal compaction. Trivial move will happen only when all the input files are non overlapping. EventListener::OnFlushCompleted() now passes FlushJobInfo instead of a list of parameters. DB::GetDbIdentity() is now a const function. If this function is overridden in your application, be sure to also make GetDbIdentity() const to avoid compile error. Move listeners from ColumnFamilyOptions to DBOptions. Add maxwritebuffernumberto_maintain option DB::CompactRange()'s parameter reducelevel is changed to changelevel, to allow users to move levels to lower levels if

It can be used to migrate a DB from options.levelcompactiondynamiclevelbytes=false to options.levelcompactiondynamiclevelbytes.true. Change default value for options.compactionfilterfactory and options.compactionfilterfactory_v2 to nullptr instead of DefaultCompactionFilterFactory and DefaultCompactionFilterFactoryV2. If CancelAllBackgroundWork is called without doing a flush after doing loads with WAL disabled, the changes which haven't been flushed before the call to CancelAllBackgroundWork will be lost. WBWIIterator::Entry() now returns WriteEntry instead of `const WriteEntry&` options.hardratelimit is deprecated. When options.softratelimit or options.level0slowdownwritestrigger is triggered, the way to slow down writes is changed to: write rate to DB is limited to to options.delayedwrite_rate. DB::GetApproximateSizes() adds a parameter to allow the estimation to include data in mem table, with default to be not to include. It is now only supported in skip list mem table. DB::CompactRange() now accept CompactRangeOptions instead of multiple paramters. CompactRangeOptions is defined in include/rocksdb/options.h. CompactRange() will now skip bottommost level compaction for level based compaction if there is no compaction filter, bottommostlevelcompaction is introduced in CompactRangeOptions to control when it's possbile to skip bottommost level compaction. This mean that if you want the compaction to produce a single file you need to set bottommostlevelcompaction to BottommostLevelCompaction::kForce. Add Cache.GetPinnedUsage() to get the size of memory occupied by entries that are in use by the system. DB:Open() will fail if the compression specified in Options is not linked with the binary. If you see this failure, recompile RocksDB with compression libraries present on your system. Also, previously our default compression was snappy. This behavior is now changed. Now, the default compression is snappy only if it's available on the system. If it isn't we change the default to kNoCompression. We changed how we account for memory used in block cache. Previously, we only counted the sum of block sizes currently present in block cache. Now, we count the actual memory usage of the blocks. For example, a block of size 4.5KB will use 8KB memory with jemalloc. This might decrease your memory usage and possibly decrease performance. Increase block cache size if you see this happening after an upgrade. Add BackupEngineImpl.options.maxbackground_operations to specify the maximum number of operations that may be performed in parallel. Add support for parallelized backup and restore. Add DB::SyncWAL() that does a WAL sync without blocking writers. Added a new API Cache::SetCapacity(size_t capacity) to dynamically change the maximum configured capacity of the cache. If the new capacity is less than the existing cache usage, the implementation will try to lower the usage by evicting the necessary number of elements following a strict LRU policy. Added an experimental API for handling flashcache devices (blacklists background threads from caching their reads) -- NewFlashcacheAwareEnv If universal compaction is used and options.numlevels > 1, compact files are tried to be stored in none-L0 with smaller files based on options.targetfilesizebase. The limitation of DB size when using universal compaction is greatly mitigated by using more levels. You can set numlevels = 1 to make universal compaction behave as before. If you set numlevels > 1 and want to roll back to a previous version, you need to compact all files to a big file in level 0 (by setting targetfilesizebase to be large and CompactRange(<cfhandle>, nullptr, nullptr, true, 0) and reopen the DB with the same version to rewrite the manifest, and then you can open it using previous

More information about rocksdb background threads are available in Env::GetThreadList(), including the number of bytes read / written by a compaction job, mem-table size and current number of bytes written by a flush job and many more. Check include/rocksdb/thread_status.h for more detail. TablePropertiesCollector::AddUserKey() is added to replace TablePropertiesCollector::Add(). AddUserKey() exposes key type, sequence number and file size up to now to users. DBOptions::bytespersync used to apply to both WAL and table files. As of 3.11 it applies only to table files. If you want to use this option to sync WAL in the background, please use walbytesper_sync GetThreadStatus() is now able to report detailed thread status, including: Thread Operation including flush and compaction. The stage of the current thread operation. The elapsed time in micros since the current thread operation started. More information can be found in include/rocksdb/threadstatus.h. In addition, when running dbbench with --threadstatusperinterval, dbbench will also report thread status periodically. Changed the LRU caching algorithm so that referenced blocks (by iterators) are never evicted. This change made parameter removeScanCountLimit obsolete. Because of that NewLRUCache doesn't take three arguments anymore. tablecacheremovescanlimit option is also removed By default we now optimize the compilation for the compilation platform (using -march=native). If you want to build portable binary, use 'PORTABLE=1' before the make command. We now allow level-compaction to place files in different paths by specifying them in dbpaths along with the targetsize. Lower numbered levels will be placed earlier in the db_paths and higher numbered levels will be placed later in the db_paths vector. Potentially big performance improvements if you're using RocksDB with lots of column families (100-1000) Added BlockBasedTableOptions.format_version option, which allows user to specify which version of block based table he wants. As a general guidline, newer versions have more features, but might not be readable by older versions of RocksDB. Added new block based table format (version 2), which you can enable by setting BlockBasedTableOptions.format_version = 2. This format changes how we encode size information in compressed blocks and should help with memory allocations if you're using Zlib or BZip2 compressions. MemEnv (env that stores data in memory) is now available in default library build. You can create it by calling NewMemEnv(). Add SliceTransform.SameResultWhenAppended() to help users determine it is safe to apply prefix bloom/hash. Block based table now makes use of prefix bloom filter if it is a full fulter. Block based table remembers whether a whole key or prefix based bloom filter is supported in SST files. Do a sanity check when reading the file with users' configuration. Fixed a bug in ReadOnlyBackupEngine that deleted corrupted backups in some cases, even though the engine was ReadOnly options.levelcompactiondynamiclevelbytes, a feature to allow RocksDB to pick dynamic base of bytes for levels. With this feature turned on, we will automatically adjust max bytes for each level. The goal of this feature is to have lower bound on size amplification. For more details, see comments in options.h. Added an abstract base class WriteBatchBase for write batches Fixed a bug where we start deleting files of a dropped column families even if there are still live references to it Deprecated skiplogerroronrecovery and tablecacheremovescancount_limit options. Logger method logv with log level parameter is now virtual Added compression per level API. MemEnv is now available in RocksJava via RocksMemEnv class. lz4 compression is now included in rocksjava static library when running `make

Overflowing a size_t when setting rocksdb options now throws an IllegalArgumentException, which removes the necessity for a developer to catch these Exceptions explicitly. Add rocksdb::GetThreadList(), which in the future will return the current status of all rocksdb-related threads. We will have more code instruments in the following RocksDB releases. Change convert function in rocksdb/utilities/convenience.h to return Status instead of boolean. Also add support for nested options in convert function New API to create a checkpoint added. Given a directory name, creates a new database which is an image of the existing database. New API LinkFile added to Env. If you implement your own Env class, an implementation of the API LinkFile will have to be provided. MemTableRep takes MemTableAllocator instead of Arena RocksDBLite library now becomes smaller and will be compiled with -fno-exceptions flag. BackupEngine::NewBackupEngine() was deprecated; please use BackupEngine::Open() from now on. BackupableDB/RestoreBackupableDB have new GarbageCollect() methods, which will clean up files from corrupt and obsolete backups. BackupableDB/RestoreBackupableDB have new GetCorruptedBackups() methods which list corrupt backups. Bunch of code cleanup, some extra warnings turned on (-Wshadow, -Wshorten-64-to-32, -Wnon-virtual-dtor) CompactFiles and EventListener, although they are still in experimental state Full ColumnFamily support in RocksJava. Introduce SetOptions() API to allow adjusting a subset of options dynamically online Introduce 4 new convenient functions for converting Options from string: GetColumnFamilyOptionsFromMap(), GetColumnFamilyOptionsFromString(), GetDBOptionsFromMap(), GetDBOptionsFromString() Remove WriteBatchWithIndex.Delete() overloads using SliceParts When opening a DB, if options.maxbackgroundcompactions is larger than the existing low pri pool of options.env, it will enlarge it. Similarly, options.maxbackgroundflushes is larger than the existing high pri pool of options.env, it will enlarge it. If you're using RocksDB on ARM platforms and you're using default bloom filter, there is a disk format change you need to be aware of. There are three steps you need to do when you convert to new release: 1. turn off filter policy, 2. compact the whole database, 3. turn on filter policy We have refactored our system of stalling writes. Any stall-related statistics' meanings are changed. Instead of per-write stall counts, we now count stalls per-epoch, where epochs are periods between flushes and compactions. You'll find more information in our Tuning Perf Guide once we release RocksDB 3.6. When disableDataSync=true, we no longer sync the MANIFEST file. Add identityasfirst_hash property to CuckooTable. SST file needs to be rebuilt to be opened by reader properly. Change targetfilesizebase type to uint64t from int. Remove allowthreadlocal. This feature was proved to be stable, so we are turning it always-on. Add include/utilities/writebatchwith_index.h, providing a utilitiy class to query data out of WriteBatch when building it. Move BlockBasedTable related options to BlockBasedTableOptions from Options. Change corresponding JNI interface. Options affected include: noblockcache, blockcache, blockcachecompressed, blocksize, blocksizedeviation, blockrestartinterval, filterpolicy, wholekeyfiltering. filterpolicy is changed to shared_ptr from a raw pointer. Remove deprecated options: disableseekcompaction and dbstatslog_interval OptimizeForPointLookup() takes one parameter for block cache size. It now builds hash index, bloom filter, and block cache. The Prefix Extractor used with V2 compaction filters is now passed user key to SliceTransform::Transform instead of unparsed RocksDB key. Support Multiple DB paths in universal style compactions Add feature of storing plain table index and bloom filter in SST file. CompactRange() will never output compacted files to level 0. This used to be the case when all the compaction input files were at level 0. Added iterateupperbound to define the extent upto which the forward iterator will return entries. This will prevent iterating over delete markers and overwritten entries for edge cases where you want to break out the iterator

This may improve performance in case there are a large number of delete markers or overwritten entries. DBOptions.db_paths now is a vector of a DBPath structure which indicates both of path and target size NewPlainTableFactory instead of bunch of parameters now accepts PlainTableOptions, which is defined in include/rocksdb/table.h Moved include/utilities/.h to include/rocksdb/utilities/*.h Statistics APIs now take uint32_t as type instead of Tickers. Also make two access functions getTickerCount and histogramData const Add DB property rocksdb.estimate-num-keys, estimated number of live keys in DB. Add DB::GetIntProperty(), which returns DB properties that are integer as uint64_t. The Prefix Extractor used with V2 compaction filters is now passed user key to SliceTransform::Transform instead of unparsed RocksDB key. Added JSON API prototype. HashLinklist reduces performance outlier caused by skewed bucket by switching data in the bucket from linked list to skip list. Add parameter thresholduseskiplist in NewHashLinkListRepFactory(). RocksDB is now able to reclaim storage space more effectively during the compaction process. This is done by compensating the size of each deletion entry by the 2X average value size, which makes compaction to be triggerred by deletion entries more easily. Add TimeOut API to write. Now WriteOptions have a variable called timeouthintus. With timeouthintus set to non-zero, any write associated with this timeouthintus may be aborted when it runs longer than the specified timeouthintus, and it is guaranteed that any write completes earlier than the specified time-out will not be aborted due to the time-out condition. Add a rate_limiter option, which controls total throughput of flush and compaction. The throughput is specified in bytes/sec. Flush always has precedence over compaction when available bandwidth is constrained. Removed NewTotalOrderPlainTableFactory because it is not used and implemented semantically incorrect. We removed seek compaction as a concept from RocksDB because: 1) It makes more sense for spinning disk workloads, while RocksDB is primarily designed for flash and memory, 2) It added some complexity to the important code-paths, 3) None of our internal customers were really using it. Because of that, Options::disableseekcompaction is now obsolete. It is still a parameter in Options, so it does not break the build, but it does not have any effect. We plan to completely remove it at some point, so we ask users to please remove this option from your code base. Add two paramters to NewHashLinkListRepFactory() for logging on too many entries in a hash bucket when flushing. Added new option BlockBasedTableOptions::hashindexallow_collision. When enabled, prefix hash index for block-based table will not store prefix and allow hash collision, reducing memory consumption. PlainTable now supports a new key encoding: for keys of the same prefix, the prefix is only written once. It can be enabled through encoding_type paramter of NewPlainTableFactory() Add AdaptiveTableFactory, which is used to convert from a DB of PlainTable to BlockBasedTabe, or vise versa. It can be created using NewAdaptiveTableFactory() Tailing Iterator re-implemeted with ForwardIterator + Cascading Search Hint , see ~20% throughput improvement. Replaced ColumnFamilyOptions::tablepropertiescollectors with ColumnFamilyOptions::tablepropertiescollector_factories Hash index for block-based table will be materialized and reconstructed more efficiently. Previously hash index is constructed by scanning the whole table during every table open. FIFO compaction style Added _LEVEL to all InfoLogLevel enums Deprecated ReadOptions.prefix and ReadOptions.prefixseek. Seek() defaults to prefix-based seek when Options.prefixextractor is supplied. More detail is documented in https://github.com/facebook/rocksdb/wiki/Prefix-Seek-API-Changes MemTableRepFactory::CreateMemTableRep() takes info logger as an extra

Column family support Added an option to use different checksum functions in BlockBasedTableOptions Added ApplyToAllCacheEntries() function to Cache Removed arena.h from public header files. By default, checksums are verified on every read from database Change default value of several options, including: paranoidchecks=true, maxopenfiles=5000, level0slowdownwritestrigger=20, level0stopwritestrigger=24, disableseekcompaction=true, maxbackgroundflushes=1 and allowmmap_writes=false Added ismanualcompaction to CompactionFilter::Context Added "virtual void WaitForJoin()" in class Env. Default operation is no-op. Removed BackupEngine::DeleteBackupsNewerThan() function Added new option -- verifychecksumsin_compaction Changed Options.prefixextractor from raw pointer to sharedptr (take ownership) Changed HashSkipListRepFactory and HashLinkListRepFactory constructor to not take SliceTransform object (use Options.prefix_extractor implicitly) Added Env::GetThreadPoolQueueLen(), which returns the waiting queue length of thread pools Added a command "checkconsistency" in ldb tool, which checks if file system state matches DB state (file existence and file sizes) Separate options related to block based table to a new struct BlockBasedTableOptions. WriteBatch has a new function Count() to return total size in the batch, and Data() now returns a reference instead of a copy Add more counters to perf context. Supports several more DB properties: compaction-pending, background-errors and cur-size-active-mem-table. If we find one truncated record at the end of the MANIFEST or WAL files, we will ignore it. We assume that writers of these records were interrupted and that we can safely ignore it. A new SST format "PlainTable" is added, which is optimized for memory-only workloads. It can be created through NewPlainTableFactory() or NewTotalOrderPlainTableFactory(). A new mem table implementation hash linked list optimizing for the case that there are only few keys for each prefix, which can be created through NewHashLinkListRepFactory(). Merge operator supports a new function PartialMergeMulti() to allow users to do partial merges against multiple operands. Now compaction filter has a V2 interface. It buffers the kv-pairs sharing the same key prefix, process them in batches, and return the batched results back to DB. The new interface uses a new structure CompactionFilterContext for the same purpose as CompactionFilter::Context in V1. Geo-spatial support for locations and radial-search. Renamed `StackableDB::GetRawDB()` to `StackableDB::GetBaseDB()`. Renamed `WriteBatch::Data()` `const std::string& Data() const`. Renamed class `TableStats` to `TableProperties`. Deleted class `PrefixHashRepFactory`. Please use `NewHashSkipListRepFactory()` instead. Supported multi-threaded `EnableFileDeletions()` and `DisableFileDeletions()`. Added `DB::GetOptions()`. Added `DB::GetDbIdentity()`. Added Implemented , a special type of iterator that doesn't create a snapshot (can be used to read newly inserted data) and is optimized for doing sequential reads. Added property block for table, which allows (1) a table to store its metadata and (2) end user to collect and store properties they are interested in. Enabled caching index and filter block in block cache (turned off by default). Supported error report when doing manual compaction. Supported additional Linux platform flavors and Mac OS. Put with `SliceParts` - Variant of `Put()` that gathers output like `writev(2)` Bug fixes and code refactor for compatibility with upcoming Column Family feature. Huge benchmark performance improvements by multiple efforts. For example, increase in readonly QPS from about 530k in 2.6 release to 1.1 million in 2.7 [1] Speeding up a way RocksDB deleted obsolete files - no longer listing the whole directory under a lock -- decrease in p99 Use raw pointer instead of shared pointer for statistics: -- huge increase in performance -- shared pointers are slow Optimized locking for `Get()` -- -- 1.5x QPS increase for some workloads Cache speedup - Implemented autovector, which allocates first N elements on stack. Most of vectors in RocksDB are small. Also, we never want to allocate heap objects while holding a mutex. -- Lots of efforts to move malloc, memcpy and IO outside of locks