mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-26 07:30:54 +00:00
ad135f3ffd
Summary: auto_prefix_mode is designed to use prefix filtering in a particular "safe" set of cases where the upper bound and the seek key have different prefixes: where the upper bound is the "same length immediate successor". These conditions are not sufficient to guarantee the same iteration results as total_order_seek if the DB contains "short" keys, less than the "full" (maximum) prefix length. We are not simply disabling the optimization in these successor cases because it is likely that users are essentially getting what they want out of existing usage. Especially if users are constructing successor bounds with the intention of doing a prefix-bounded seek, the existing behavior is more expected than the total_order_seek behavior. Consequently, for now we reconcile the bad specification of behavior by documenting the existing mismatch with total_order_seek. A closely related issue affects hypothetical comparators like ReverseBytewiseComparator: if they "correctly" implement IsSameLengthImmediateSuccessor, auto_prefix_mode could omit more entries (other than "short" keys noted above). Luckily, the built-in ReverseBytewiseComparator has an "incorrect" implementation of IsSameLengthImmediateSuccessor that effectively prevents prefix optimization and, thus, the bug. This is now documented as a new constraint on IsSameLengthImmediateSuccessor, and the implementation tweaked to be simply "safe" rather than "incorrect". This change also includes unit test updates to demonstrate the above issues. (Test was cleaned up for readability and simplicity.) Intended follow-up: * Tweak documented axioms for prefix_extractor (more details then) * Consider some sort of fix for this case. I don't know what that would look like without breaking the performance of existing code. Perhaps if all keys in an SST file have prefixes that are "full length," we can track that fact and use it to allow optimization with the "same length immediate successor", but that would only apply to new files. * Consider a better system of specifying prefix bounds Pull Request resolved: https://github.com/facebook/rocksdb/pull/10144 Test Plan: test updates included Reviewed By: siying Differential Revision: D37052710 Pulled By: pdillinger fbshipit-source-id: 5f63b7d65f3f214e4b143e0f9aa1749527c587db |
||
---|---|---|
.. | ||
aligned_buffer.h | ||
async_file_reader.cc | ||
async_file_reader.h | ||
autovector.h | ||
autovector_test.cc | ||
bloom_impl.h | ||
bloom_test.cc | ||
build_version.cc.in | ||
cast_util.h | ||
channel.h | ||
cleanable.cc | ||
coding.cc | ||
coding.h | ||
coding_lean.h | ||
coding_test.cc | ||
compaction_job_stats_impl.cc | ||
comparator.cc | ||
compression.cc | ||
compression.h | ||
compression_context_cache.cc | ||
compression_context_cache.h | ||
concurrent_task_limiter_impl.cc | ||
concurrent_task_limiter_impl.h | ||
core_local.h | ||
coro_utils.h | ||
crc32c.cc | ||
crc32c.h | ||
crc32c_arm64.cc | ||
crc32c_arm64.h | ||
crc32c_ppc.c | ||
crc32c_ppc.h | ||
crc32c_ppc_asm.S | ||
crc32c_ppc_constants.h | ||
crc32c_test.cc | ||
defer.h | ||
defer_test.cc | ||
duplicate_detector.h | ||
dynamic_bloom.cc | ||
dynamic_bloom.h | ||
dynamic_bloom_test.cc | ||
fastrange.h | ||
file_checksum_helper.cc | ||
file_checksum_helper.h | ||
file_reader_writer_test.cc | ||
filelock_test.cc | ||
filter_bench.cc | ||
gflags_compat.h | ||
hash.cc | ||
hash.h | ||
hash128.h | ||
hash_containers.h | ||
hash_map.h | ||
hash_test.cc | ||
heap.h | ||
heap_test.cc | ||
kv_map.h | ||
log_write_bench.cc | ||
math.h | ||
math128.h | ||
murmurhash.cc | ||
murmurhash.h | ||
mutexlock.h | ||
ppc-opcode.h | ||
random.cc | ||
random.h | ||
random_test.cc | ||
rate_limiter.cc | ||
rate_limiter.h | ||
rate_limiter_test.cc | ||
repeatable_thread.h | ||
repeatable_thread_test.cc | ||
ribbon_alg.h | ||
ribbon_config.cc | ||
ribbon_config.h | ||
ribbon_impl.h | ||
ribbon_test.cc | ||
set_comparator.h | ||
single_thread_executor.h | ||
slice.cc | ||
slice_test.cc | ||
slice_transform_test.cc | ||
status.cc | ||
stderr_logger.h | ||
stop_watch.h | ||
string_util.cc | ||
string_util.h | ||
thread_guard.h | ||
thread_list_test.cc | ||
thread_local.cc | ||
thread_local.h | ||
thread_local_test.cc | ||
thread_operation.h | ||
threadpool_imp.cc | ||
threadpool_imp.h | ||
timer.h | ||
timer_queue.h | ||
timer_queue_test.cc | ||
timer_test.cc | ||
user_comparator_wrapper.h | ||
vector_iterator.h | ||
work_queue.h | ||
work_queue_test.cc | ||
xxhash.cc | ||
xxhash.h | ||
xxph3.h |