@nxtedition/rocksdb 7.1.14 → 7.1.15
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
|
@@ -1330,10 +1330,13 @@ class TestSecondaryCache : public SecondaryCache {
|
|
|
1330
1330
|
}
|
|
1331
1331
|
std::unique_ptr<SecondaryCacheResultHandle> Lookup(
|
|
1332
1332
|
const Slice& /*key*/, const Cache::CreateCallback& /*create_cb*/,
|
|
1333
|
-
bool /*wait*/, bool& is_in_sec_cache) override {
|
|
1333
|
+
bool /*wait*/, bool /*advise_erase*/, bool& is_in_sec_cache) override {
|
|
1334
1334
|
is_in_sec_cache = true;
|
|
1335
1335
|
return nullptr;
|
|
1336
1336
|
}
|
|
1337
|
+
|
|
1338
|
+
bool SupportForceErase() const override { return false; }
|
|
1339
|
+
|
|
1337
1340
|
void Erase(const Slice& /*key*/) override {}
|
|
1338
1341
|
|
|
1339
1342
|
// Wait for a collection of handles to become ready
|
|
@@ -697,7 +697,7 @@ ReadOptions::ReadOptions()
|
|
|
697
697
|
value_size_soft_limit(std::numeric_limits<uint64_t>::max()),
|
|
698
698
|
adaptive_readahead(false),
|
|
699
699
|
async_io(false),
|
|
700
|
-
optimize_multiget_for_io(
|
|
700
|
+
optimize_multiget_for_io(true) {}
|
|
701
701
|
|
|
702
702
|
ReadOptions::ReadOptions(bool cksum, bool cache)
|
|
703
703
|
: snapshot(nullptr),
|
|
@@ -723,6 +723,6 @@ ReadOptions::ReadOptions(bool cksum, bool cache)
|
|
|
723
723
|
value_size_soft_limit(std::numeric_limits<uint64_t>::max()),
|
|
724
724
|
adaptive_readahead(false),
|
|
725
725
|
async_io(false),
|
|
726
|
-
optimize_multiget_for_io(
|
|
726
|
+
optimize_multiget_for_io(true) {}
|
|
727
727
|
|
|
728
728
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -198,7 +198,8 @@ TEST_F(OptionsSettableTest, BlockBasedTableOptionsAllFieldsSettable) {
|
|
|
198
198
|
"block_align=true;"
|
|
199
199
|
"max_auto_readahead_size=0;"
|
|
200
200
|
"prepopulate_block_cache=kDisable;"
|
|
201
|
-
"initial_auto_readahead_size=0"
|
|
201
|
+
"initial_auto_readahead_size=0;"
|
|
202
|
+
"num_file_reads_for_auto_readahead=0",
|
|
202
203
|
new_bbto));
|
|
203
204
|
|
|
204
205
|
ASSERT_EQ(unset_bytes_base,
|
|
@@ -11,6 +11,7 @@ LIB_SOURCES = \
|
|
|
11
11
|
cache/compressed_secondary_cache.cc \
|
|
12
12
|
cache/sharded_cache.cc \
|
|
13
13
|
db/arena_wrapped_db_iter.cc \
|
|
14
|
+
db/blob/blob_contents.cc \
|
|
14
15
|
db/blob/blob_fetcher.cc \
|
|
15
16
|
db/blob/blob_file_addition.cc \
|
|
16
17
|
db/blob/blob_file_builder.cc \
|
|
@@ -73,7 +74,7 @@ LIB_SOURCES = \
|
|
|
73
74
|
db/merge_helper.cc \
|
|
74
75
|
db/merge_operator.cc \
|
|
75
76
|
db/output_validator.cc \
|
|
76
|
-
db/
|
|
77
|
+
db/periodic_task_scheduler.cc \
|
|
77
78
|
db/range_del_aggregator.cc \
|
|
78
79
|
db/range_tombstone_fragmenter.cc \
|
|
79
80
|
db/repair.cc \
|
|
@@ -239,6 +240,7 @@ LIB_SOURCES = \
|
|
|
239
240
|
util/slice.cc \
|
|
240
241
|
util/file_checksum_helper.cc \
|
|
241
242
|
util/status.cc \
|
|
243
|
+
util/stderr_logger.cc \
|
|
242
244
|
util/string_util.cc \
|
|
243
245
|
util/thread_local.cc \
|
|
244
246
|
util/threadpool_imp.cc \
|
|
@@ -500,7 +502,7 @@ TEST_MAIN_SOURCES = \
|
|
|
500
502
|
db/obsolete_files_test.cc \
|
|
501
503
|
db/options_file_test.cc \
|
|
502
504
|
db/perf_context_test.cc \
|
|
503
|
-
db/
|
|
505
|
+
db/periodic_task_scheduler_test.cc \
|
|
504
506
|
db/plain_table_db_test.cc \
|
|
505
507
|
db/prefix_test.cc \
|
|
506
508
|
db/repair_test.cc \
|
|
@@ -137,18 +137,19 @@ class BlockReadAmpBitmap {
|
|
|
137
137
|
uint32_t rnd_;
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
// partitions), range deletion blocks, properties blocks, metaindex
|
|
144
|
-
// as well as the top level of the partitioned filter structure (which
|
|
145
|
-
// actually an index of the filter partitions). It is NOT suitable for
|
|
140
|
+
// class Block is the uncompressed and "parsed" form for blocks containing
|
|
141
|
+
// key-value pairs. (See BlockContents comments for more on terminology.)
|
|
142
|
+
// This includes the in-memory representation of data blocks, index blocks
|
|
143
|
+
// (including partitions), range deletion blocks, properties blocks, metaindex
|
|
144
|
+
// blocks, as well as the top level of the partitioned filter structure (which
|
|
145
|
+
// is actually an index of the filter partitions). It is NOT suitable for
|
|
146
146
|
// compressed blocks in general, filter blocks/partitions, or compression
|
|
147
|
-
// dictionaries
|
|
148
|
-
// Use BlockContents directly for those.
|
|
147
|
+
// dictionaries.
|
|
149
148
|
//
|
|
150
149
|
// See https://github.com/facebook/rocksdb/wiki/Rocksdb-BlockBasedTable-Format
|
|
151
150
|
// for details of the format and the various block types.
|
|
151
|
+
//
|
|
152
|
+
// TODO: Rename to ParsedKvBlock?
|
|
152
153
|
class Block {
|
|
153
154
|
public:
|
|
154
155
|
// Initialize the block with the specified contents.
|
|
@@ -104,15 +104,15 @@ FilterBlockBuilder* CreateFilterBlockBuilder(
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
bool GoodCompressionRatio(size_t compressed_size, size_t
|
|
107
|
+
bool GoodCompressionRatio(size_t compressed_size, size_t uncomp_size) {
|
|
108
108
|
// Check to see if compressed less than 12.5%
|
|
109
|
-
return compressed_size <
|
|
109
|
+
return compressed_size < uncomp_size - (uncomp_size / 8u);
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
} // namespace
|
|
113
113
|
|
|
114
114
|
// format_version is the block format as defined in include/rocksdb/table.h
|
|
115
|
-
Slice CompressBlock(const Slice&
|
|
115
|
+
Slice CompressBlock(const Slice& uncompressed_data, const CompressionInfo& info,
|
|
116
116
|
CompressionType* type, uint32_t format_version,
|
|
117
117
|
bool do_sample, std::string* compressed_output,
|
|
118
118
|
std::string* sampled_output_fast,
|
|
@@ -139,7 +139,8 @@ Slice CompressBlock(const Slice& raw, const CompressionInfo& info,
|
|
|
139
139
|
CompressionDict::GetEmptyDict(), c,
|
|
140
140
|
info.SampleForCompression());
|
|
141
141
|
|
|
142
|
-
CompressData(
|
|
142
|
+
CompressData(uncompressed_data, info_tmp,
|
|
143
|
+
GetCompressFormatForVersion(format_version),
|
|
143
144
|
sampled_output_fast);
|
|
144
145
|
}
|
|
145
146
|
|
|
@@ -152,29 +153,32 @@ Slice CompressBlock(const Slice& raw, const CompressionInfo& info,
|
|
|
152
153
|
CompressionDict::GetEmptyDict(), c,
|
|
153
154
|
info.SampleForCompression());
|
|
154
155
|
|
|
155
|
-
CompressData(
|
|
156
|
+
CompressData(uncompressed_data, info_tmp,
|
|
157
|
+
GetCompressFormatForVersion(format_version),
|
|
156
158
|
sampled_output_slow);
|
|
157
159
|
}
|
|
158
160
|
}
|
|
159
161
|
|
|
160
162
|
if (info.type() == kNoCompression) {
|
|
161
163
|
*type = kNoCompression;
|
|
162
|
-
return
|
|
164
|
+
return uncompressed_data;
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
// Actually compress the data; if the compression method is not supported,
|
|
166
168
|
// or the compression fails etc., just fall back to uncompressed
|
|
167
|
-
if (!CompressData(
|
|
169
|
+
if (!CompressData(uncompressed_data, info,
|
|
170
|
+
GetCompressFormatForVersion(format_version),
|
|
168
171
|
compressed_output)) {
|
|
169
172
|
*type = kNoCompression;
|
|
170
|
-
return
|
|
173
|
+
return uncompressed_data;
|
|
171
174
|
}
|
|
172
175
|
|
|
173
176
|
// Check the compression ratio; if it's not good enough, just fall back to
|
|
174
177
|
// uncompressed
|
|
175
|
-
if (!GoodCompressionRatio(compressed_output->size(),
|
|
178
|
+
if (!GoodCompressionRatio(compressed_output->size(),
|
|
179
|
+
uncompressed_data.size())) {
|
|
176
180
|
*type = kNoCompression;
|
|
177
|
-
return
|
|
181
|
+
return uncompressed_data;
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
*type = info.type();
|
|
@@ -216,7 +220,7 @@ class BlockBasedTableBuilder::BlockBasedTablePropertiesCollector
|
|
|
216
220
|
return Status::OK();
|
|
217
221
|
}
|
|
218
222
|
|
|
219
|
-
virtual void BlockAdd(uint64_t /*
|
|
223
|
+
virtual void BlockAdd(uint64_t /* block_uncomp_bytes */,
|
|
220
224
|
uint64_t /* block_compressed_bytes_fast */,
|
|
221
225
|
uint64_t /* block_compressed_bytes_slow */) override {
|
|
222
226
|
// Intentionally left blank. No interest in collecting stats for
|
|
@@ -665,21 +669,21 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
|
|
|
665
669
|
class FileSizeEstimator {
|
|
666
670
|
public:
|
|
667
671
|
explicit FileSizeEstimator()
|
|
668
|
-
:
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
+
: uncomp_bytes_compressed(0),
|
|
673
|
+
uncomp_bytes_curr_block(0),
|
|
674
|
+
uncomp_bytes_curr_block_set(false),
|
|
675
|
+
uncomp_bytes_inflight(0),
|
|
672
676
|
blocks_inflight(0),
|
|
673
677
|
curr_compression_ratio(0),
|
|
674
678
|
estimated_file_size(0) {}
|
|
675
679
|
|
|
676
680
|
// Estimate file size when a block is about to be emitted to
|
|
677
681
|
// compression thread
|
|
678
|
-
void EmitBlock(uint64_t
|
|
679
|
-
uint64_t
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
682
|
+
void EmitBlock(uint64_t uncomp_block_size, uint64_t curr_file_size) {
|
|
683
|
+
uint64_t new_uncomp_bytes_inflight =
|
|
684
|
+
uncomp_bytes_inflight.fetch_add(uncomp_block_size,
|
|
685
|
+
std::memory_order_relaxed) +
|
|
686
|
+
uncomp_block_size;
|
|
683
687
|
|
|
684
688
|
uint64_t new_blocks_inflight =
|
|
685
689
|
blocks_inflight.fetch_add(1, std::memory_order_relaxed) + 1;
|
|
@@ -687,7 +691,7 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
|
|
|
687
691
|
estimated_file_size.store(
|
|
688
692
|
curr_file_size +
|
|
689
693
|
static_cast<uint64_t>(
|
|
690
|
-
static_cast<double>(
|
|
694
|
+
static_cast<double>(new_uncomp_bytes_inflight) *
|
|
691
695
|
curr_compression_ratio.load(std::memory_order_relaxed)) +
|
|
692
696
|
new_blocks_inflight * kBlockTrailerSize,
|
|
693
697
|
std::memory_order_relaxed);
|
|
@@ -696,24 +700,24 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
|
|
|
696
700
|
// Estimate file size when a block is already reaped from
|
|
697
701
|
// compression thread
|
|
698
702
|
void ReapBlock(uint64_t compressed_block_size, uint64_t curr_file_size) {
|
|
699
|
-
assert(
|
|
703
|
+
assert(uncomp_bytes_curr_block_set);
|
|
700
704
|
|
|
701
|
-
uint64_t
|
|
702
|
-
|
|
703
|
-
assert(
|
|
705
|
+
uint64_t new_uncomp_bytes_compressed =
|
|
706
|
+
uncomp_bytes_compressed + uncomp_bytes_curr_block;
|
|
707
|
+
assert(new_uncomp_bytes_compressed > 0);
|
|
704
708
|
|
|
705
709
|
curr_compression_ratio.store(
|
|
706
710
|
(curr_compression_ratio.load(std::memory_order_relaxed) *
|
|
707
|
-
|
|
711
|
+
uncomp_bytes_compressed +
|
|
708
712
|
compressed_block_size) /
|
|
709
|
-
static_cast<double>(
|
|
713
|
+
static_cast<double>(new_uncomp_bytes_compressed),
|
|
710
714
|
std::memory_order_relaxed);
|
|
711
|
-
|
|
715
|
+
uncomp_bytes_compressed = new_uncomp_bytes_compressed;
|
|
712
716
|
|
|
713
|
-
uint64_t
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
+
uint64_t new_uncomp_bytes_inflight =
|
|
718
|
+
uncomp_bytes_inflight.fetch_sub(uncomp_bytes_curr_block,
|
|
719
|
+
std::memory_order_relaxed) -
|
|
720
|
+
uncomp_bytes_curr_block;
|
|
717
721
|
|
|
718
722
|
uint64_t new_blocks_inflight =
|
|
719
723
|
blocks_inflight.fetch_sub(1, std::memory_order_relaxed) - 1;
|
|
@@ -721,12 +725,12 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
|
|
|
721
725
|
estimated_file_size.store(
|
|
722
726
|
curr_file_size +
|
|
723
727
|
static_cast<uint64_t>(
|
|
724
|
-
static_cast<double>(
|
|
728
|
+
static_cast<double>(new_uncomp_bytes_inflight) *
|
|
725
729
|
curr_compression_ratio.load(std::memory_order_relaxed)) +
|
|
726
730
|
new_blocks_inflight * kBlockTrailerSize,
|
|
727
731
|
std::memory_order_relaxed);
|
|
728
732
|
|
|
729
|
-
|
|
733
|
+
uncomp_bytes_curr_block_set = false;
|
|
730
734
|
}
|
|
731
735
|
|
|
732
736
|
void SetEstimatedFileSize(uint64_t size) {
|
|
@@ -737,24 +741,24 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
|
|
|
737
741
|
return estimated_file_size.load(std::memory_order_relaxed);
|
|
738
742
|
}
|
|
739
743
|
|
|
740
|
-
void
|
|
741
|
-
|
|
742
|
-
|
|
744
|
+
void SetCurrBlockUncompSize(uint64_t size) {
|
|
745
|
+
uncomp_bytes_curr_block = size;
|
|
746
|
+
uncomp_bytes_curr_block_set = true;
|
|
743
747
|
}
|
|
744
748
|
|
|
745
749
|
private:
|
|
746
|
-
//
|
|
747
|
-
uint64_t
|
|
750
|
+
// Input bytes compressed so far.
|
|
751
|
+
uint64_t uncomp_bytes_compressed;
|
|
748
752
|
// Size of current block being appended.
|
|
749
|
-
uint64_t
|
|
750
|
-
// Whether
|
|
753
|
+
uint64_t uncomp_bytes_curr_block;
|
|
754
|
+
// Whether uncomp_bytes_curr_block has been set for next
|
|
751
755
|
// ReapBlock call.
|
|
752
|
-
bool
|
|
753
|
-
//
|
|
754
|
-
std::atomic<uint64_t>
|
|
756
|
+
bool uncomp_bytes_curr_block_set;
|
|
757
|
+
// Input bytes under compression and not appended yet.
|
|
758
|
+
std::atomic<uint64_t> uncomp_bytes_inflight;
|
|
755
759
|
// Number of blocks under compression and not appended yet.
|
|
756
760
|
std::atomic<uint64_t> blocks_inflight;
|
|
757
|
-
// Current compression ratio, maintained by
|
|
761
|
+
// Current compression ratio, maintained by BGWorkWriteMaybeCompressedBlock.
|
|
758
762
|
std::atomic<double> curr_compression_ratio;
|
|
759
763
|
// Estimated SST file size.
|
|
760
764
|
std::atomic<uint64_t> estimated_file_size;
|
|
@@ -1040,19 +1044,19 @@ void BlockBasedTableBuilder::WriteBlock(BlockBuilder* block,
|
|
|
1040
1044
|
BlockHandle* handle,
|
|
1041
1045
|
BlockType block_type) {
|
|
1042
1046
|
block->Finish();
|
|
1043
|
-
std::string
|
|
1044
|
-
|
|
1045
|
-
block->SwapAndReset(
|
|
1047
|
+
std::string uncompressed_block_data;
|
|
1048
|
+
uncompressed_block_data.reserve(rep_->table_options.block_size);
|
|
1049
|
+
block->SwapAndReset(uncompressed_block_data);
|
|
1046
1050
|
if (rep_->state == Rep::State::kBuffered) {
|
|
1047
1051
|
assert(block_type == BlockType::kData);
|
|
1048
|
-
rep_->data_block_buffers.emplace_back(std::move(
|
|
1052
|
+
rep_->data_block_buffers.emplace_back(std::move(uncompressed_block_data));
|
|
1049
1053
|
rep_->data_begin_offset += rep_->data_block_buffers.back().size();
|
|
1050
1054
|
return;
|
|
1051
1055
|
}
|
|
1052
|
-
WriteBlock(
|
|
1056
|
+
WriteBlock(uncompressed_block_data, handle, block_type);
|
|
1053
1057
|
}
|
|
1054
1058
|
|
|
1055
|
-
void BlockBasedTableBuilder::WriteBlock(const Slice&
|
|
1059
|
+
void BlockBasedTableBuilder::WriteBlock(const Slice& uncompressed_block_data,
|
|
1056
1060
|
BlockHandle* handle,
|
|
1057
1061
|
BlockType block_type) {
|
|
1058
1062
|
Rep* r = rep_;
|
|
@@ -1061,7 +1065,7 @@ void BlockBasedTableBuilder::WriteBlock(const Slice& raw_block_contents,
|
|
|
1061
1065
|
CompressionType type;
|
|
1062
1066
|
Status compress_status;
|
|
1063
1067
|
bool is_data_block = block_type == BlockType::kData;
|
|
1064
|
-
CompressAndVerifyBlock(
|
|
1068
|
+
CompressAndVerifyBlock(uncompressed_block_data, is_data_block,
|
|
1065
1069
|
*(r->compression_ctxs[0]), r->verify_ctxs[0].get(),
|
|
1066
1070
|
&(r->compressed_output), &(block_contents), &type,
|
|
1067
1071
|
&compress_status);
|
|
@@ -1070,7 +1074,8 @@ void BlockBasedTableBuilder::WriteBlock(const Slice& raw_block_contents,
|
|
|
1070
1074
|
return;
|
|
1071
1075
|
}
|
|
1072
1076
|
|
|
1073
|
-
|
|
1077
|
+
WriteMaybeCompressedBlock(block_contents, type, handle, block_type,
|
|
1078
|
+
&uncompressed_block_data);
|
|
1074
1079
|
r->compressed_output.clear();
|
|
1075
1080
|
if (is_data_block) {
|
|
1076
1081
|
r->props.data_size = r->get_offset();
|
|
@@ -1094,7 +1099,7 @@ void BlockBasedTableBuilder::BGWorkCompression(
|
|
|
1094
1099
|
}
|
|
1095
1100
|
|
|
1096
1101
|
void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
1097
|
-
const Slice&
|
|
1102
|
+
const Slice& uncompressed_block_data, bool is_data_block,
|
|
1098
1103
|
const CompressionContext& compression_ctx, UncompressionContext* verify_ctx,
|
|
1099
1104
|
std::string* compressed_output, Slice* block_contents,
|
|
1100
1105
|
CompressionType* type, Status* out_status) {
|
|
@@ -1116,9 +1121,9 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1116
1121
|
r->ioptions.clock,
|
|
1117
1122
|
ShouldReportDetailedTime(r->ioptions.env, r->ioptions.stats));
|
|
1118
1123
|
|
|
1119
|
-
if (is_status_ok &&
|
|
1124
|
+
if (is_status_ok && uncompressed_block_data.size() < kCompressionSizeLimit) {
|
|
1120
1125
|
if (is_data_block) {
|
|
1121
|
-
r->compressible_input_data_bytes.fetch_add(
|
|
1126
|
+
r->compressible_input_data_bytes.fetch_add(uncompressed_block_data.size(),
|
|
1122
1127
|
std::memory_order_relaxed);
|
|
1123
1128
|
}
|
|
1124
1129
|
const CompressionDict* compression_dict;
|
|
@@ -1135,14 +1140,14 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1135
1140
|
std::string sampled_output_fast;
|
|
1136
1141
|
std::string sampled_output_slow;
|
|
1137
1142
|
*block_contents = CompressBlock(
|
|
1138
|
-
|
|
1143
|
+
uncompressed_block_data, compression_info, type,
|
|
1139
1144
|
r->table_options.format_version, is_data_block /* do_sample */,
|
|
1140
1145
|
compressed_output, &sampled_output_fast, &sampled_output_slow);
|
|
1141
1146
|
|
|
1142
1147
|
if (sampled_output_slow.size() > 0 || sampled_output_fast.size() > 0) {
|
|
1143
1148
|
// Currently compression sampling is only enabled for data block.
|
|
1144
1149
|
assert(is_data_block);
|
|
1145
|
-
r->sampled_input_data_bytes.fetch_add(
|
|
1150
|
+
r->sampled_input_data_bytes.fetch_add(uncompressed_block_data.size(),
|
|
1146
1151
|
std::memory_order_relaxed);
|
|
1147
1152
|
r->sampled_output_slow_data_bytes.fetch_add(sampled_output_slow.size(),
|
|
1148
1153
|
std::memory_order_relaxed);
|
|
@@ -1151,7 +1156,7 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1151
1156
|
}
|
|
1152
1157
|
// notify collectors on block add
|
|
1153
1158
|
NotifyCollectTableCollectorsOnBlockAdd(
|
|
1154
|
-
r->table_properties_collectors,
|
|
1159
|
+
r->table_properties_collectors, uncompressed_block_data.size(),
|
|
1155
1160
|
sampled_output_fast.size(), sampled_output_slow.size());
|
|
1156
1161
|
|
|
1157
1162
|
// Some of the compression algorithms are known to be unreliable. If
|
|
@@ -1169,19 +1174,20 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1169
1174
|
BlockContents contents;
|
|
1170
1175
|
UncompressionInfo uncompression_info(*verify_ctx, *verify_dict,
|
|
1171
1176
|
r->compression_type);
|
|
1172
|
-
Status stat =
|
|
1177
|
+
Status stat = UncompressBlockData(
|
|
1173
1178
|
uncompression_info, block_contents->data(), block_contents->size(),
|
|
1174
1179
|
&contents, r->table_options.format_version, r->ioptions);
|
|
1175
1180
|
|
|
1176
1181
|
if (stat.ok()) {
|
|
1177
|
-
bool compressed_ok =
|
|
1182
|
+
bool compressed_ok =
|
|
1183
|
+
contents.data.compare(uncompressed_block_data) == 0;
|
|
1178
1184
|
if (!compressed_ok) {
|
|
1179
1185
|
// The result of the compression was invalid. abort.
|
|
1180
1186
|
abort_compression = true;
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1187
|
+
const char* const msg =
|
|
1188
|
+
"Decompressed block did not match pre-compression block";
|
|
1189
|
+
ROCKS_LOG_ERROR(r->ioptions.logger, "%s", msg);
|
|
1190
|
+
*out_status = Status::Corruption(msg);
|
|
1185
1191
|
}
|
|
1186
1192
|
} else {
|
|
1187
1193
|
// Decompression reported an error. abort.
|
|
@@ -1193,8 +1199,8 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1193
1199
|
} else {
|
|
1194
1200
|
// Block is too big to be compressed.
|
|
1195
1201
|
if (is_data_block) {
|
|
1196
|
-
r->uncompressible_input_data_bytes.fetch_add(
|
|
1197
|
-
|
|
1202
|
+
r->uncompressible_input_data_bytes.fetch_add(
|
|
1203
|
+
uncompressed_block_data.size(), std::memory_order_relaxed);
|
|
1198
1204
|
}
|
|
1199
1205
|
abort_compression = true;
|
|
1200
1206
|
}
|
|
@@ -1208,27 +1214,26 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
|
|
|
1208
1214
|
if (abort_compression) {
|
|
1209
1215
|
RecordTick(r->ioptions.stats, NUMBER_BLOCK_NOT_COMPRESSED);
|
|
1210
1216
|
*type = kNoCompression;
|
|
1211
|
-
*block_contents =
|
|
1217
|
+
*block_contents = uncompressed_block_data;
|
|
1212
1218
|
} else if (*type != kNoCompression) {
|
|
1213
1219
|
if (ShouldReportDetailedTime(r->ioptions.env, r->ioptions.stats)) {
|
|
1214
1220
|
RecordTimeToHistogram(r->ioptions.stats, COMPRESSION_TIMES_NANOS,
|
|
1215
1221
|
timer.ElapsedNanos());
|
|
1216
1222
|
}
|
|
1217
1223
|
RecordInHistogram(r->ioptions.stats, BYTES_COMPRESSED,
|
|
1218
|
-
|
|
1224
|
+
uncompressed_block_data.size());
|
|
1219
1225
|
RecordTick(r->ioptions.stats, NUMBER_BLOCK_COMPRESSED);
|
|
1220
1226
|
} else if (*type != r->compression_type) {
|
|
1221
1227
|
RecordTick(r->ioptions.stats, NUMBER_BLOCK_NOT_COMPRESSED);
|
|
1222
1228
|
}
|
|
1223
1229
|
}
|
|
1224
1230
|
|
|
1225
|
-
void BlockBasedTableBuilder::
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
BlockType block_type,
|
|
1229
|
-
const Slice* raw_block_contents) {
|
|
1231
|
+
void BlockBasedTableBuilder::WriteMaybeCompressedBlock(
|
|
1232
|
+
const Slice& block_contents, CompressionType type, BlockHandle* handle,
|
|
1233
|
+
BlockType block_type, const Slice* uncompressed_block_data) {
|
|
1230
1234
|
Rep* r = rep_;
|
|
1231
1235
|
bool is_data_block = block_type == BlockType::kData;
|
|
1236
|
+
// Old, misleading name of this function: WriteRawBlock
|
|
1232
1237
|
StopWatch sw(r->ioptions.clock, r->ioptions.stats, WRITE_RAW_BLOCK_MICROS);
|
|
1233
1238
|
handle->set_offset(r->get_offset());
|
|
1234
1239
|
handle->set_size(block_contents.size());
|
|
@@ -1259,7 +1264,7 @@ void BlockBasedTableBuilder::WriteRawBlock(const Slice& block_contents,
|
|
|
1259
1264
|
|
|
1260
1265
|
EncodeFixed32(trailer.data() + 1, checksum);
|
|
1261
1266
|
TEST_SYNC_POINT_CALLBACK(
|
|
1262
|
-
"BlockBasedTableBuilder::
|
|
1267
|
+
"BlockBasedTableBuilder::WriteMaybeCompressedBlock:TamperWithChecksum",
|
|
1263
1268
|
trailer.data());
|
|
1264
1269
|
{
|
|
1265
1270
|
IOStatus io_s = r->file->Append(Slice(trailer.data(), trailer.size()));
|
|
@@ -1287,8 +1292,9 @@ void BlockBasedTableBuilder::WriteRawBlock(const Slice& block_contents,
|
|
|
1287
1292
|
if (warm_cache) {
|
|
1288
1293
|
if (type == kNoCompression) {
|
|
1289
1294
|
s = InsertBlockInCacheHelper(block_contents, handle, block_type);
|
|
1290
|
-
} else if (
|
|
1291
|
-
s = InsertBlockInCacheHelper(*
|
|
1295
|
+
} else if (uncompressed_block_data != nullptr) {
|
|
1296
|
+
s = InsertBlockInCacheHelper(*uncompressed_block_data, handle,
|
|
1297
|
+
block_type);
|
|
1292
1298
|
}
|
|
1293
1299
|
if (!s.ok()) {
|
|
1294
1300
|
r->SetStatus(s);
|
|
@@ -1327,7 +1333,7 @@ void BlockBasedTableBuilder::WriteRawBlock(const Slice& block_contents,
|
|
|
1327
1333
|
}
|
|
1328
1334
|
}
|
|
1329
1335
|
|
|
1330
|
-
void BlockBasedTableBuilder::
|
|
1336
|
+
void BlockBasedTableBuilder::BGWorkWriteMaybeCompressedBlock() {
|
|
1331
1337
|
Rep* r = rep_;
|
|
1332
1338
|
ParallelCompressionRep::BlockRepSlot* slot = nullptr;
|
|
1333
1339
|
ParallelCompressionRep::BlockRep* block_rep = nullptr;
|
|
@@ -1354,9 +1360,11 @@ void BlockBasedTableBuilder::BGWorkWriteRawBlock() {
|
|
|
1354
1360
|
r->index_builder->OnKeyAdded(key);
|
|
1355
1361
|
}
|
|
1356
1362
|
|
|
1357
|
-
r->pc_rep->file_size_estimator.
|
|
1358
|
-
|
|
1359
|
-
|
|
1363
|
+
r->pc_rep->file_size_estimator.SetCurrBlockUncompSize(
|
|
1364
|
+
block_rep->data->size());
|
|
1365
|
+
WriteMaybeCompressedBlock(block_rep->compressed_contents,
|
|
1366
|
+
block_rep->compression_type, &r->pending_handle,
|
|
1367
|
+
BlockType::kData, &block_rep->contents);
|
|
1360
1368
|
if (!ok()) {
|
|
1361
1369
|
break;
|
|
1362
1370
|
}
|
|
@@ -1391,7 +1399,7 @@ void BlockBasedTableBuilder::StartParallelCompression() {
|
|
|
1391
1399
|
});
|
|
1392
1400
|
}
|
|
1393
1401
|
rep_->pc_rep->write_thread.reset(
|
|
1394
|
-
new port::Thread([this] {
|
|
1402
|
+
new port::Thread([this] { BGWorkWriteMaybeCompressedBlock(); }));
|
|
1395
1403
|
}
|
|
1396
1404
|
|
|
1397
1405
|
void BlockBasedTableBuilder::StopParallelCompression() {
|
|
@@ -1438,7 +1446,7 @@ Status BlockBasedTableBuilder::InsertBlockInCompressedCache(
|
|
|
1438
1446
|
BlockContents* block_contents_to_cache =
|
|
1439
1447
|
new BlockContents(std::move(ubuf), size);
|
|
1440
1448
|
#ifndef NDEBUG
|
|
1441
|
-
block_contents_to_cache->
|
|
1449
|
+
block_contents_to_cache->has_trailer = true;
|
|
1442
1450
|
#endif // NDEBUG
|
|
1443
1451
|
|
|
1444
1452
|
CacheKey key = BlockBasedTable::GetCacheKey(rep_->base_cache_key, *handle);
|
|
@@ -1567,8 +1575,8 @@ void BlockBasedTableBuilder::WriteFilterBlock(
|
|
|
1567
1575
|
BlockType btype = is_partitioned_filter && /* last */ s.ok()
|
|
1568
1576
|
? BlockType::kFilterPartitionIndex
|
|
1569
1577
|
: BlockType::kFilter;
|
|
1570
|
-
|
|
1571
|
-
|
|
1578
|
+
WriteMaybeCompressedBlock(filter_content, kNoCompression,
|
|
1579
|
+
&filter_block_handle, btype);
|
|
1572
1580
|
}
|
|
1573
1581
|
rep_->filter_builder->ResetFilterBitsBuilder();
|
|
1574
1582
|
}
|
|
@@ -1613,8 +1621,9 @@ void BlockBasedTableBuilder::WriteIndexBlock(
|
|
|
1613
1621
|
WriteBlock(index_blocks.index_block_contents, index_block_handle,
|
|
1614
1622
|
BlockType::kIndex);
|
|
1615
1623
|
} else {
|
|
1616
|
-
|
|
1617
|
-
|
|
1624
|
+
WriteMaybeCompressedBlock(index_blocks.index_block_contents,
|
|
1625
|
+
kNoCompression, index_block_handle,
|
|
1626
|
+
BlockType::kIndex);
|
|
1618
1627
|
}
|
|
1619
1628
|
}
|
|
1620
1629
|
// If there are more index partitions, finish them and write them out
|
|
@@ -1638,8 +1647,9 @@ void BlockBasedTableBuilder::WriteIndexBlock(
|
|
|
1638
1647
|
WriteBlock(index_blocks.index_block_contents, index_block_handle,
|
|
1639
1648
|
BlockType::kIndex);
|
|
1640
1649
|
} else {
|
|
1641
|
-
|
|
1642
|
-
|
|
1650
|
+
WriteMaybeCompressedBlock(index_blocks.index_block_contents,
|
|
1651
|
+
kNoCompression, index_block_handle,
|
|
1652
|
+
BlockType::kIndex);
|
|
1643
1653
|
}
|
|
1644
1654
|
// The last index_block_handle will be for the partition index block
|
|
1645
1655
|
}
|
|
@@ -1727,8 +1737,8 @@ void BlockBasedTableBuilder::WritePropertiesBlock(
|
|
|
1727
1737
|
Slice block_data = property_block_builder.Finish();
|
|
1728
1738
|
TEST_SYNC_POINT_CALLBACK(
|
|
1729
1739
|
"BlockBasedTableBuilder::WritePropertiesBlock:BlockData", &block_data);
|
|
1730
|
-
|
|
1731
|
-
|
|
1740
|
+
WriteMaybeCompressedBlock(block_data, kNoCompression,
|
|
1741
|
+
&properties_block_handle, BlockType::kProperties);
|
|
1732
1742
|
}
|
|
1733
1743
|
if (ok()) {
|
|
1734
1744
|
#ifndef NDEBUG
|
|
@@ -1758,9 +1768,9 @@ void BlockBasedTableBuilder::WriteCompressionDictBlock(
|
|
|
1758
1768
|
rep_->compression_dict->GetRawDict().size()) {
|
|
1759
1769
|
BlockHandle compression_dict_block_handle;
|
|
1760
1770
|
if (ok()) {
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1771
|
+
WriteMaybeCompressedBlock(rep_->compression_dict->GetRawDict(),
|
|
1772
|
+
kNoCompression, &compression_dict_block_handle,
|
|
1773
|
+
BlockType::kCompressionDictionary);
|
|
1764
1774
|
#ifndef NDEBUG
|
|
1765
1775
|
Slice compression_dict = rep_->compression_dict->GetRawDict();
|
|
1766
1776
|
TEST_SYNC_POINT_CALLBACK(
|
|
@@ -1779,8 +1789,9 @@ void BlockBasedTableBuilder::WriteRangeDelBlock(
|
|
|
1779
1789
|
MetaIndexBuilder* meta_index_builder) {
|
|
1780
1790
|
if (ok() && !rep_->range_del_block.empty()) {
|
|
1781
1791
|
BlockHandle range_del_block_handle;
|
|
1782
|
-
|
|
1783
|
-
|
|
1792
|
+
WriteMaybeCompressedBlock(rep_->range_del_block.Finish(), kNoCompression,
|
|
1793
|
+
&range_del_block_handle,
|
|
1794
|
+
BlockType::kRangeDeletion);
|
|
1784
1795
|
meta_index_builder->Add(kRangeDelBlockName, range_del_block_handle);
|
|
1785
1796
|
}
|
|
1786
1797
|
}
|
|
@@ -2001,8 +2012,8 @@ Status BlockBasedTableBuilder::Finish() {
|
|
|
2001
2012
|
WritePropertiesBlock(&meta_index_builder);
|
|
2002
2013
|
if (ok()) {
|
|
2003
2014
|
// flush the meta index block
|
|
2004
|
-
|
|
2005
|
-
|
|
2015
|
+
WriteMaybeCompressedBlock(meta_index_builder.Finish(), kNoCompression,
|
|
2016
|
+
&metaindex_block_handle, BlockType::kMetaIndex);
|
|
2006
2017
|
}
|
|
2007
2018
|
if (ok()) {
|
|
2008
2019
|
WriteFooter(metaindex_block_handle, index_block_handle);
|
|
@@ -2036,7 +2047,7 @@ uint64_t BlockBasedTableBuilder::FileSize() const { return rep_->offset; }
|
|
|
2036
2047
|
|
|
2037
2048
|
uint64_t BlockBasedTableBuilder::EstimatedFileSize() const {
|
|
2038
2049
|
if (rep_->IsParallelCompressionEnabled()) {
|
|
2039
|
-
// Use compression ratio so far and inflight
|
|
2050
|
+
// Use compression ratio so far and inflight uncompressed bytes to estimate
|
|
2040
2051
|
// final SST size.
|
|
2041
2052
|
return rep_->pc_rep->file_size_estimator.GetEstimatedFileSize();
|
|
2042
2053
|
} else {
|