@nxtedition/rocksdb 7.1.14 → 7.1.16
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 +1 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
- package/deps/rocksdb/rocksdb/Makefile +91 -11
- package/deps/rocksdb/rocksdb/TARGETS +8 -4
- package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
- package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
- package/deps/rocksdb/rocksdb/db/c.cc +29 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
- package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
- package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
- package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
- package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
- package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
- package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
- package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
- package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
- package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
- package/deps/rocksdb/rocksdb/file/filename.h +4 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
- package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options.cc +2 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
- package/deps/rocksdb/rocksdb/src.mk +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +26 -29
- package/deps/rocksdb/rocksdb/table/format.h +44 -26
- package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
- package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
- package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
- package/deps/rocksdb/rocksdb/util/timer.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
- package/deps/rocksdb/rocksdb.gyp +0 -1
- package/index.js +6 -10
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
|
@@ -122,8 +122,9 @@ class BlockBasedTableBuilder : public TableBuilder {
|
|
|
122
122
|
void WriteBlock(const Slice& block_contents, BlockHandle* handle,
|
|
123
123
|
BlockType block_type);
|
|
124
124
|
// Directly write data to the file.
|
|
125
|
-
void
|
|
126
|
-
|
|
125
|
+
void WriteMaybeCompressedBlock(const Slice& data, CompressionType,
|
|
126
|
+
BlockHandle* handle, BlockType block_type,
|
|
127
|
+
const Slice* raw_data = nullptr);
|
|
127
128
|
|
|
128
129
|
void SetupCacheKeyPrefix(const TableBuilderOptions& tbo);
|
|
129
130
|
|
|
@@ -161,8 +162,9 @@ class BlockBasedTableBuilder : public TableBuilder {
|
|
|
161
162
|
// REQUIRES: Finish(), Abandon() have not been called
|
|
162
163
|
void Flush();
|
|
163
164
|
|
|
164
|
-
// Some compression libraries fail when the
|
|
165
|
-
// uncompressed size is bigger than kCompressionSizeLimit, don't
|
|
165
|
+
// Some compression libraries fail when the uncompressed size is bigger than
|
|
166
|
+
// int. If uncompressed size is bigger than kCompressionSizeLimit, don't
|
|
167
|
+
// compress it
|
|
166
168
|
const uint64_t kCompressionSizeLimit = std::numeric_limits<int>::max();
|
|
167
169
|
|
|
168
170
|
// Get blocks from mem-table walking thread, compress them and
|
|
@@ -170,9 +172,9 @@ class BlockBasedTableBuilder : public TableBuilder {
|
|
|
170
172
|
void BGWorkCompression(const CompressionContext& compression_ctx,
|
|
171
173
|
UncompressionContext* verify_ctx);
|
|
172
174
|
|
|
173
|
-
// Given
|
|
175
|
+
// Given uncompressed block content, try to compress it and return result and
|
|
174
176
|
// compression type
|
|
175
|
-
void CompressAndVerifyBlock(const Slice&
|
|
177
|
+
void CompressAndVerifyBlock(const Slice& uncompressed_block_data,
|
|
176
178
|
bool is_data_block,
|
|
177
179
|
const CompressionContext& compression_ctx,
|
|
178
180
|
UncompressionContext* verify_ctx,
|
|
@@ -182,17 +184,17 @@ class BlockBasedTableBuilder : public TableBuilder {
|
|
|
182
184
|
Status* out_status);
|
|
183
185
|
|
|
184
186
|
// Get compressed blocks from BGWorkCompression and write them into SST
|
|
185
|
-
void
|
|
187
|
+
void BGWorkWriteMaybeCompressedBlock();
|
|
186
188
|
|
|
187
189
|
// Initialize parallel compression context and
|
|
188
|
-
// start BGWorkCompression and
|
|
190
|
+
// start BGWorkCompression and BGWorkWriteMaybeCompressedBlock threads
|
|
189
191
|
void StartParallelCompression();
|
|
190
192
|
|
|
191
|
-
// Stop BGWorkCompression and
|
|
193
|
+
// Stop BGWorkCompression and BGWorkWriteMaybeCompressedBlock threads
|
|
192
194
|
void StopParallelCompression();
|
|
193
195
|
};
|
|
194
196
|
|
|
195
|
-
Slice CompressBlock(const Slice&
|
|
197
|
+
Slice CompressBlock(const Slice& uncompressed_data, const CompressionInfo& info,
|
|
196
198
|
CompressionType* type, uint32_t format_version,
|
|
197
199
|
bool do_sample, std::string* compressed_output,
|
|
198
200
|
std::string* sampled_output_fast,
|
|
@@ -416,6 +416,11 @@ static std::unordered_map<std::string, OptionTypeInfo>
|
|
|
416
416
|
{offsetof(struct BlockBasedTableOptions, initial_auto_readahead_size),
|
|
417
417
|
OptionType::kSizeT, OptionVerificationType::kNormal,
|
|
418
418
|
OptionTypeFlags::kMutable}},
|
|
419
|
+
{"num_file_reads_for_auto_readahead",
|
|
420
|
+
{offsetof(struct BlockBasedTableOptions,
|
|
421
|
+
num_file_reads_for_auto_readahead),
|
|
422
|
+
OptionType::kUInt64T, OptionVerificationType::kNormal,
|
|
423
|
+
OptionTypeFlags::kMutable}},
|
|
419
424
|
|
|
420
425
|
#endif // ROCKSDB_LITE
|
|
421
426
|
};
|
|
@@ -623,8 +628,8 @@ Status BlockBasedTableFactory::NewTableReader(
|
|
|
623
628
|
table_reader_options.force_direct_prefetch, &tail_prefetch_stats_,
|
|
624
629
|
table_reader_options.block_cache_tracer,
|
|
625
630
|
table_reader_options.max_file_size_for_l0_meta_pin,
|
|
626
|
-
table_reader_options.cur_db_session_id,
|
|
627
|
-
table_reader_options.
|
|
631
|
+
table_reader_options.cur_db_session_id, table_reader_options.cur_file_num,
|
|
632
|
+
table_reader_options.unique_id);
|
|
628
633
|
}
|
|
629
634
|
|
|
630
635
|
TableBuilder* BlockBasedTableFactory::NewTableBuilder(
|
|
@@ -894,6 +899,10 @@ std::string BlockBasedTableFactory::GetPrintableOptions() const {
|
|
|
894
899
|
" initial_auto_readahead_size: %" ROCKSDB_PRIszt "\n",
|
|
895
900
|
table_options_.initial_auto_readahead_size);
|
|
896
901
|
ret.append(buffer);
|
|
902
|
+
snprintf(buffer, kBufferSize,
|
|
903
|
+
" num_file_reads_for_auto_readahead: %" PRIu64 "\n",
|
|
904
|
+
table_options_.num_file_reads_for_auto_readahead);
|
|
905
|
+
ret.append(buffer);
|
|
897
906
|
return ret;
|
|
898
907
|
}
|
|
899
908
|
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
#include <algorithm>
|
|
12
12
|
#include <array>
|
|
13
|
+
#include <atomic>
|
|
13
14
|
#include <cstdint>
|
|
14
15
|
#include <limits>
|
|
15
16
|
#include <memory>
|
|
@@ -411,7 +412,7 @@ template <typename TBlocklike>
|
|
|
411
412
|
Status BlockBasedTable::InsertEntryToCache(
|
|
412
413
|
const CacheTier& cache_tier, Cache* block_cache, const Slice& key,
|
|
413
414
|
const Cache::CacheItemHelper* cache_helper,
|
|
414
|
-
std::unique_ptr<TBlocklike
|
|
415
|
+
std::unique_ptr<TBlocklike>&& block_holder, size_t charge,
|
|
415
416
|
Cache::Handle** cache_handle, Cache::Priority priority) const {
|
|
416
417
|
Status s = Status::OK();
|
|
417
418
|
if (cache_tier == CacheTier::kNonVolatileBlockTier) {
|
|
@@ -421,6 +422,11 @@ Status BlockBasedTable::InsertEntryToCache(
|
|
|
421
422
|
s = block_cache->Insert(key, block_holder.get(), charge,
|
|
422
423
|
cache_helper->del_cb, cache_handle, priority);
|
|
423
424
|
}
|
|
425
|
+
if (s.ok()) {
|
|
426
|
+
// Cache took ownership
|
|
427
|
+
block_holder.release();
|
|
428
|
+
}
|
|
429
|
+
s.MustCheck();
|
|
424
430
|
return s;
|
|
425
431
|
}
|
|
426
432
|
|
|
@@ -588,7 +594,7 @@ Status BlockBasedTable::Open(
|
|
|
588
594
|
TailPrefetchStats* tail_prefetch_stats,
|
|
589
595
|
BlockCacheTracer* const block_cache_tracer,
|
|
590
596
|
size_t max_file_size_for_l0_meta_pin, const std::string& cur_db_session_id,
|
|
591
|
-
uint64_t cur_file_num) {
|
|
597
|
+
uint64_t cur_file_num, UniqueId64x2 expected_unique_id) {
|
|
592
598
|
table_reader->reset();
|
|
593
599
|
|
|
594
600
|
Status s;
|
|
@@ -597,7 +603,7 @@ Status BlockBasedTable::Open(
|
|
|
597
603
|
|
|
598
604
|
// From read_options, retain deadline, io_timeout, and rate_limiter_priority.
|
|
599
605
|
// In future, we may retain more
|
|
600
|
-
// options. Specifically,
|
|
606
|
+
// options. Specifically, we ignore verify_checksums and default to
|
|
601
607
|
// checksum verification anyway when creating the index and filter
|
|
602
608
|
// readers.
|
|
603
609
|
ReadOptions ro;
|
|
@@ -682,6 +688,53 @@ Status BlockBasedTable::Open(
|
|
|
682
688
|
if (!s.ok()) {
|
|
683
689
|
return s;
|
|
684
690
|
}
|
|
691
|
+
|
|
692
|
+
// Check expected unique id if provided
|
|
693
|
+
if (expected_unique_id != kNullUniqueId64x2) {
|
|
694
|
+
auto props = rep->table_properties;
|
|
695
|
+
if (!props) {
|
|
696
|
+
return Status::Corruption("Missing table properties on file " +
|
|
697
|
+
std::to_string(cur_file_num) +
|
|
698
|
+
" with known unique ID");
|
|
699
|
+
}
|
|
700
|
+
UniqueId64x2 actual_unique_id{};
|
|
701
|
+
s = GetSstInternalUniqueId(props->db_id, props->db_session_id,
|
|
702
|
+
props->orig_file_number, &actual_unique_id,
|
|
703
|
+
/*force*/ true);
|
|
704
|
+
assert(s.ok()); // because force=true
|
|
705
|
+
if (expected_unique_id != actual_unique_id) {
|
|
706
|
+
return Status::Corruption(
|
|
707
|
+
"Mismatch in unique ID on table file " +
|
|
708
|
+
std::to_string(cur_file_num) +
|
|
709
|
+
". Expected: " + InternalUniqueIdToHumanString(&expected_unique_id) +
|
|
710
|
+
" Actual: " + InternalUniqueIdToHumanString(&actual_unique_id));
|
|
711
|
+
}
|
|
712
|
+
TEST_SYNC_POINT_CALLBACK("BlockBasedTable::Open::PassedVerifyUniqueId",
|
|
713
|
+
&actual_unique_id);
|
|
714
|
+
} else {
|
|
715
|
+
TEST_SYNC_POINT_CALLBACK("BlockBasedTable::Open::SkippedVerifyUniqueId",
|
|
716
|
+
nullptr);
|
|
717
|
+
if (ioptions.verify_sst_unique_id_in_manifest && ioptions.logger) {
|
|
718
|
+
// A crude but isolated way of reporting unverified files. This should not
|
|
719
|
+
// be an ongoing concern so doesn't deserve a place in Statistics IMHO.
|
|
720
|
+
static std::atomic<uint64_t> unverified_count{0};
|
|
721
|
+
auto prev_count =
|
|
722
|
+
unverified_count.fetch_add(1, std::memory_order_relaxed);
|
|
723
|
+
if (prev_count == 0) {
|
|
724
|
+
ROCKS_LOG_WARN(
|
|
725
|
+
ioptions.logger,
|
|
726
|
+
"At least one SST file opened without unique ID to verify: %" PRIu64
|
|
727
|
+
".sst",
|
|
728
|
+
cur_file_num);
|
|
729
|
+
} else if (prev_count % 1000 == 0) {
|
|
730
|
+
ROCKS_LOG_WARN(
|
|
731
|
+
ioptions.logger,
|
|
732
|
+
"Another ~1000 SST files opened without unique ID to verify");
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Set up prefix extracto as needed
|
|
685
738
|
bool force_null_table_prefix_extractor = false;
|
|
686
739
|
TEST_SYNC_POINT_CALLBACK(
|
|
687
740
|
"BlockBasedTable::Open::ForceNullTablePrefixExtractor",
|
|
@@ -1223,15 +1276,16 @@ Status BlockBasedTable::ReadMetaIndexBlock(
|
|
|
1223
1276
|
template <typename TBlocklike>
|
|
1224
1277
|
Status BlockBasedTable::GetDataBlockFromCache(
|
|
1225
1278
|
const Slice& cache_key, Cache* block_cache, Cache* block_cache_compressed,
|
|
1226
|
-
const ReadOptions& read_options,
|
|
1279
|
+
const ReadOptions& read_options,
|
|
1280
|
+
CachableEntry<TBlocklike>* out_parsed_block,
|
|
1227
1281
|
const UncompressionDict& uncompression_dict, BlockType block_type,
|
|
1228
1282
|
const bool wait, GetContext* get_context) const {
|
|
1229
1283
|
const size_t read_amp_bytes_per_bit =
|
|
1230
1284
|
block_type == BlockType::kData
|
|
1231
1285
|
? rep_->table_options.read_amp_bytes_per_bit
|
|
1232
1286
|
: 0;
|
|
1233
|
-
assert(
|
|
1234
|
-
assert(
|
|
1287
|
+
assert(out_parsed_block);
|
|
1288
|
+
assert(out_parsed_block->IsEmpty());
|
|
1235
1289
|
// Here we treat the legacy name "...index_and_filter_blocks..." to mean all
|
|
1236
1290
|
// metadata blocks that might go into block cache, EXCEPT only those needed
|
|
1237
1291
|
// for the read path (Get, etc.). TableProperties should not be needed on the
|
|
@@ -1264,7 +1318,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
|
|
|
1264
1318
|
BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type), create_cb,
|
|
1265
1319
|
priority);
|
|
1266
1320
|
if (cache_handle != nullptr) {
|
|
1267
|
-
|
|
1321
|
+
out_parsed_block->SetCachedValue(
|
|
1268
1322
|
reinterpret_cast<TBlocklike*>(block_cache->Value(cache_handle)),
|
|
1269
1323
|
block_cache, cache_handle);
|
|
1270
1324
|
return s;
|
|
@@ -1272,7 +1326,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
|
|
|
1272
1326
|
}
|
|
1273
1327
|
|
|
1274
1328
|
// If not found, search from the compressed block cache.
|
|
1275
|
-
assert(
|
|
1329
|
+
assert(out_parsed_block->IsEmpty());
|
|
1276
1330
|
|
|
1277
1331
|
if (block_cache_compressed == nullptr) {
|
|
1278
1332
|
return s;
|
|
@@ -1310,32 +1364,33 @@ Status BlockBasedTable::GetDataBlockFromCache(
|
|
|
1310
1364
|
// Retrieve the uncompressed contents into a new buffer
|
|
1311
1365
|
UncompressionContext context(compression_type);
|
|
1312
1366
|
UncompressionInfo info(context, uncompression_dict, compression_type);
|
|
1313
|
-
s =
|
|
1367
|
+
s = UncompressSerializedBlock(
|
|
1314
1368
|
info, compressed_block->data.data(), compressed_block->data.size(),
|
|
1315
1369
|
&contents, rep_->table_options.format_version, rep_->ioptions,
|
|
1316
1370
|
GetMemoryAllocator(rep_->table_options));
|
|
1317
1371
|
|
|
1318
|
-
// Insert
|
|
1372
|
+
// Insert parsed block into block cache, the priority is based on the
|
|
1319
1373
|
// data block type.
|
|
1320
1374
|
if (s.ok()) {
|
|
1321
1375
|
std::unique_ptr<TBlocklike> block_holder(
|
|
1322
1376
|
BlocklikeTraits<TBlocklike>::Create(
|
|
1323
1377
|
std::move(contents), read_amp_bytes_per_bit, statistics,
|
|
1324
1378
|
rep_->blocks_definitely_zstd_compressed,
|
|
1325
|
-
rep_->table_options.filter_policy.get()));
|
|
1379
|
+
rep_->table_options.filter_policy.get()));
|
|
1326
1380
|
|
|
1327
1381
|
if (block_cache != nullptr && block_holder->own_bytes() &&
|
|
1328
1382
|
read_options.fill_cache) {
|
|
1329
1383
|
size_t charge = block_holder->ApproximateMemoryUsage();
|
|
1330
1384
|
Cache::Handle* cache_handle = nullptr;
|
|
1385
|
+
auto block_holder_raw_ptr = block_holder.get();
|
|
1331
1386
|
s = InsertEntryToCache(
|
|
1332
1387
|
rep_->ioptions.lowest_used_cache_tier, block_cache, cache_key,
|
|
1333
1388
|
BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type),
|
|
1334
|
-
block_holder, charge, &cache_handle, priority);
|
|
1389
|
+
std::move(block_holder), charge, &cache_handle, priority);
|
|
1335
1390
|
if (s.ok()) {
|
|
1336
1391
|
assert(cache_handle != nullptr);
|
|
1337
|
-
|
|
1338
|
-
|
|
1392
|
+
out_parsed_block->SetCachedValue(block_holder_raw_ptr, block_cache,
|
|
1393
|
+
cache_handle);
|
|
1339
1394
|
|
|
1340
1395
|
UpdateCacheInsertionMetrics(block_type, get_context, charge,
|
|
1341
1396
|
s.IsOkOverwritten(), rep_->ioptions.stats);
|
|
@@ -1343,7 +1398,7 @@ Status BlockBasedTable::GetDataBlockFromCache(
|
|
|
1343
1398
|
RecordTick(statistics, BLOCK_CACHE_ADD_FAILURES);
|
|
1344
1399
|
}
|
|
1345
1400
|
} else {
|
|
1346
|
-
|
|
1401
|
+
out_parsed_block->SetOwnedValue(std::move(block_holder));
|
|
1347
1402
|
}
|
|
1348
1403
|
}
|
|
1349
1404
|
|
|
@@ -1355,8 +1410,8 @@ Status BlockBasedTable::GetDataBlockFromCache(
|
|
|
1355
1410
|
template <typename TBlocklike>
|
|
1356
1411
|
Status BlockBasedTable::PutDataBlockToCache(
|
|
1357
1412
|
const Slice& cache_key, Cache* block_cache, Cache* block_cache_compressed,
|
|
1358
|
-
CachableEntry<TBlocklike>*
|
|
1359
|
-
CompressionType
|
|
1413
|
+
CachableEntry<TBlocklike>* out_parsed_block, BlockContents&& block_contents,
|
|
1414
|
+
CompressionType block_comp_type,
|
|
1360
1415
|
const UncompressionDict& uncompression_dict,
|
|
1361
1416
|
MemoryAllocator* memory_allocator, BlockType block_type,
|
|
1362
1417
|
GetContext* get_context) const {
|
|
@@ -1371,22 +1426,22 @@ Status BlockBasedTable::PutDataBlockToCache(
|
|
|
1371
1426
|
block_type != BlockType::kData
|
|
1372
1427
|
? Cache::Priority::HIGH
|
|
1373
1428
|
: Cache::Priority::LOW;
|
|
1374
|
-
assert(
|
|
1375
|
-
assert(
|
|
1429
|
+
assert(out_parsed_block);
|
|
1430
|
+
assert(out_parsed_block->IsEmpty());
|
|
1376
1431
|
|
|
1377
1432
|
Status s;
|
|
1378
1433
|
Statistics* statistics = ioptions.stats;
|
|
1379
1434
|
|
|
1380
1435
|
std::unique_ptr<TBlocklike> block_holder;
|
|
1381
|
-
if (
|
|
1436
|
+
if (block_comp_type != kNoCompression) {
|
|
1382
1437
|
// Retrieve the uncompressed contents into a new buffer
|
|
1383
1438
|
BlockContents uncompressed_block_contents;
|
|
1384
|
-
UncompressionContext context(
|
|
1385
|
-
UncompressionInfo info(context, uncompression_dict,
|
|
1386
|
-
s =
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1439
|
+
UncompressionContext context(block_comp_type);
|
|
1440
|
+
UncompressionInfo info(context, uncompression_dict, block_comp_type);
|
|
1441
|
+
s = UncompressBlockData(info, block_contents.data.data(),
|
|
1442
|
+
block_contents.data.size(),
|
|
1443
|
+
&uncompressed_block_contents, format_version,
|
|
1444
|
+
ioptions, memory_allocator);
|
|
1390
1445
|
if (!s.ok()) {
|
|
1391
1446
|
return s;
|
|
1392
1447
|
}
|
|
@@ -1397,53 +1452,51 @@ Status BlockBasedTable::PutDataBlockToCache(
|
|
|
1397
1452
|
rep_->table_options.filter_policy.get()));
|
|
1398
1453
|
} else {
|
|
1399
1454
|
block_holder.reset(BlocklikeTraits<TBlocklike>::Create(
|
|
1400
|
-
std::move(
|
|
1455
|
+
std::move(block_contents), read_amp_bytes_per_bit, statistics,
|
|
1401
1456
|
rep_->blocks_definitely_zstd_compressed,
|
|
1402
1457
|
rep_->table_options.filter_policy.get()));
|
|
1403
1458
|
}
|
|
1404
1459
|
|
|
1405
1460
|
// Insert compressed block into compressed block cache.
|
|
1406
1461
|
// Release the hold on the compressed cache entry immediately.
|
|
1407
|
-
if (block_cache_compressed != nullptr &&
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
assert(raw_block_contents->is_raw_block);
|
|
1462
|
+
if (block_cache_compressed != nullptr && block_comp_type != kNoCompression &&
|
|
1463
|
+
block_contents.own_bytes()) {
|
|
1464
|
+
assert(block_contents.has_trailer);
|
|
1411
1465
|
assert(!cache_key.empty());
|
|
1412
1466
|
|
|
1413
|
-
// We cannot directly put
|
|
1467
|
+
// We cannot directly put block_contents because this could point to
|
|
1414
1468
|
// an object in the stack.
|
|
1415
|
-
|
|
1416
|
-
|
|
1469
|
+
auto block_cont_for_comp_cache =
|
|
1470
|
+
std::make_unique<BlockContents>(std::move(block_contents));
|
|
1471
|
+
size_t charge = block_cont_for_comp_cache->ApproximateMemoryUsage();
|
|
1417
1472
|
s = InsertEntryToCache(
|
|
1418
1473
|
rep_->ioptions.lowest_used_cache_tier, block_cache_compressed,
|
|
1419
1474
|
cache_key,
|
|
1420
1475
|
BlocklikeTraits<BlockContents>::GetCacheItemHelper(block_type),
|
|
1421
|
-
block_cont_for_comp_cache,
|
|
1422
|
-
block_cont_for_comp_cache->ApproximateMemoryUsage(), nullptr,
|
|
1476
|
+
std::move(block_cont_for_comp_cache), charge, nullptr,
|
|
1423
1477
|
Cache::Priority::LOW);
|
|
1424
1478
|
|
|
1425
|
-
BlockContents* block_cont_raw_ptr = block_cont_for_comp_cache.release();
|
|
1426
1479
|
if (s.ok()) {
|
|
1427
1480
|
// Avoid the following code to delete this cached block.
|
|
1428
1481
|
RecordTick(statistics, BLOCK_CACHE_COMPRESSED_ADD);
|
|
1429
1482
|
} else {
|
|
1430
1483
|
RecordTick(statistics, BLOCK_CACHE_COMPRESSED_ADD_FAILURES);
|
|
1431
|
-
delete block_cont_raw_ptr;
|
|
1432
1484
|
}
|
|
1433
1485
|
}
|
|
1434
1486
|
|
|
1435
1487
|
// insert into uncompressed block cache
|
|
1436
1488
|
if (block_cache != nullptr && block_holder->own_bytes()) {
|
|
1437
1489
|
size_t charge = block_holder->ApproximateMemoryUsage();
|
|
1490
|
+
auto block_holder_raw_ptr = block_holder.get();
|
|
1438
1491
|
Cache::Handle* cache_handle = nullptr;
|
|
1439
1492
|
s = InsertEntryToCache(
|
|
1440
1493
|
rep_->ioptions.lowest_used_cache_tier, block_cache, cache_key,
|
|
1441
1494
|
BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type),
|
|
1442
|
-
block_holder, charge, &cache_handle, priority);
|
|
1495
|
+
std::move(block_holder), charge, &cache_handle, priority);
|
|
1443
1496
|
if (s.ok()) {
|
|
1444
1497
|
assert(cache_handle != nullptr);
|
|
1445
|
-
|
|
1446
|
-
|
|
1498
|
+
out_parsed_block->SetCachedValue(block_holder_raw_ptr, block_cache,
|
|
1499
|
+
cache_handle);
|
|
1447
1500
|
|
|
1448
1501
|
UpdateCacheInsertionMetrics(block_type, get_context, charge,
|
|
1449
1502
|
s.IsOkOverwritten(), rep_->ioptions.stats);
|
|
@@ -1451,7 +1504,7 @@ Status BlockBasedTable::PutDataBlockToCache(
|
|
|
1451
1504
|
RecordTick(statistics, BLOCK_CACHE_ADD_FAILURES);
|
|
1452
1505
|
}
|
|
1453
1506
|
} else {
|
|
1454
|
-
|
|
1507
|
+
out_parsed_block->SetOwnedValue(std::move(block_holder));
|
|
1455
1508
|
}
|
|
1456
1509
|
|
|
1457
1510
|
return s;
|
|
@@ -1532,10 +1585,10 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1532
1585
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1533
1586
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1534
1587
|
const bool wait, const bool for_compaction,
|
|
1535
|
-
CachableEntry<TBlocklike>*
|
|
1588
|
+
CachableEntry<TBlocklike>* out_parsed_block, BlockType block_type,
|
|
1536
1589
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
1537
1590
|
BlockContents* contents, bool async_read) const {
|
|
1538
|
-
assert(
|
|
1591
|
+
assert(out_parsed_block != nullptr);
|
|
1539
1592
|
const bool no_io = (ro.read_tier == kBlockCacheTier);
|
|
1540
1593
|
Cache* block_cache = rep_->table_options.block_cache.get();
|
|
1541
1594
|
Cache* block_cache_compressed =
|
|
@@ -1555,11 +1608,11 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1555
1608
|
|
|
1556
1609
|
if (!contents) {
|
|
1557
1610
|
s = GetDataBlockFromCache(key, block_cache, block_cache_compressed, ro,
|
|
1558
|
-
|
|
1559
|
-
wait, get_context);
|
|
1611
|
+
out_parsed_block, uncompression_dict,
|
|
1612
|
+
block_type, wait, get_context);
|
|
1560
1613
|
// Value could still be null at this point, so check the cache handle
|
|
1561
1614
|
// and update the read pattern for prefetching
|
|
1562
|
-
if (
|
|
1615
|
+
if (out_parsed_block->GetValue() || out_parsed_block->GetCacheHandle()) {
|
|
1563
1616
|
// TODO(haoyu): Differentiate cache hit on uncompressed block cache and
|
|
1564
1617
|
// compressed block cache.
|
|
1565
1618
|
is_cache_hit = true;
|
|
@@ -1576,25 +1629,26 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1576
1629
|
|
|
1577
1630
|
// Can't find the block from the cache. If I/O is allowed, read from the
|
|
1578
1631
|
// file.
|
|
1579
|
-
if (
|
|
1580
|
-
|
|
1632
|
+
if (out_parsed_block->GetValue() == nullptr &&
|
|
1633
|
+
out_parsed_block->GetCacheHandle() == nullptr && !no_io &&
|
|
1634
|
+
ro.fill_cache) {
|
|
1581
1635
|
Statistics* statistics = rep_->ioptions.stats;
|
|
1582
1636
|
const bool maybe_compressed =
|
|
1583
1637
|
block_type != BlockType::kFilter &&
|
|
1584
1638
|
block_type != BlockType::kCompressionDictionary &&
|
|
1585
1639
|
rep_->blocks_maybe_compressed;
|
|
1586
1640
|
const bool do_uncompress = maybe_compressed && !block_cache_compressed;
|
|
1587
|
-
CompressionType
|
|
1588
|
-
|
|
1641
|
+
CompressionType contents_comp_type;
|
|
1642
|
+
// Maybe serialized or uncompressed
|
|
1643
|
+
BlockContents tmp_contents;
|
|
1589
1644
|
if (!contents) {
|
|
1590
1645
|
Histograms histogram = for_compaction ? READ_BLOCK_COMPACTION_MICROS
|
|
1591
1646
|
: READ_BLOCK_GET_MICROS;
|
|
1592
1647
|
StopWatch sw(rep_->ioptions.clock, statistics, histogram);
|
|
1593
1648
|
BlockFetcher block_fetcher(
|
|
1594
1649
|
rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle,
|
|
1595
|
-
&
|
|
1596
|
-
|
|
1597
|
-
rep_->persistent_cache_options,
|
|
1650
|
+
&tmp_contents, rep_->ioptions, do_uncompress, maybe_compressed,
|
|
1651
|
+
block_type, uncompression_dict, rep_->persistent_cache_options,
|
|
1598
1652
|
GetMemoryAllocator(rep_->table_options),
|
|
1599
1653
|
GetMemoryAllocatorForCompressedBlock(rep_->table_options));
|
|
1600
1654
|
|
|
@@ -1609,8 +1663,8 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1609
1663
|
s = block_fetcher.ReadBlockContents();
|
|
1610
1664
|
}
|
|
1611
1665
|
|
|
1612
|
-
|
|
1613
|
-
contents = &
|
|
1666
|
+
contents_comp_type = block_fetcher.get_compression_type();
|
|
1667
|
+
contents = &tmp_contents;
|
|
1614
1668
|
if (get_context) {
|
|
1615
1669
|
switch (block_type) {
|
|
1616
1670
|
case BlockType::kIndex:
|
|
@@ -1625,15 +1679,15 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1625
1679
|
}
|
|
1626
1680
|
}
|
|
1627
1681
|
} else {
|
|
1628
|
-
|
|
1682
|
+
contents_comp_type = GetBlockCompressionType(*contents);
|
|
1629
1683
|
}
|
|
1630
1684
|
|
|
1631
1685
|
if (s.ok()) {
|
|
1632
1686
|
// If filling cache is allowed and a cache is configured, try to put the
|
|
1633
1687
|
// block to the cache.
|
|
1634
1688
|
s = PutDataBlockToCache(
|
|
1635
|
-
key, block_cache, block_cache_compressed,
|
|
1636
|
-
|
|
1689
|
+
key, block_cache, block_cache_compressed, out_parsed_block,
|
|
1690
|
+
std::move(*contents), contents_comp_type, uncompression_dict,
|
|
1637
1691
|
GetMemoryAllocator(rep_->table_options), block_type, get_context);
|
|
1638
1692
|
}
|
|
1639
1693
|
}
|
|
@@ -1644,12 +1698,12 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1644
1698
|
lookup_context) {
|
|
1645
1699
|
size_t usage = 0;
|
|
1646
1700
|
uint64_t nkeys = 0;
|
|
1647
|
-
if (
|
|
1701
|
+
if (out_parsed_block->GetValue()) {
|
|
1648
1702
|
// Approximate the number of keys in the block using restarts.
|
|
1649
|
-
nkeys =
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
usage =
|
|
1703
|
+
nkeys = rep_->table_options.block_restart_interval *
|
|
1704
|
+
BlocklikeTraits<TBlocklike>::GetNumRestarts(
|
|
1705
|
+
*out_parsed_block->GetValue());
|
|
1706
|
+
usage = out_parsed_block->GetValue()->ApproximateMemoryUsage();
|
|
1653
1707
|
}
|
|
1654
1708
|
TraceType trace_block_type = TraceType::kTraceMax;
|
|
1655
1709
|
switch (block_type) {
|
|
@@ -1704,7 +1758,7 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|
|
1704
1758
|
}
|
|
1705
1759
|
}
|
|
1706
1760
|
|
|
1707
|
-
assert(s.ok() ||
|
|
1761
|
+
assert(s.ok() || out_parsed_block->GetValue() == nullptr);
|
|
1708
1762
|
return s;
|
|
1709
1763
|
}
|
|
1710
1764
|
|
|
@@ -1712,32 +1766,33 @@ template <typename TBlocklike>
|
|
|
1712
1766
|
Status BlockBasedTable::RetrieveBlock(
|
|
1713
1767
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1714
1768
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1715
|
-
CachableEntry<TBlocklike>*
|
|
1769
|
+
CachableEntry<TBlocklike>* out_parsed_block, BlockType block_type,
|
|
1716
1770
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
1717
1771
|
bool for_compaction, bool use_cache, bool wait_for_cache,
|
|
1718
1772
|
bool async_read) const {
|
|
1719
|
-
assert(
|
|
1720
|
-
assert(
|
|
1773
|
+
assert(out_parsed_block);
|
|
1774
|
+
assert(out_parsed_block->IsEmpty());
|
|
1721
1775
|
|
|
1722
1776
|
Status s;
|
|
1723
1777
|
if (use_cache) {
|
|
1724
|
-
s = MaybeReadBlockAndLoadToCache(
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1778
|
+
s = MaybeReadBlockAndLoadToCache(prefetch_buffer, ro, handle,
|
|
1779
|
+
uncompression_dict, wait_for_cache,
|
|
1780
|
+
for_compaction, out_parsed_block,
|
|
1781
|
+
block_type, get_context, lookup_context,
|
|
1782
|
+
/*contents=*/nullptr, async_read);
|
|
1728
1783
|
|
|
1729
1784
|
if (!s.ok()) {
|
|
1730
1785
|
return s;
|
|
1731
1786
|
}
|
|
1732
1787
|
|
|
1733
|
-
if (
|
|
1734
|
-
|
|
1788
|
+
if (out_parsed_block->GetValue() != nullptr ||
|
|
1789
|
+
out_parsed_block->GetCacheHandle() != nullptr) {
|
|
1735
1790
|
assert(s.ok());
|
|
1736
1791
|
return s;
|
|
1737
1792
|
}
|
|
1738
1793
|
}
|
|
1739
1794
|
|
|
1740
|
-
assert(
|
|
1795
|
+
assert(out_parsed_block->IsEmpty());
|
|
1741
1796
|
|
|
1742
1797
|
const bool no_io = ro.read_tier == kBlockCacheTier;
|
|
1743
1798
|
if (no_io) {
|
|
@@ -1785,7 +1840,7 @@ Status BlockBasedTable::RetrieveBlock(
|
|
|
1785
1840
|
return s;
|
|
1786
1841
|
}
|
|
1787
1842
|
|
|
1788
|
-
|
|
1843
|
+
out_parsed_block->SetOwnedValue(std::move(block));
|
|
1789
1844
|
|
|
1790
1845
|
assert(s.ok());
|
|
1791
1846
|
return s;
|
|
@@ -1796,7 +1851,7 @@ Status BlockBasedTable::RetrieveBlock(
|
|
|
1796
1851
|
template Status BlockBasedTable::RetrieveBlock<BlockContents>(
|
|
1797
1852
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1798
1853
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1799
|
-
CachableEntry<BlockContents>*
|
|
1854
|
+
CachableEntry<BlockContents>* out_parsed_block, BlockType block_type,
|
|
1800
1855
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
1801
1856
|
bool for_compaction, bool use_cache, bool wait_for_cache,
|
|
1802
1857
|
bool async_read) const;
|
|
@@ -1804,15 +1859,15 @@ template Status BlockBasedTable::RetrieveBlock<BlockContents>(
|
|
|
1804
1859
|
template Status BlockBasedTable::RetrieveBlock<ParsedFullFilterBlock>(
|
|
1805
1860
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1806
1861
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1807
|
-
CachableEntry<ParsedFullFilterBlock>*
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
bool async_read) const;
|
|
1862
|
+
CachableEntry<ParsedFullFilterBlock>* out_parsed_block,
|
|
1863
|
+
BlockType block_type, GetContext* get_context,
|
|
1864
|
+
BlockCacheLookupContext* lookup_context, bool for_compaction,
|
|
1865
|
+
bool use_cache, bool wait_for_cache, bool async_read) const;
|
|
1811
1866
|
|
|
1812
1867
|
template Status BlockBasedTable::RetrieveBlock<Block>(
|
|
1813
1868
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1814
1869
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1815
|
-
CachableEntry<Block>*
|
|
1870
|
+
CachableEntry<Block>* out_parsed_block, BlockType block_type,
|
|
1816
1871
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
1817
1872
|
bool for_compaction, bool use_cache, bool wait_for_cache,
|
|
1818
1873
|
bool async_read) const;
|
|
@@ -1820,7 +1875,7 @@ template Status BlockBasedTable::RetrieveBlock<Block>(
|
|
|
1820
1875
|
template Status BlockBasedTable::RetrieveBlock<UncompressionDict>(
|
|
1821
1876
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
|
1822
1877
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
|
1823
|
-
CachableEntry<UncompressionDict>*
|
|
1878
|
+
CachableEntry<UncompressionDict>* out_parsed_block, BlockType block_type,
|
|
1824
1879
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
|
1825
1880
|
bool for_compaction, bool use_cache, bool wait_for_cache,
|
|
1826
1881
|
bool async_read) const;
|