@nxtedition/rocksdb 10.1.4 → 10.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +16 -12
- package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
- package/deps/rocksdb/rocksdb/Makefile +38 -15
- package/deps/rocksdb/rocksdb/TARGETS +10 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
- package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
- package/deps/rocksdb/rocksdb/db/builder.h +1 -1
- package/deps/rocksdb/rocksdb/db/c.cc +205 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
- package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
- package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
- package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
- package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
- package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
- package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
- package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
- package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
- package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
- package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
- package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
- package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
- package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
- package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
- package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
- package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
- package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
- package/deps/rocksdb/rocksdb/env/env.cc +6 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
- package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
- package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
- package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
- package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
- package/deps/rocksdb/rocksdb/options/options.cc +3 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
- package/deps/rocksdb/rocksdb/src.mk +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
- package/deps/rocksdb/rocksdb/table/format.cc +1 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
- package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/util/random.cc +2 -1
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
- package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
- package/index.js +1 -2
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/util.h +25 -2
- package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
- package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
- package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
- package/.tap/test-results/test/batch-test.js.tap +0 -12
- package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
- package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
- package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
- package/.tap/test-results/test/column-test.js.tap +0 -55
- package/.tap/test-results/test/common.js.tap +0 -0
- package/.tap/test-results/test/compression-test.js.tap +0 -30
- package/.tap/test-results/test/db-identity.js.tap +0 -12
- package/.tap/test-results/test/electron.js.tap +0 -0
- package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
- package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
- package/.tap/test-results/test/gc.js.tap +0 -0
- package/.tap/test-results/test/getproperty-test.js.tap +0 -29
- package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
- package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
- package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
- package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
- package/.tap/test-results/test/iterator-test.js.tap +0 -6
- package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
- package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
- package/.tap/test-results/test/leak-tester.js.tap +0 -0
- package/.tap/test-results/test/lock-test.js.tap +0 -18
- package/.tap/test-results/test/lock.js.tap +0 -0
- package/.tap/test-results/test/make.js.tap +0 -0
- package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
- package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
- package/.tap/test-results/test/mkdir-test.js.tap +0 -15
- package/.tap/test-results/test/segfault-test.js.tap +0 -76
- package/.tap/test-results/test/stack-blower.js.tap +0 -0
- package/deps/rocksdb/rocksdb/README.md +0 -29
- package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
- package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
- package/deps/rocksdb/rocksdb/port/README +0 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
- package/tmp/000099.sst +0 -0
- package/tmp/000102.sst +0 -0
- package/tmp/000103.log +0 -0
- package/tmp/CURRENT +0 -1
- package/tmp/IDENTITY +0 -1
- package/tmp/LOCK +0 -0
- package/tmp/MANIFEST-000104 +0 -0
- package/tmp/OPTIONS-000098 +0 -207
- package/tmp/OPTIONS-000106 +0 -207
|
@@ -62,7 +62,6 @@ TBlockIter* BlockBasedTable::NewDataBlockIterator(
|
|
|
62
62
|
CachableEntry<Block> block;
|
|
63
63
|
if (rep_->uncompression_dict_reader && block_type == BlockType::kData) {
|
|
64
64
|
CachableEntry<UncompressionDict> uncompression_dict;
|
|
65
|
-
const bool no_io = (ro.read_tier == kBlockCacheTier);
|
|
66
65
|
// For async scans, don't use the prefetch buffer since an async prefetch
|
|
67
66
|
// might already be under way and this would invalidate it. Also, the
|
|
68
67
|
// uncompression dict is typically at the end of the file and would
|
|
@@ -72,8 +71,7 @@ TBlockIter* BlockBasedTable::NewDataBlockIterator(
|
|
|
72
71
|
// pattern.
|
|
73
72
|
s = rep_->uncompression_dict_reader->GetOrReadUncompressionDictionary(
|
|
74
73
|
((ro.async_io || ro.auto_readahead_size) ? nullptr : prefetch_buffer),
|
|
75
|
-
ro,
|
|
76
|
-
&uncompression_dict);
|
|
74
|
+
ro, get_context, lookup_context, &uncompression_dict);
|
|
77
75
|
if (!s.ok()) {
|
|
78
76
|
iter->Invalidate(s);
|
|
79
77
|
return iter;
|
|
@@ -362,7 +362,6 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
|
|
|
362
362
|
|
|
363
363
|
// First check the full filter
|
|
364
364
|
// If full filter not useful, Then go into each block
|
|
365
|
-
const bool no_io = read_options.read_tier == kBlockCacheTier;
|
|
366
365
|
uint64_t tracing_mget_id = BlockCacheTraceHelper::kReservedGetId;
|
|
367
366
|
if (sst_file_range.begin()->get_context) {
|
|
368
367
|
tracing_mget_id = sst_file_range.begin()->get_context->get_tracing_get_id();
|
|
@@ -372,7 +371,7 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
|
|
|
372
371
|
BlockCacheLookupContext metadata_lookup_context{
|
|
373
372
|
TableReaderCaller::kUserMultiGet, tracing_mget_id,
|
|
374
373
|
/*_get_from_user_specified_snapshot=*/read_options.snapshot != nullptr};
|
|
375
|
-
FullFilterKeysMayMatch(filter, &sst_file_range,
|
|
374
|
+
FullFilterKeysMayMatch(filter, &sst_file_range, prefix_extractor,
|
|
376
375
|
&metadata_lookup_context, read_options);
|
|
377
376
|
|
|
378
377
|
if (!sst_file_range.empty()) {
|
|
@@ -461,9 +460,9 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
|
|
|
461
460
|
uncompression_dict_status =
|
|
462
461
|
rep_->uncompression_dict_reader
|
|
463
462
|
->GetOrReadUncompressionDictionary(
|
|
464
|
-
nullptr /* prefetch_buffer */, read_options,
|
|
465
|
-
|
|
466
|
-
&
|
|
463
|
+
nullptr /* prefetch_buffer */, read_options,
|
|
464
|
+
get_context, &metadata_lookup_context,
|
|
465
|
+
&uncompression_dict);
|
|
467
466
|
uncompression_dict_inited = true;
|
|
468
467
|
}
|
|
469
468
|
|
|
@@ -668,7 +667,7 @@ DEFINE_SYNC_AND_ASYNC(void, BlockBasedTable::MultiGet)
|
|
|
668
667
|
biter->status().IsIncomplete()) {
|
|
669
668
|
// couldn't get block from block_cache
|
|
670
669
|
// Update Saver.state to Found because we are only looking for
|
|
671
|
-
// whether we can guarantee the key is not there
|
|
670
|
+
// whether we can guarantee the key is not there with kBlockCacheTier
|
|
672
671
|
get_context->MarkKeyMayExist();
|
|
673
672
|
break;
|
|
674
673
|
}
|
|
@@ -156,4 +156,35 @@ template <typename TUse, typename TBlocklike>
|
|
|
156
156
|
using WithBlocklikeCheck = std::enable_if_t<
|
|
157
157
|
TBlocklike::kCacheEntryRole == CacheEntryRole::kMisc || true, TUse>;
|
|
158
158
|
|
|
159
|
+
// Helper for the uncache_aggressiveness option
|
|
160
|
+
class UncacheAggressivenessAdvisor {
|
|
161
|
+
public:
|
|
162
|
+
UncacheAggressivenessAdvisor(uint32_t uncache_aggressiveness) {
|
|
163
|
+
assert(uncache_aggressiveness > 0);
|
|
164
|
+
allowance_ = std::min(uncache_aggressiveness, uint32_t{3});
|
|
165
|
+
threshold_ = std::pow(0.99, uncache_aggressiveness - 1);
|
|
166
|
+
}
|
|
167
|
+
void Report(bool erased) { ++(erased ? useful_ : not_useful_); }
|
|
168
|
+
bool ShouldContinue() {
|
|
169
|
+
if (not_useful_ < allowance_) {
|
|
170
|
+
return true;
|
|
171
|
+
} else {
|
|
172
|
+
// See UncacheAggressivenessAdvisor unit test
|
|
173
|
+
return (useful_ + 1.0) / (useful_ + not_useful_ - allowance_ + 1.5) >=
|
|
174
|
+
threshold_;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private:
|
|
179
|
+
// Baseline minimum number of "not useful" to consider stopping, to allow
|
|
180
|
+
// sufficient evidence for checking the threshold. Actual minimum will be
|
|
181
|
+
// higher as threshold gets well below 1.0.
|
|
182
|
+
int allowance_;
|
|
183
|
+
// After allowance, stop if useful ratio is below this threshold
|
|
184
|
+
double threshold_;
|
|
185
|
+
// Counts
|
|
186
|
+
int useful_ = 0;
|
|
187
|
+
int not_useful_ = 0;
|
|
188
|
+
};
|
|
189
|
+
|
|
159
190
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -18,6 +18,12 @@ void BlockPrefetcher::PrefetchIfNeeded(
|
|
|
18
18
|
const bool no_sequential_checking, const ReadOptions& read_options,
|
|
19
19
|
const std::function<void(bool, uint64_t&, uint64_t&)>& readaheadsize_cb,
|
|
20
20
|
bool is_async_io_prefetch) {
|
|
21
|
+
if (read_options.read_tier == ReadTier::kBlockCacheTier) {
|
|
22
|
+
// Disable prefetching when IO disallowed. (Note that we haven't allocated
|
|
23
|
+
// any buffers yet despite the various tracked settings.)
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
21
27
|
ReadaheadParams readahead_params;
|
|
22
28
|
readahead_params.initial_readahead_size = readahead_size;
|
|
23
29
|
readahead_params.max_readahead_size = readahead_size;
|
|
@@ -78,7 +78,7 @@ class CachableEntry {
|
|
|
78
78
|
return *this;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
ReleaseResource();
|
|
81
|
+
ReleaseResource(/*erase_if_last_ref=*/false);
|
|
82
82
|
|
|
83
83
|
value_ = rhs.value_;
|
|
84
84
|
cache_ = rhs.cache_;
|
|
@@ -95,7 +95,7 @@ class CachableEntry {
|
|
|
95
95
|
return *this;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
~CachableEntry() { ReleaseResource(); }
|
|
98
|
+
~CachableEntry() { ReleaseResource(/*erase_if_last_ref=*/false); }
|
|
99
99
|
|
|
100
100
|
bool IsEmpty() const {
|
|
101
101
|
return value_ == nullptr && cache_ == nullptr && cache_handle_ == nullptr &&
|
|
@@ -114,7 +114,12 @@ class CachableEntry {
|
|
|
114
114
|
bool GetOwnValue() const { return own_value_; }
|
|
115
115
|
|
|
116
116
|
void Reset() {
|
|
117
|
-
ReleaseResource();
|
|
117
|
+
ReleaseResource(/*erase_if_last_ref=*/false);
|
|
118
|
+
ResetFields();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
void ResetEraseIfLastRef() {
|
|
122
|
+
ReleaseResource(/*erase_if_last_ref=*/true);
|
|
118
123
|
ResetFields();
|
|
119
124
|
}
|
|
120
125
|
|
|
@@ -200,10 +205,10 @@ class CachableEntry {
|
|
|
200
205
|
}
|
|
201
206
|
|
|
202
207
|
private:
|
|
203
|
-
void ReleaseResource() noexcept {
|
|
208
|
+
void ReleaseResource(bool erase_if_last_ref) noexcept {
|
|
204
209
|
if (LIKELY(cache_handle_ != nullptr)) {
|
|
205
210
|
assert(cache_ != nullptr);
|
|
206
|
-
cache_->Release(cache_handle_);
|
|
211
|
+
cache_->Release(cache_handle_, erase_if_last_ref);
|
|
207
212
|
} else if (own_value_) {
|
|
208
213
|
delete value_;
|
|
209
214
|
}
|
|
@@ -100,39 +100,34 @@ class FilterBlockReader {
|
|
|
100
100
|
FilterBlockReader& operator=(const FilterBlockReader&) = delete;
|
|
101
101
|
|
|
102
102
|
/**
|
|
103
|
-
* If no_io is set, then it returns true if it cannot answer the query without
|
|
104
|
-
* reading data from disk. This is used in PartitionedFilterBlockReader to
|
|
105
|
-
* avoid reading partitions that are not in block cache already
|
|
106
|
-
*
|
|
107
103
|
* Normally filters are built on only the user keys and the InternalKey is not
|
|
108
104
|
* needed for a query. The index in PartitionedFilterBlockReader however is
|
|
109
105
|
* built upon InternalKey and must be provided via const_ikey_ptr when running
|
|
110
106
|
* queries.
|
|
111
107
|
*/
|
|
112
|
-
virtual bool KeyMayMatch(const Slice& key, const
|
|
113
|
-
const Slice* const const_ikey_ptr,
|
|
108
|
+
virtual bool KeyMayMatch(const Slice& key, const Slice* const const_ikey_ptr,
|
|
114
109
|
GetContext* get_context,
|
|
115
110
|
BlockCacheLookupContext* lookup_context,
|
|
116
111
|
const ReadOptions& read_options) = 0;
|
|
117
112
|
|
|
118
|
-
virtual void KeysMayMatch(MultiGetRange* range,
|
|
113
|
+
virtual void KeysMayMatch(MultiGetRange* range,
|
|
119
114
|
BlockCacheLookupContext* lookup_context,
|
|
120
115
|
const ReadOptions& read_options) {
|
|
121
116
|
for (auto iter = range->begin(); iter != range->end(); ++iter) {
|
|
122
117
|
const Slice ukey_without_ts = iter->ukey_without_ts;
|
|
123
118
|
const Slice ikey = iter->ikey;
|
|
124
119
|
GetContext* const get_context = iter->get_context;
|
|
125
|
-
if (!KeyMayMatch(ukey_without_ts,
|
|
126
|
-
|
|
120
|
+
if (!KeyMayMatch(ukey_without_ts, &ikey, get_context, lookup_context,
|
|
121
|
+
read_options)) {
|
|
127
122
|
range->SkipKey(iter);
|
|
128
123
|
}
|
|
129
124
|
}
|
|
130
125
|
}
|
|
131
126
|
|
|
132
127
|
/**
|
|
133
|
-
*
|
|
128
|
+
* Similar to KeyMayMatch
|
|
134
129
|
*/
|
|
135
|
-
virtual bool PrefixMayMatch(const Slice& prefix,
|
|
130
|
+
virtual bool PrefixMayMatch(const Slice& prefix,
|
|
136
131
|
const Slice* const const_ikey_ptr,
|
|
137
132
|
GetContext* get_context,
|
|
138
133
|
BlockCacheLookupContext* lookup_context,
|
|
@@ -140,7 +135,6 @@ class FilterBlockReader {
|
|
|
140
135
|
|
|
141
136
|
virtual void PrefixesMayMatch(MultiGetRange* range,
|
|
142
137
|
const SliceTransform* prefix_extractor,
|
|
143
|
-
const bool no_io,
|
|
144
138
|
BlockCacheLookupContext* lookup_context,
|
|
145
139
|
const ReadOptions& read_options) {
|
|
146
140
|
for (auto iter = range->begin(); iter != range->end(); ++iter) {
|
|
@@ -148,8 +142,8 @@ class FilterBlockReader {
|
|
|
148
142
|
const Slice ikey = iter->ikey;
|
|
149
143
|
GetContext* const get_context = iter->get_context;
|
|
150
144
|
if (prefix_extractor->InDomain(ukey_without_ts) &&
|
|
151
|
-
!PrefixMayMatch(prefix_extractor->Transform(ukey_without_ts),
|
|
152
|
-
|
|
145
|
+
!PrefixMayMatch(prefix_extractor->Transform(ukey_without_ts), &ikey,
|
|
146
|
+
get_context, lookup_context, read_options)) {
|
|
153
147
|
range->SkipKey(iter);
|
|
154
148
|
}
|
|
155
149
|
}
|
|
@@ -169,13 +163,15 @@ class FilterBlockReader {
|
|
|
169
163
|
return Status::OK();
|
|
170
164
|
}
|
|
171
165
|
|
|
166
|
+
virtual void EraseFromCacheBeforeDestruction(
|
|
167
|
+
uint32_t /*uncache_aggressiveness*/) {}
|
|
168
|
+
|
|
172
169
|
virtual bool RangeMayExist(const Slice* /*iterate_upper_bound*/,
|
|
173
170
|
const Slice& user_key_without_ts,
|
|
174
171
|
const SliceTransform* prefix_extractor,
|
|
175
172
|
const Comparator* /*comparator*/,
|
|
176
173
|
const Slice* const const_ikey_ptr,
|
|
177
174
|
bool* filter_checked, bool need_upper_bound_check,
|
|
178
|
-
bool no_io,
|
|
179
175
|
BlockCacheLookupContext* lookup_context,
|
|
180
176
|
const ReadOptions& read_options) = 0;
|
|
181
177
|
};
|
|
@@ -67,8 +67,7 @@ bool FilterBlockReaderCommon<TBlocklike>::cache_filter_blocks() const {
|
|
|
67
67
|
|
|
68
68
|
template <typename TBlocklike>
|
|
69
69
|
Status FilterBlockReaderCommon<TBlocklike>::GetOrReadFilterBlock(
|
|
70
|
-
|
|
71
|
-
BlockCacheLookupContext* lookup_context,
|
|
70
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
72
71
|
CachableEntry<TBlocklike>* filter_block,
|
|
73
72
|
const ReadOptions& read_options) const {
|
|
74
73
|
assert(filter_block);
|
|
@@ -78,12 +77,7 @@ Status FilterBlockReaderCommon<TBlocklike>::GetOrReadFilterBlock(
|
|
|
78
77
|
return Status::OK();
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
if (no_io) {
|
|
83
|
-
ro.read_tier = kBlockCacheTier;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return ReadFilterBlock(table_, nullptr /* prefetch_buffer */, ro,
|
|
80
|
+
return ReadFilterBlock(table_, nullptr /* prefetch_buffer */, read_options,
|
|
87
81
|
cache_filter_blocks(), get_context, lookup_context,
|
|
88
82
|
filter_block);
|
|
89
83
|
}
|
|
@@ -102,8 +96,8 @@ bool FilterBlockReaderCommon<TBlocklike>::RangeMayExist(
|
|
|
102
96
|
const Slice* iterate_upper_bound, const Slice& user_key_without_ts,
|
|
103
97
|
const SliceTransform* prefix_extractor, const Comparator* comparator,
|
|
104
98
|
const Slice* const const_ikey_ptr, bool* filter_checked,
|
|
105
|
-
bool need_upper_bound_check,
|
|
106
|
-
|
|
99
|
+
bool need_upper_bound_check, BlockCacheLookupContext* lookup_context,
|
|
100
|
+
const ReadOptions& read_options) {
|
|
107
101
|
if (!prefix_extractor || !prefix_extractor->InDomain(user_key_without_ts)) {
|
|
108
102
|
*filter_checked = false;
|
|
109
103
|
return true;
|
|
@@ -115,7 +109,7 @@ bool FilterBlockReaderCommon<TBlocklike>::RangeMayExist(
|
|
|
115
109
|
return true;
|
|
116
110
|
} else {
|
|
117
111
|
*filter_checked = true;
|
|
118
|
-
return PrefixMayMatch(prefix,
|
|
112
|
+
return PrefixMayMatch(prefix, const_ikey_ptr,
|
|
119
113
|
/* get_context */ nullptr, lookup_context,
|
|
120
114
|
read_options);
|
|
121
115
|
}
|
|
@@ -155,6 +149,18 @@ bool FilterBlockReaderCommon<TBlocklike>::IsFilterCompatible(
|
|
|
155
149
|
}
|
|
156
150
|
}
|
|
157
151
|
|
|
152
|
+
template <typename TBlocklike>
|
|
153
|
+
void FilterBlockReaderCommon<TBlocklike>::EraseFromCacheBeforeDestruction(
|
|
154
|
+
uint32_t uncache_aggressiveness) {
|
|
155
|
+
if (uncache_aggressiveness > 0) {
|
|
156
|
+
if (filter_block_.IsCached()) {
|
|
157
|
+
filter_block_.ResetEraseIfLastRef();
|
|
158
|
+
} else {
|
|
159
|
+
table()->EraseFromCache(table()->get_rep()->filter_handle);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
158
164
|
// Explicitly instantiate templates for both "blocklike" types we use.
|
|
159
165
|
// This makes it possible to keep the template definitions in the .cc file.
|
|
160
166
|
template class FilterBlockReaderCommon<Block_kFilterPartitionIndex>;
|
|
@@ -38,10 +38,13 @@ class FilterBlockReaderCommon : public FilterBlockReader {
|
|
|
38
38
|
const SliceTransform* prefix_extractor,
|
|
39
39
|
const Comparator* comparator,
|
|
40
40
|
const Slice* const const_ikey_ptr, bool* filter_checked,
|
|
41
|
-
bool need_upper_bound_check,
|
|
41
|
+
bool need_upper_bound_check,
|
|
42
42
|
BlockCacheLookupContext* lookup_context,
|
|
43
43
|
const ReadOptions& read_options) override;
|
|
44
44
|
|
|
45
|
+
void EraseFromCacheBeforeDestruction(
|
|
46
|
+
uint32_t /*uncache_aggressiveness*/) override;
|
|
47
|
+
|
|
45
48
|
protected:
|
|
46
49
|
static Status ReadFilterBlock(const BlockBasedTable* table,
|
|
47
50
|
FilePrefetchBuffer* prefetch_buffer,
|
|
@@ -55,7 +58,7 @@ class FilterBlockReaderCommon : public FilterBlockReader {
|
|
|
55
58
|
bool whole_key_filtering() const;
|
|
56
59
|
bool cache_filter_blocks() const;
|
|
57
60
|
|
|
58
|
-
Status GetOrReadFilterBlock(
|
|
61
|
+
Status GetOrReadFilterBlock(GetContext* get_context,
|
|
59
62
|
BlockCacheLookupContext* lookup_context,
|
|
60
63
|
CachableEntry<TBlocklike>* filter_block,
|
|
61
64
|
const ReadOptions& read_options) const;
|
|
@@ -20,7 +20,8 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
20
20
|
FullFilterBlockBuilder::FullFilterBlockBuilder(
|
|
21
21
|
const SliceTransform* _prefix_extractor, bool whole_key_filtering,
|
|
22
22
|
FilterBitsBuilder* filter_bits_builder)
|
|
23
|
-
:
|
|
23
|
+
: need_last_prefix_(whole_key_filtering && _prefix_extractor != nullptr),
|
|
24
|
+
prefix_extractor_(_prefix_extractor),
|
|
24
25
|
whole_key_filtering_(whole_key_filtering),
|
|
25
26
|
last_whole_key_recorded_(false),
|
|
26
27
|
last_prefix_recorded_(false),
|
|
@@ -38,7 +39,7 @@ void FullFilterBlockBuilder::Add(const Slice& key_without_ts) {
|
|
|
38
39
|
const bool add_prefix =
|
|
39
40
|
prefix_extractor_ && prefix_extractor_->InDomain(key_without_ts);
|
|
40
41
|
|
|
41
|
-
if (!last_prefix_recorded_ && last_key_in_domain_) {
|
|
42
|
+
if (need_last_prefix_ && !last_prefix_recorded_ && last_key_in_domain_) {
|
|
42
43
|
// We can reach here when a new filter partition starts in partitioned
|
|
43
44
|
// filter. The last prefix in the previous partition should be added if
|
|
44
45
|
// necessary regardless of key_without_ts, to support prefix SeekForPrev.
|
|
@@ -82,7 +83,15 @@ inline void FullFilterBlockBuilder::AddKey(const Slice& key) {
|
|
|
82
83
|
void FullFilterBlockBuilder::AddPrefix(const Slice& key) {
|
|
83
84
|
assert(prefix_extractor_ && prefix_extractor_->InDomain(key));
|
|
84
85
|
Slice prefix = prefix_extractor_->Transform(key);
|
|
85
|
-
if (
|
|
86
|
+
if (need_last_prefix_) {
|
|
87
|
+
// WART/FIXME: Because last_prefix_str_ is needed above to make
|
|
88
|
+
// SeekForPrev work with partitioned + prefix filters, we are currently
|
|
89
|
+
// use this inefficient code in that case (in addition to prefix+whole
|
|
90
|
+
// key). Hopefully this can be optimized with some refactoring up the call
|
|
91
|
+
// chain to BlockBasedTableBuilder. Even in PartitionedFilterBlockBuilder,
|
|
92
|
+
// we don't currently have access to the previous key/prefix by the time we
|
|
93
|
+
// know we are starting a new partition.
|
|
94
|
+
|
|
86
95
|
// if both whole_key and prefix are added to bloom then we will have whole
|
|
87
96
|
// key and prefix addition being interleaved and thus cannot rely on the
|
|
88
97
|
// bits builder to properly detect the duplicates by comparing with the last
|
|
@@ -123,7 +132,7 @@ FullFilterBlockReader::FullFilterBlockReader(
|
|
|
123
132
|
CachableEntry<ParsedFullFilterBlock>&& filter_block)
|
|
124
133
|
: FilterBlockReaderCommon(t, std::move(filter_block)) {}
|
|
125
134
|
|
|
126
|
-
bool FullFilterBlockReader::KeyMayMatch(const Slice& key,
|
|
135
|
+
bool FullFilterBlockReader::KeyMayMatch(const Slice& key,
|
|
127
136
|
const Slice* const /*const_ikey_ptr*/,
|
|
128
137
|
GetContext* get_context,
|
|
129
138
|
BlockCacheLookupContext* lookup_context,
|
|
@@ -131,7 +140,7 @@ bool FullFilterBlockReader::KeyMayMatch(const Slice& key, const bool no_io,
|
|
|
131
140
|
if (!whole_key_filtering()) {
|
|
132
141
|
return true;
|
|
133
142
|
}
|
|
134
|
-
return MayMatch(key,
|
|
143
|
+
return MayMatch(key, get_context, lookup_context, read_options);
|
|
135
144
|
}
|
|
136
145
|
|
|
137
146
|
std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
|
|
@@ -162,19 +171,19 @@ std::unique_ptr<FilterBlockReader> FullFilterBlockReader::Create(
|
|
|
162
171
|
}
|
|
163
172
|
|
|
164
173
|
bool FullFilterBlockReader::PrefixMayMatch(
|
|
165
|
-
const Slice& prefix, const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return MayMatch(prefix,
|
|
174
|
+
const Slice& prefix, const Slice* const /*const_ikey_ptr*/,
|
|
175
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
176
|
+
const ReadOptions& read_options) {
|
|
177
|
+
return MayMatch(prefix, get_context, lookup_context, read_options);
|
|
169
178
|
}
|
|
170
179
|
|
|
171
|
-
bool FullFilterBlockReader::MayMatch(const Slice& entry,
|
|
180
|
+
bool FullFilterBlockReader::MayMatch(const Slice& entry,
|
|
172
181
|
GetContext* get_context,
|
|
173
182
|
BlockCacheLookupContext* lookup_context,
|
|
174
183
|
const ReadOptions& read_options) const {
|
|
175
184
|
CachableEntry<ParsedFullFilterBlock> filter_block;
|
|
176
185
|
|
|
177
|
-
const Status s = GetOrReadFilterBlock(
|
|
186
|
+
const Status s = GetOrReadFilterBlock(get_context, lookup_context,
|
|
178
187
|
&filter_block, read_options);
|
|
179
188
|
if (!s.ok()) {
|
|
180
189
|
IGNORE_STATUS_IF_ERROR(s);
|
|
@@ -199,32 +208,30 @@ bool FullFilterBlockReader::MayMatch(const Slice& entry, bool no_io,
|
|
|
199
208
|
}
|
|
200
209
|
|
|
201
210
|
void FullFilterBlockReader::KeysMayMatch(
|
|
202
|
-
MultiGetRange* range,
|
|
203
|
-
|
|
211
|
+
MultiGetRange* range, BlockCacheLookupContext* lookup_context,
|
|
212
|
+
const ReadOptions& read_options) {
|
|
204
213
|
if (!whole_key_filtering()) {
|
|
205
214
|
// Simply return. Don't skip any key - consider all keys as likely to be
|
|
206
215
|
// present
|
|
207
216
|
return;
|
|
208
217
|
}
|
|
209
|
-
MayMatch(range,
|
|
218
|
+
MayMatch(range, nullptr, lookup_context, read_options);
|
|
210
219
|
}
|
|
211
220
|
|
|
212
221
|
void FullFilterBlockReader::PrefixesMayMatch(
|
|
213
222
|
MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
MayMatch(range, no_io, prefix_extractor, lookup_context, read_options);
|
|
223
|
+
BlockCacheLookupContext* lookup_context, const ReadOptions& read_options) {
|
|
224
|
+
MayMatch(range, prefix_extractor, lookup_context, read_options);
|
|
217
225
|
}
|
|
218
226
|
|
|
219
|
-
void FullFilterBlockReader::MayMatch(MultiGetRange* range,
|
|
227
|
+
void FullFilterBlockReader::MayMatch(MultiGetRange* range,
|
|
220
228
|
const SliceTransform* prefix_extractor,
|
|
221
229
|
BlockCacheLookupContext* lookup_context,
|
|
222
230
|
const ReadOptions& read_options) const {
|
|
223
231
|
CachableEntry<ParsedFullFilterBlock> filter_block;
|
|
224
232
|
|
|
225
|
-
const Status s =
|
|
226
|
-
|
|
227
|
-
&filter_block, read_options);
|
|
233
|
+
const Status s = GetOrReadFilterBlock(
|
|
234
|
+
range->begin()->get_context, lookup_context, &filter_block, read_options);
|
|
228
235
|
if (!s.ok()) {
|
|
229
236
|
IGNORE_STATUS_IF_ERROR(s);
|
|
230
237
|
return;
|
|
@@ -69,6 +69,7 @@ class FullFilterBlockBuilder : public FilterBlockBuilder {
|
|
|
69
69
|
void AddPrefix(const Slice& key);
|
|
70
70
|
const SliceTransform* prefix_extractor() { return prefix_extractor_; }
|
|
71
71
|
const std::string& last_prefix_str() const { return last_prefix_str_; }
|
|
72
|
+
bool need_last_prefix_;
|
|
72
73
|
|
|
73
74
|
private:
|
|
74
75
|
// important: all of these might point to invalid addresses
|
|
@@ -102,41 +103,38 @@ class FullFilterBlockReader
|
|
|
102
103
|
FilePrefetchBuffer* prefetch_buffer, bool use_cache, bool prefetch,
|
|
103
104
|
bool pin, BlockCacheLookupContext* lookup_context);
|
|
104
105
|
|
|
105
|
-
bool KeyMayMatch(const Slice& key, const
|
|
106
|
-
|
|
106
|
+
bool KeyMayMatch(const Slice& key, const Slice* const const_ikey_ptr,
|
|
107
|
+
GetContext* get_context,
|
|
107
108
|
BlockCacheLookupContext* lookup_context,
|
|
108
109
|
const ReadOptions& read_options) override;
|
|
109
110
|
|
|
110
|
-
bool PrefixMayMatch(const Slice& prefix, const
|
|
111
|
-
const Slice* const const_ikey_ptr,
|
|
111
|
+
bool PrefixMayMatch(const Slice& prefix, const Slice* const const_ikey_ptr,
|
|
112
112
|
GetContext* get_context,
|
|
113
113
|
BlockCacheLookupContext* lookup_context,
|
|
114
114
|
const ReadOptions& read_options) override;
|
|
115
115
|
|
|
116
|
-
void KeysMayMatch(MultiGetRange* range,
|
|
116
|
+
void KeysMayMatch(MultiGetRange* range,
|
|
117
117
|
BlockCacheLookupContext* lookup_context,
|
|
118
118
|
const ReadOptions& read_options) override;
|
|
119
119
|
// Used in partitioned filter code
|
|
120
120
|
void KeysMayMatch2(MultiGetRange* range,
|
|
121
121
|
const SliceTransform* /*prefix_extractor*/,
|
|
122
|
-
|
|
122
|
+
BlockCacheLookupContext* lookup_context,
|
|
123
123
|
const ReadOptions& read_options) {
|
|
124
|
-
KeysMayMatch(range,
|
|
124
|
+
KeysMayMatch(range, lookup_context, read_options);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
void PrefixesMayMatch(MultiGetRange* range,
|
|
128
128
|
const SliceTransform* prefix_extractor,
|
|
129
|
-
const bool no_io,
|
|
130
129
|
BlockCacheLookupContext* lookup_context,
|
|
131
130
|
const ReadOptions& read_options) override;
|
|
132
131
|
size_t ApproximateMemoryUsage() const override;
|
|
133
132
|
|
|
134
133
|
private:
|
|
135
|
-
bool MayMatch(const Slice& entry,
|
|
134
|
+
bool MayMatch(const Slice& entry, GetContext* get_context,
|
|
136
135
|
BlockCacheLookupContext* lookup_context,
|
|
137
136
|
const ReadOptions& read_options) const;
|
|
138
|
-
void MayMatch(MultiGetRange* range,
|
|
139
|
-
const SliceTransform* prefix_extractor,
|
|
137
|
+
void MayMatch(MultiGetRange* range, const SliceTransform* prefix_extractor,
|
|
140
138
|
BlockCacheLookupContext* lookup_context,
|
|
141
139
|
const ReadOptions& read_options) const;
|
|
142
140
|
};
|
|
@@ -115,7 +115,7 @@ TEST_F(PluginFullFilterBlockTest, PluginEmptyBuilder) {
|
|
|
115
115
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
116
116
|
// Remain same symantic with blockbased filter
|
|
117
117
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
118
|
-
/*
|
|
118
|
+
/*const_ikey_ptr=*/nullptr,
|
|
119
119
|
/*get_context=*/nullptr,
|
|
120
120
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
121
121
|
}
|
|
@@ -136,31 +136,31 @@ TEST_F(PluginFullFilterBlockTest, PluginSingleChunk) {
|
|
|
136
136
|
|
|
137
137
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
138
138
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
139
|
-
/*
|
|
139
|
+
/*const_ikey_ptr=*/nullptr,
|
|
140
140
|
/*get_context=*/nullptr,
|
|
141
141
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
142
142
|
ASSERT_TRUE(reader.KeyMayMatch("bar",
|
|
143
|
-
/*
|
|
143
|
+
/*const_ikey_ptr=*/nullptr,
|
|
144
144
|
/*get_context=*/nullptr,
|
|
145
145
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
146
146
|
ASSERT_TRUE(reader.KeyMayMatch("box",
|
|
147
|
-
/*
|
|
147
|
+
/*const_ikey_ptr=*/nullptr,
|
|
148
148
|
/*get_context=*/nullptr,
|
|
149
149
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
150
150
|
ASSERT_TRUE(reader.KeyMayMatch("hello",
|
|
151
|
-
/*
|
|
151
|
+
/*const_ikey_ptr=*/nullptr,
|
|
152
152
|
/*get_context=*/nullptr,
|
|
153
153
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
154
154
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
155
|
-
/*
|
|
155
|
+
/*const_ikey_ptr=*/nullptr,
|
|
156
156
|
/*get_context=*/nullptr,
|
|
157
157
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
158
158
|
ASSERT_TRUE(!reader.KeyMayMatch("missing",
|
|
159
|
-
/*
|
|
159
|
+
/*const_ikey_ptr=*/nullptr,
|
|
160
160
|
/*get_context=*/nullptr,
|
|
161
161
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
162
162
|
ASSERT_TRUE(!reader.KeyMayMatch("other",
|
|
163
|
-
/*
|
|
163
|
+
/*const_ikey_ptr=*/nullptr,
|
|
164
164
|
/*get_context=*/nullptr,
|
|
165
165
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
166
166
|
}
|
|
@@ -185,7 +185,7 @@ TEST_F(FullFilterBlockTest, EmptyBuilder) {
|
|
|
185
185
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
186
186
|
// Remain same symantic with blockbased filter
|
|
187
187
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
188
|
-
/*
|
|
188
|
+
/*const_ikey_ptr=*/nullptr,
|
|
189
189
|
/*get_context=*/nullptr,
|
|
190
190
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
191
191
|
}
|
|
@@ -285,31 +285,31 @@ TEST_F(FullFilterBlockTest, SingleChunk) {
|
|
|
285
285
|
|
|
286
286
|
FullFilterBlockReader reader(table_.get(), std::move(block));
|
|
287
287
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
288
|
-
/*
|
|
288
|
+
/*const_ikey_ptr=*/nullptr,
|
|
289
289
|
/*get_context=*/nullptr,
|
|
290
290
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
291
291
|
ASSERT_TRUE(reader.KeyMayMatch("bar",
|
|
292
|
-
/*
|
|
292
|
+
/*const_ikey_ptr=*/nullptr,
|
|
293
293
|
/*get_context=*/nullptr,
|
|
294
294
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
295
295
|
ASSERT_TRUE(reader.KeyMayMatch("box",
|
|
296
|
-
/*
|
|
296
|
+
/*const_ikey_ptr=*/nullptr,
|
|
297
297
|
/*get_context=*/nullptr,
|
|
298
298
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
299
299
|
ASSERT_TRUE(reader.KeyMayMatch("hello",
|
|
300
|
-
/*
|
|
300
|
+
/*const_ikey_ptr=*/nullptr,
|
|
301
301
|
/*get_context=*/nullptr,
|
|
302
302
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
303
303
|
ASSERT_TRUE(reader.KeyMayMatch("foo",
|
|
304
|
-
/*
|
|
304
|
+
/*const_ikey_ptr=*/nullptr,
|
|
305
305
|
/*get_context=*/nullptr,
|
|
306
306
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
307
307
|
ASSERT_TRUE(!reader.KeyMayMatch("missing",
|
|
308
|
-
/*
|
|
308
|
+
/*const_ikey_ptr=*/nullptr,
|
|
309
309
|
/*get_context=*/nullptr,
|
|
310
310
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
311
311
|
ASSERT_TRUE(!reader.KeyMayMatch("other",
|
|
312
|
-
/*
|
|
312
|
+
/*const_ikey_ptr=*/nullptr,
|
|
313
313
|
/*get_context=*/nullptr,
|
|
314
314
|
/*lookup_context=*/nullptr, ReadOptions()));
|
|
315
315
|
}
|
|
@@ -114,9 +114,8 @@ InternalIteratorBase<IndexValue>* HashIndexReader::NewIterator(
|
|
|
114
114
|
IndexBlockIter* iter, GetContext* get_context,
|
|
115
115
|
BlockCacheLookupContext* lookup_context) {
|
|
116
116
|
const BlockBasedTable::Rep* rep = table()->get_rep();
|
|
117
|
-
const bool no_io = (read_options.read_tier == kBlockCacheTier);
|
|
118
117
|
CachableEntry<Block> index_block;
|
|
119
|
-
const Status s = GetOrReadIndexBlock(
|
|
118
|
+
const Status s = GetOrReadIndexBlock(get_context, lookup_context,
|
|
120
119
|
&index_block, read_options);
|
|
121
120
|
if (!s.ok()) {
|
|
122
121
|
if (iter != nullptr) {
|
|
@@ -35,9 +35,8 @@ Status BlockBasedTable::IndexReaderCommon::ReadIndexBlock(
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
Status BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const ReadOptions& ro) const {
|
|
38
|
+
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
39
|
+
CachableEntry<Block>* index_block, const ReadOptions& ro) const {
|
|
41
40
|
assert(index_block != nullptr);
|
|
42
41
|
|
|
43
42
|
if (!index_block_.IsEmpty()) {
|
|
@@ -45,13 +44,19 @@ Status BlockBasedTable::IndexReaderCommon::GetOrReadIndexBlock(
|
|
|
45
44
|
return Status::OK();
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
if (no_io) {
|
|
50
|
-
read_options.read_tier = kBlockCacheTier;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return ReadIndexBlock(table_, /*prefetch_buffer=*/nullptr, read_options,
|
|
47
|
+
return ReadIndexBlock(table_, /*prefetch_buffer=*/nullptr, ro,
|
|
54
48
|
cache_index_blocks(), get_context, lookup_context,
|
|
55
49
|
index_block);
|
|
56
50
|
}
|
|
51
|
+
|
|
52
|
+
void BlockBasedTable::IndexReaderCommon::EraseFromCacheBeforeDestruction(
|
|
53
|
+
uint32_t uncache_aggressiveness) {
|
|
54
|
+
if (uncache_aggressiveness > 0) {
|
|
55
|
+
if (index_block_.IsCached()) {
|
|
56
|
+
index_block_.ResetEraseIfLastRef();
|
|
57
|
+
} else {
|
|
58
|
+
table()->EraseFromCache(table()->get_rep()->index_handle);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
57
62
|
} // namespace ROCKSDB_NAMESPACE
|