@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
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
#include "cache/charged_cache.h"
|
|
15
15
|
#include "cache/compressed_secondary_cache.h"
|
|
16
|
+
#include "db/blob/blob_contents.h"
|
|
16
17
|
#include "db/blob/blob_file_cache.h"
|
|
17
18
|
#include "db/blob/blob_file_reader.h"
|
|
18
19
|
#include "db/blob/blob_log_format.h"
|
|
@@ -218,6 +219,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
218
219
|
kNoCompression, prefetch_buffer, &values[i],
|
|
219
220
|
&bytes_read));
|
|
220
221
|
ASSERT_EQ(values[i], blobs[i]);
|
|
222
|
+
ASSERT_TRUE(values[i].IsPinned());
|
|
221
223
|
ASSERT_EQ(bytes_read,
|
|
222
224
|
BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
|
|
223
225
|
|
|
@@ -255,6 +257,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
255
257
|
kNoCompression, prefetch_buffer, &values[i],
|
|
256
258
|
&bytes_read));
|
|
257
259
|
ASSERT_EQ(values[i], blobs[i]);
|
|
260
|
+
ASSERT_TRUE(values[i].IsPinned());
|
|
258
261
|
ASSERT_EQ(bytes_read,
|
|
259
262
|
BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
|
|
260
263
|
|
|
@@ -298,6 +301,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
298
301
|
kNoCompression, prefetch_buffer, &values[i],
|
|
299
302
|
&bytes_read));
|
|
300
303
|
ASSERT_EQ(values[i], blobs[i]);
|
|
304
|
+
ASSERT_TRUE(values[i].IsPinned());
|
|
301
305
|
ASSERT_EQ(bytes_read,
|
|
302
306
|
BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
|
|
303
307
|
|
|
@@ -336,6 +340,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
336
340
|
kNoCompression, prefetch_buffer, &values[i],
|
|
337
341
|
&bytes_read));
|
|
338
342
|
ASSERT_EQ(values[i], blobs[i]);
|
|
343
|
+
ASSERT_TRUE(values[i].IsPinned());
|
|
339
344
|
ASSERT_EQ(bytes_read,
|
|
340
345
|
BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
|
|
341
346
|
|
|
@@ -382,6 +387,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
382
387
|
&bytes_read)
|
|
383
388
|
.IsIncomplete());
|
|
384
389
|
ASSERT_TRUE(values[i].empty());
|
|
390
|
+
ASSERT_FALSE(values[i].IsPinned());
|
|
385
391
|
ASSERT_EQ(bytes_read, 0);
|
|
386
392
|
|
|
387
393
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
|
|
@@ -423,6 +429,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
|
|
|
423
429
|
&bytes_read)
|
|
424
430
|
.IsIOError());
|
|
425
431
|
ASSERT_TRUE(values[i].empty());
|
|
432
|
+
ASSERT_FALSE(values[i].IsPinned());
|
|
426
433
|
ASSERT_EQ(bytes_read, 0);
|
|
427
434
|
|
|
428
435
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(file_number, file_size,
|
|
@@ -855,6 +862,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
855
862
|
if (i % 2 == 0) {
|
|
856
863
|
ASSERT_OK(statuses_buf[i]);
|
|
857
864
|
ASSERT_EQ(value_buf[i], blobs[i]);
|
|
865
|
+
ASSERT_TRUE(value_buf[i].IsPinned());
|
|
858
866
|
fs_read_bytes +=
|
|
859
867
|
blob_sizes[i] + keys[i].size() + BlobLogRecord::kHeaderSize;
|
|
860
868
|
ASSERT_TRUE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
|
|
@@ -863,6 +871,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
863
871
|
} else {
|
|
864
872
|
statuses_buf[i].PermitUncheckedError();
|
|
865
873
|
ASSERT_TRUE(value_buf[i].empty());
|
|
874
|
+
ASSERT_FALSE(value_buf[i].IsPinned());
|
|
866
875
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
|
|
867
876
|
blob_offsets[i]));
|
|
868
877
|
}
|
|
@@ -895,6 +904,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
895
904
|
kNoCompression, prefetch_buffer,
|
|
896
905
|
&value_buf[i], &bytes_read));
|
|
897
906
|
ASSERT_EQ(value_buf[i], blobs[i]);
|
|
907
|
+
ASSERT_TRUE(value_buf[i].IsPinned());
|
|
898
908
|
ASSERT_EQ(bytes_read,
|
|
899
909
|
BlobLogRecord::kHeaderSize + keys[i].size() + blob_sizes[i]);
|
|
900
910
|
|
|
@@ -920,6 +930,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
920
930
|
for (size_t i = 0; i < num_blobs; ++i) {
|
|
921
931
|
ASSERT_OK(statuses_buf[i]);
|
|
922
932
|
ASSERT_EQ(value_buf[i], blobs[i]);
|
|
933
|
+
ASSERT_TRUE(value_buf[i].IsPinned());
|
|
923
934
|
ASSERT_TRUE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
|
|
924
935
|
blob_offsets[i]));
|
|
925
936
|
blob_bytes += blob_sizes[i];
|
|
@@ -968,6 +979,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
968
979
|
for (size_t i = 0; i < num_blobs; ++i) {
|
|
969
980
|
ASSERT_TRUE(statuses_buf[i].IsIncomplete());
|
|
970
981
|
ASSERT_TRUE(value_buf[i].empty());
|
|
982
|
+
ASSERT_FALSE(value_buf[i].IsPinned());
|
|
971
983
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(blob_file_number, file_size,
|
|
972
984
|
blob_offsets[i]));
|
|
973
985
|
}
|
|
@@ -1011,6 +1023,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
|
|
|
1011
1023
|
for (size_t i = 0; i < num_blobs; ++i) {
|
|
1012
1024
|
ASSERT_TRUE(statuses_buf[i].IsIOError());
|
|
1013
1025
|
ASSERT_TRUE(value_buf[i].empty());
|
|
1026
|
+
ASSERT_FALSE(value_buf[i].IsPinned());
|
|
1014
1027
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(non_existing_file_number,
|
|
1015
1028
|
file_size, blob_offsets[i]));
|
|
1016
1029
|
}
|
|
@@ -1040,16 +1053,17 @@ class BlobSecondaryCacheTest : public DBTestBase {
|
|
|
1040
1053
|
|
|
1041
1054
|
// Set a small cache capacity to evict entries from the cache, and to test
|
|
1042
1055
|
// that secondary cache is used properly.
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1056
|
+
lru_cache_opts_.capacity = 1024;
|
|
1057
|
+
lru_cache_opts_.num_shard_bits = 0;
|
|
1058
|
+
lru_cache_opts_.strict_capacity_limit = true;
|
|
1059
|
+
lru_cache_opts_.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
1060
|
+
lru_cache_opts_.high_pri_pool_ratio = 0.2;
|
|
1061
|
+
lru_cache_opts_.low_pri_pool_ratio = 0.2;
|
|
1049
1062
|
|
|
1050
1063
|
secondary_cache_opts_.capacity = 8 << 20; // 8 MB
|
|
1051
1064
|
secondary_cache_opts_.num_shard_bits = 0;
|
|
1052
|
-
secondary_cache_opts_.metadata_charge_policy =
|
|
1065
|
+
secondary_cache_opts_.metadata_charge_policy =
|
|
1066
|
+
kDefaultCacheMetadataChargePolicy;
|
|
1053
1067
|
|
|
1054
1068
|
// Read blobs from the secondary cache if they are not in the primary cache
|
|
1055
1069
|
options_.lowest_used_cache_tier = CacheTier::kNonVolatileBlockTier;
|
|
@@ -1060,7 +1074,7 @@ class BlobSecondaryCacheTest : public DBTestBase {
|
|
|
1060
1074
|
|
|
1061
1075
|
Options options_;
|
|
1062
1076
|
|
|
1063
|
-
LRUCacheOptions
|
|
1077
|
+
LRUCacheOptions lru_cache_opts_;
|
|
1064
1078
|
CompressedSecondaryCacheOptions secondary_cache_opts_;
|
|
1065
1079
|
|
|
1066
1080
|
std::string db_id_;
|
|
@@ -1073,9 +1087,9 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1073
1087
|
}
|
|
1074
1088
|
|
|
1075
1089
|
secondary_cache_opts_.compression_type = kSnappyCompression;
|
|
1076
|
-
|
|
1090
|
+
lru_cache_opts_.secondary_cache =
|
|
1077
1091
|
NewCompressedSecondaryCache(secondary_cache_opts_);
|
|
1078
|
-
options_.blob_cache = NewLRUCache(
|
|
1092
|
+
options_.blob_cache = NewLRUCache(lru_cache_opts_);
|
|
1079
1093
|
|
|
1080
1094
|
options_.cf_paths.emplace_back(
|
|
1081
1095
|
test::PerThreadDBPath(
|
|
@@ -1098,8 +1112,8 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1098
1112
|
Random rnd(301);
|
|
1099
1113
|
|
|
1100
1114
|
std::vector<std::string> key_strs{"key0", "key1"};
|
|
1101
|
-
std::vector<std::string> blob_strs{rnd.RandomString(
|
|
1102
|
-
rnd.RandomString(
|
|
1115
|
+
std::vector<std::string> blob_strs{rnd.RandomString(512),
|
|
1116
|
+
rnd.RandomString(768)};
|
|
1103
1117
|
|
|
1104
1118
|
std::vector<Slice> keys{key_strs[0], key_strs[1]};
|
|
1105
1119
|
std::vector<Slice> blobs{blob_strs[0], blob_strs[1]};
|
|
@@ -1134,16 +1148,15 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1134
1148
|
read_options.verify_checksums = true;
|
|
1135
1149
|
|
|
1136
1150
|
auto blob_cache = options_.blob_cache;
|
|
1137
|
-
auto secondary_cache =
|
|
1138
|
-
|
|
1139
|
-
Cache::CreateCallback create_cb = [
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
return Status::OK();
|
|
1151
|
+
auto secondary_cache = lru_cache_opts_.secondary_cache;
|
|
1152
|
+
|
|
1153
|
+
Cache::CreateCallback create_cb = [](const void* buf, size_t size,
|
|
1154
|
+
void** out_obj,
|
|
1155
|
+
size_t* charge) -> Status {
|
|
1156
|
+
CacheAllocationPtr allocation(new char[size]);
|
|
1157
|
+
|
|
1158
|
+
return BlobContents::CreateCallback(std::move(allocation), buf, size,
|
|
1159
|
+
out_obj, charge);
|
|
1147
1160
|
};
|
|
1148
1161
|
|
|
1149
1162
|
{
|
|
@@ -1154,6 +1167,25 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1154
1167
|
get_perf_context()->Reset();
|
|
1155
1168
|
|
|
1156
1169
|
// key0 should be filled to the primary cache from the blob file.
|
|
1170
|
+
ASSERT_OK(blob_source.GetBlob(read_options, keys[0], file_number,
|
|
1171
|
+
blob_offsets[0], file_size, blob_sizes[0],
|
|
1172
|
+
kNoCompression, nullptr /* prefetch_buffer */,
|
|
1173
|
+
&values[0], nullptr /* bytes_read */));
|
|
1174
|
+
// Release cache handle
|
|
1175
|
+
values[0].Reset();
|
|
1176
|
+
|
|
1177
|
+
// key0 should be evicted and key0's dummy item is inserted into secondary
|
|
1178
|
+
// cache. key1 should be filled to the primary cache from the blob file.
|
|
1179
|
+
ASSERT_OK(blob_source.GetBlob(read_options, keys[1], file_number,
|
|
1180
|
+
blob_offsets[1], file_size, blob_sizes[1],
|
|
1181
|
+
kNoCompression, nullptr /* prefetch_buffer */,
|
|
1182
|
+
&values[1], nullptr /* bytes_read */));
|
|
1183
|
+
|
|
1184
|
+
// Release cache handle
|
|
1185
|
+
values[1].Reset();
|
|
1186
|
+
|
|
1187
|
+
// key0 should be filled to the primary cache from the blob file. key1
|
|
1188
|
+
// should be evicted and key1's dummy item is inserted into secondary cache.
|
|
1157
1189
|
ASSERT_OK(blob_source.GetBlob(read_options, keys[0], file_number,
|
|
1158
1190
|
blob_offsets[0], file_size, blob_sizes[0],
|
|
1159
1191
|
kNoCompression, nullptr /* prefetch_buffer */,
|
|
@@ -1162,8 +1194,11 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1162
1194
|
ASSERT_TRUE(
|
|
1163
1195
|
blob_source.TEST_BlobInCache(file_number, file_size, blob_offsets[0]));
|
|
1164
1196
|
|
|
1165
|
-
//
|
|
1166
|
-
|
|
1197
|
+
// Release cache handle
|
|
1198
|
+
values[0].Reset();
|
|
1199
|
+
|
|
1200
|
+
// key0 should be evicted and is inserted into secondary cache.
|
|
1201
|
+
// key1 should be filled to the primary cache from the blob file.
|
|
1167
1202
|
ASSERT_OK(blob_source.GetBlob(read_options, keys[1], file_number,
|
|
1168
1203
|
blob_offsets[1], file_size, blob_sizes[1],
|
|
1169
1204
|
kNoCompression, nullptr /* prefetch_buffer */,
|
|
@@ -1172,6 +1207,9 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1172
1207
|
ASSERT_TRUE(
|
|
1173
1208
|
blob_source.TEST_BlobInCache(file_number, file_size, blob_offsets[1]));
|
|
1174
1209
|
|
|
1210
|
+
// Release cache handle
|
|
1211
|
+
values[1].Reset();
|
|
1212
|
+
|
|
1175
1213
|
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number);
|
|
1176
1214
|
|
|
1177
1215
|
// blob_cache here only looks at the primary cache since we didn't provide
|
|
@@ -1184,24 +1222,27 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1184
1222
|
auto handle0 = blob_cache->Lookup(key0, statistics);
|
|
1185
1223
|
ASSERT_EQ(handle0, nullptr);
|
|
1186
1224
|
|
|
1187
|
-
// key0 should be in the secondary cache.
|
|
1188
|
-
// secondary cache, it will be erased from the secondary cache.
|
|
1225
|
+
// key0's item should be in the secondary cache.
|
|
1189
1226
|
bool is_in_sec_cache = false;
|
|
1190
1227
|
auto sec_handle0 =
|
|
1191
|
-
secondary_cache->Lookup(key0, create_cb, true,
|
|
1228
|
+
secondary_cache->Lookup(key0, create_cb, true,
|
|
1229
|
+
/*advise_erase=*/true, is_in_sec_cache);
|
|
1192
1230
|
ASSERT_FALSE(is_in_sec_cache);
|
|
1193
1231
|
ASSERT_NE(sec_handle0, nullptr);
|
|
1194
1232
|
ASSERT_TRUE(sec_handle0->IsReady());
|
|
1195
|
-
auto value = static_cast<
|
|
1196
|
-
|
|
1233
|
+
auto value = static_cast<BlobContents*>(sec_handle0->Value());
|
|
1234
|
+
ASSERT_NE(value, nullptr);
|
|
1235
|
+
ASSERT_EQ(value->data(), blobs[0]);
|
|
1197
1236
|
delete value;
|
|
1198
1237
|
|
|
1199
|
-
// key0 doesn't exist in the blob cache
|
|
1238
|
+
// key0 doesn't exist in the blob cache although key0's dummy
|
|
1239
|
+
// item exist in the secondary cache.
|
|
1200
1240
|
ASSERT_FALSE(blob_source.TEST_BlobInCache(file_number, file_size,
|
|
1201
1241
|
blob_offsets[0]));
|
|
1202
1242
|
}
|
|
1203
1243
|
|
|
1204
|
-
// key1 should
|
|
1244
|
+
// key1 should exists in the primary cache. key1's dummy item exists
|
|
1245
|
+
// in the secondary cache.
|
|
1205
1246
|
{
|
|
1206
1247
|
CacheKey cache_key = base_cache_key.WithOffset(blob_offsets[1]);
|
|
1207
1248
|
const Slice key1 = cache_key.AsSlice();
|
|
@@ -1211,7 +1252,8 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1211
1252
|
|
|
1212
1253
|
bool is_in_sec_cache = false;
|
|
1213
1254
|
auto sec_handle1 =
|
|
1214
|
-
secondary_cache->Lookup(key1, create_cb, true,
|
|
1255
|
+
secondary_cache->Lookup(key1, create_cb, true,
|
|
1256
|
+
/*advise_erase=*/true, is_in_sec_cache);
|
|
1215
1257
|
ASSERT_FALSE(is_in_sec_cache);
|
|
1216
1258
|
ASSERT_EQ(sec_handle1, nullptr);
|
|
1217
1259
|
|
|
@@ -1221,23 +1263,27 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1221
1263
|
|
|
1222
1264
|
{
|
|
1223
1265
|
// fetch key0 from the blob file to the primary cache.
|
|
1266
|
+
// key1 is evicted and inserted into the secondary cache.
|
|
1224
1267
|
ASSERT_OK(blob_source.GetBlob(
|
|
1225
1268
|
read_options, keys[0], file_number, blob_offsets[0], file_size,
|
|
1226
1269
|
blob_sizes[0], kNoCompression, nullptr /* prefetch_buffer */,
|
|
1227
1270
|
&values[0], nullptr /* bytes_read */));
|
|
1228
1271
|
ASSERT_EQ(values[0], blobs[0]);
|
|
1229
1272
|
|
|
1273
|
+
// Release cache handle
|
|
1274
|
+
values[0].Reset();
|
|
1275
|
+
|
|
1230
1276
|
// key0 should be in the primary cache.
|
|
1231
1277
|
CacheKey cache_key0 = base_cache_key.WithOffset(blob_offsets[0]);
|
|
1232
1278
|
const Slice key0 = cache_key0.AsSlice();
|
|
1233
1279
|
auto handle0 = blob_cache->Lookup(key0, statistics);
|
|
1234
1280
|
ASSERT_NE(handle0, nullptr);
|
|
1235
|
-
auto value = static_cast<
|
|
1236
|
-
|
|
1281
|
+
auto value = static_cast<BlobContents*>(blob_cache->Value(handle0));
|
|
1282
|
+
ASSERT_NE(value, nullptr);
|
|
1283
|
+
ASSERT_EQ(value->data(), blobs[0]);
|
|
1237
1284
|
blob_cache->Release(handle0);
|
|
1238
1285
|
|
|
1239
|
-
// key1 is not in the primary cache
|
|
1240
|
-
// secondary cache.
|
|
1286
|
+
// key1 is not in the primary cache and is in the secondary cache.
|
|
1241
1287
|
CacheKey cache_key1 = base_cache_key.WithOffset(blob_offsets[1]);
|
|
1242
1288
|
const Slice key1 = cache_key1.AsSlice();
|
|
1243
1289
|
auto handle1 = blob_cache->Lookup(key1, statistics);
|
|
@@ -1251,16 +1297,19 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1251
1297
|
// key1 promotion should succeed due to the primary cache being empty. we
|
|
1252
1298
|
// did't call secondary cache's Lookup() here, because it will remove the
|
|
1253
1299
|
// key but it won't be able to promote the key to the primary cache.
|
|
1254
|
-
// Instead we use the end-to-end blob source API to
|
|
1255
|
-
//
|
|
1300
|
+
// Instead we use the end-to-end blob source API to read key1.
|
|
1301
|
+
// In function TEST_BlobInCache, key1's dummy item is inserted into the
|
|
1302
|
+
// primary cache and a standalone handle is checked by GetValue().
|
|
1256
1303
|
ASSERT_TRUE(blob_source.TEST_BlobInCache(file_number, file_size,
|
|
1257
1304
|
blob_offsets[1]));
|
|
1258
1305
|
|
|
1259
|
-
// key1
|
|
1306
|
+
// key1's dummy handle is in the primary cache and key1's item is still
|
|
1307
|
+
// in the secondary cache. So, the primary cache's Lookup() can only
|
|
1308
|
+
// get a dummy handle.
|
|
1260
1309
|
handle1 = blob_cache->Lookup(key1, statistics);
|
|
1261
1310
|
ASSERT_NE(handle1, nullptr);
|
|
1262
|
-
|
|
1263
|
-
ASSERT_EQ(
|
|
1311
|
+
// handl1 is a dummy handle.
|
|
1312
|
+
ASSERT_EQ(blob_cache->Value(handle1), nullptr);
|
|
1264
1313
|
blob_cache->Release(handle1);
|
|
1265
1314
|
}
|
|
1266
1315
|
}
|
|
@@ -1385,11 +1434,11 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
|
|
|
1385
1434
|
ReadOptions read_options;
|
|
1386
1435
|
read_options.verify_checksums = true;
|
|
1387
1436
|
|
|
1388
|
-
std::vector<PinnableSlice> values(keys_.size());
|
|
1389
|
-
|
|
1390
1437
|
{
|
|
1391
1438
|
read_options.fill_cache = false;
|
|
1392
1439
|
|
|
1440
|
+
std::vector<PinnableSlice> values(keys_.size());
|
|
1441
|
+
|
|
1393
1442
|
for (size_t i = 0; i < kNumBlobs; ++i) {
|
|
1394
1443
|
ASSERT_OK(blob_source.GetBlob(
|
|
1395
1444
|
read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
|
|
@@ -1403,6 +1452,8 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
|
|
|
1403
1452
|
{
|
|
1404
1453
|
read_options.fill_cache = true;
|
|
1405
1454
|
|
|
1455
|
+
std::vector<PinnableSlice> values(keys_.size());
|
|
1456
|
+
|
|
1406
1457
|
// num_blobs is 16, so the total blob cache usage is less than a single
|
|
1407
1458
|
// dummy entry. Therefore, cache reservation manager only reserves one dummy
|
|
1408
1459
|
// entry here.
|
|
@@ -1412,7 +1463,12 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
|
|
|
1412
1463
|
read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
|
|
1413
1464
|
blob_file_size_, blob_sizes[i], kNoCompression,
|
|
1414
1465
|
nullptr /* prefetch_buffer */, &values[i], nullptr /* bytes_read */));
|
|
1415
|
-
|
|
1466
|
+
|
|
1467
|
+
size_t charge = 0;
|
|
1468
|
+
ASSERT_TRUE(blob_source.TEST_BlobInCache(kBlobFileNumber, blob_file_size_,
|
|
1469
|
+
blob_offsets[i], &charge));
|
|
1470
|
+
|
|
1471
|
+
blob_bytes += charge;
|
|
1416
1472
|
ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
|
|
1417
1473
|
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
|
|
1418
1474
|
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
|
|
@@ -1425,19 +1481,23 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
|
|
|
1425
1481
|
size_t blob_bytes = options_.blob_cache->GetUsage();
|
|
1426
1482
|
|
|
1427
1483
|
for (size_t i = 0; i < kNumBlobs; ++i) {
|
|
1484
|
+
size_t charge = 0;
|
|
1485
|
+
ASSERT_TRUE(blob_source.TEST_BlobInCache(kBlobFileNumber, blob_file_size_,
|
|
1486
|
+
blob_offsets[i], &charge));
|
|
1487
|
+
|
|
1428
1488
|
CacheKey cache_key = base_cache_key.WithOffset(blob_offsets[i]);
|
|
1429
1489
|
// We didn't call options_.blob_cache->Erase() here, this is because
|
|
1430
1490
|
// the cache wrapper's Erase() method must be called to update the
|
|
1431
1491
|
// cache usage after erasing the cache entry.
|
|
1432
1492
|
blob_source.GetBlobCache()->Erase(cache_key.AsSlice());
|
|
1433
1493
|
if (i == kNumBlobs - 1) {
|
|
1434
|
-
//
|
|
1435
|
-
// any space for
|
|
1494
|
+
// All the blobs got removed from the cache. cache_res_mgr should not
|
|
1495
|
+
// reserve any space for them.
|
|
1436
1496
|
ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), 0);
|
|
1437
1497
|
} else {
|
|
1438
1498
|
ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
|
|
1439
1499
|
}
|
|
1440
|
-
blob_bytes -=
|
|
1500
|
+
blob_bytes -= charge;
|
|
1441
1501
|
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
|
|
1442
1502
|
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
|
|
1443
1503
|
options_.blob_cache->GetUsage());
|
|
@@ -1495,11 +1555,11 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservationOnFullCache) {
|
|
|
1495
1555
|
ReadOptions read_options;
|
|
1496
1556
|
read_options.verify_checksums = true;
|
|
1497
1557
|
|
|
1498
|
-
std::vector<PinnableSlice> values(keys_.size());
|
|
1499
|
-
|
|
1500
1558
|
{
|
|
1501
1559
|
read_options.fill_cache = false;
|
|
1502
1560
|
|
|
1561
|
+
std::vector<PinnableSlice> values(keys_.size());
|
|
1562
|
+
|
|
1503
1563
|
for (size_t i = 0; i < kNumBlobs; ++i) {
|
|
1504
1564
|
ASSERT_OK(blob_source.GetBlob(
|
|
1505
1565
|
read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
|
|
@@ -1513,21 +1573,33 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservationOnFullCache) {
|
|
|
1513
1573
|
{
|
|
1514
1574
|
read_options.fill_cache = true;
|
|
1515
1575
|
|
|
1516
|
-
|
|
1517
|
-
|
|
1576
|
+
std::vector<PinnableSlice> values(keys_.size());
|
|
1577
|
+
|
|
1578
|
+
// Since we resized each blob to be kSizeDummyEntry / (num_blobs / 2), we
|
|
1579
|
+
// can't fit all the blobs in the cache at the same time, which means we
|
|
1580
|
+
// should observe cache evictions once we reach the cache's capacity.
|
|
1581
|
+
// Due to the overhead of the cache and the BlobContents objects, as well as
|
|
1582
|
+
// jemalloc bin sizes, this happens after inserting seven blobs.
|
|
1518
1583
|
uint64_t blob_bytes = 0;
|
|
1519
1584
|
for (size_t i = 0; i < kNumBlobs; ++i) {
|
|
1520
1585
|
ASSERT_OK(blob_source.GetBlob(
|
|
1521
1586
|
read_options, keys_[i], kBlobFileNumber, blob_offsets[i],
|
|
1522
1587
|
blob_file_size_, blob_sizes[i], kNoCompression,
|
|
1523
1588
|
nullptr /* prefetch_buffer */, &values[i], nullptr /* bytes_read */));
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1589
|
+
|
|
1590
|
+
// Release cache handle
|
|
1591
|
+
values[i].Reset();
|
|
1592
|
+
|
|
1593
|
+
if (i < kNumBlobs / 2 - 1) {
|
|
1594
|
+
size_t charge = 0;
|
|
1595
|
+
ASSERT_TRUE(blob_source.TEST_BlobInCache(
|
|
1596
|
+
kBlobFileNumber, blob_file_size_, blob_offsets[i], &charge));
|
|
1597
|
+
|
|
1598
|
+
blob_bytes += charge;
|
|
1530
1599
|
}
|
|
1600
|
+
|
|
1601
|
+
ASSERT_EQ(cache_res_mgr->GetTotalReservedCacheSize(), kSizeDummyEntry);
|
|
1602
|
+
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(), blob_bytes);
|
|
1531
1603
|
ASSERT_EQ(cache_res_mgr->GetTotalMemoryUsed(),
|
|
1532
1604
|
options_.blob_cache->GetUsage());
|
|
1533
1605
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#include <sstream>
|
|
8
8
|
#include <string>
|
|
9
9
|
|
|
10
|
+
#include "cache/compressed_secondary_cache.h"
|
|
10
11
|
#include "db/blob/blob_index.h"
|
|
11
12
|
#include "db/blob/blob_log_format.h"
|
|
12
13
|
#include "db/db_test_util.h"
|
|
@@ -53,7 +54,7 @@ TEST_F(DBBlobBasicTest, GetBlobFromCache) {
|
|
|
53
54
|
Options options = GetDefaultOptions();
|
|
54
55
|
|
|
55
56
|
LRUCacheOptions co;
|
|
56
|
-
co.capacity =
|
|
57
|
+
co.capacity = 2 << 20; // 2MB
|
|
57
58
|
co.num_shard_bits = 2;
|
|
58
59
|
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
59
60
|
auto backing_cache = NewLRUCache(co);
|
|
@@ -121,7 +122,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
|
|
|
121
122
|
Options options = GetDefaultOptions();
|
|
122
123
|
|
|
123
124
|
LRUCacheOptions co;
|
|
124
|
-
co.capacity =
|
|
125
|
+
co.capacity = 2 << 20; // 2MB
|
|
125
126
|
co.num_shard_bits = 2;
|
|
126
127
|
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
127
128
|
auto backing_cache = NewLRUCache(co);
|
|
@@ -452,7 +453,7 @@ TEST_F(DBBlobBasicTest, MultiGetBlobsFromCache) {
|
|
|
452
453
|
Options options = GetDefaultOptions();
|
|
453
454
|
|
|
454
455
|
LRUCacheOptions co;
|
|
455
|
-
co.capacity =
|
|
456
|
+
co.capacity = 2 << 20; // 2MB
|
|
456
457
|
co.num_shard_bits = 2;
|
|
457
458
|
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
458
459
|
auto backing_cache = NewLRUCache(co);
|
|
@@ -1701,6 +1702,83 @@ TEST_F(DBBlobBasicTest, DynamicallyWarmCacheDuringFlush) {
|
|
|
1701
1702
|
}
|
|
1702
1703
|
#endif // !ROCKSDB_LITE
|
|
1703
1704
|
|
|
1705
|
+
TEST_F(DBBlobBasicTest, WarmCacheWithBlobsSecondary) {
|
|
1706
|
+
CompressedSecondaryCacheOptions secondary_cache_opts;
|
|
1707
|
+
secondary_cache_opts.capacity = 1 << 20;
|
|
1708
|
+
secondary_cache_opts.num_shard_bits = 0;
|
|
1709
|
+
secondary_cache_opts.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
1710
|
+
secondary_cache_opts.compression_type = kNoCompression;
|
|
1711
|
+
|
|
1712
|
+
LRUCacheOptions primary_cache_opts;
|
|
1713
|
+
primary_cache_opts.capacity = 1024;
|
|
1714
|
+
primary_cache_opts.num_shard_bits = 0;
|
|
1715
|
+
primary_cache_opts.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
1716
|
+
primary_cache_opts.secondary_cache =
|
|
1717
|
+
NewCompressedSecondaryCache(secondary_cache_opts);
|
|
1718
|
+
|
|
1719
|
+
Options options = GetDefaultOptions();
|
|
1720
|
+
options.create_if_missing = true;
|
|
1721
|
+
options.statistics = CreateDBStatistics();
|
|
1722
|
+
options.enable_blob_files = true;
|
|
1723
|
+
options.blob_cache = NewLRUCache(primary_cache_opts);
|
|
1724
|
+
options.prepopulate_blob_cache = PrepopulateBlobCache::kFlushOnly;
|
|
1725
|
+
|
|
1726
|
+
DestroyAndReopen(options);
|
|
1727
|
+
|
|
1728
|
+
// Note: only one of the two blobs fit in the primary cache at any given time.
|
|
1729
|
+
constexpr char first_key[] = "foo";
|
|
1730
|
+
constexpr size_t first_blob_size = 512;
|
|
1731
|
+
const std::string first_blob(first_blob_size, 'a');
|
|
1732
|
+
|
|
1733
|
+
constexpr char second_key[] = "bar";
|
|
1734
|
+
constexpr size_t second_blob_size = 768;
|
|
1735
|
+
const std::string second_blob(second_blob_size, 'b');
|
|
1736
|
+
|
|
1737
|
+
// First blob is inserted into primary cache during flush.
|
|
1738
|
+
ASSERT_OK(Put(first_key, first_blob));
|
|
1739
|
+
ASSERT_OK(Flush());
|
|
1740
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 1);
|
|
1741
|
+
|
|
1742
|
+
// Second blob is inserted into primary cache during flush,
|
|
1743
|
+
// First blob is evicted but only a dummy handle is inserted into secondary
|
|
1744
|
+
// cache.
|
|
1745
|
+
ASSERT_OK(Put(second_key, second_blob));
|
|
1746
|
+
ASSERT_OK(Flush());
|
|
1747
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 1);
|
|
1748
|
+
|
|
1749
|
+
// First blob is inserted into primary cache.
|
|
1750
|
+
// Second blob is evicted but only a dummy handle is inserted into secondary
|
|
1751
|
+
// cache.
|
|
1752
|
+
ASSERT_EQ(Get(first_key), first_blob);
|
|
1753
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 1);
|
|
1754
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 0);
|
|
1755
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
|
|
1756
|
+
0);
|
|
1757
|
+
// Second blob is inserted into primary cache,
|
|
1758
|
+
// First blob is evicted and is inserted into secondary cache.
|
|
1759
|
+
ASSERT_EQ(Get(second_key), second_blob);
|
|
1760
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 1);
|
|
1761
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 0);
|
|
1762
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
|
|
1763
|
+
0);
|
|
1764
|
+
|
|
1765
|
+
// First blob's dummy item is inserted into primary cache b/c of lookup.
|
|
1766
|
+
// Second blob is still in primary cache.
|
|
1767
|
+
ASSERT_EQ(Get(first_key), first_blob);
|
|
1768
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 0);
|
|
1769
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 1);
|
|
1770
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
|
|
1771
|
+
1);
|
|
1772
|
+
|
|
1773
|
+
// First blob's item is inserted into primary cache b/c of lookup.
|
|
1774
|
+
// Second blob is evicted and inserted into secondary cache.
|
|
1775
|
+
ASSERT_EQ(Get(first_key), first_blob);
|
|
1776
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_MISS), 0);
|
|
1777
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_HIT), 1);
|
|
1778
|
+
ASSERT_EQ(options.statistics->getAndResetTickerCount(SECONDARY_CACHE_HITS),
|
|
1779
|
+
1);
|
|
1780
|
+
}
|
|
1781
|
+
|
|
1704
1782
|
} // namespace ROCKSDB_NAMESPACE
|
|
1705
1783
|
|
|
1706
1784
|
int main(int argc, char** argv) {
|
|
@@ -1054,6 +1054,18 @@ void rocksdb_drop_column_family(
|
|
|
1054
1054
|
SaveError(errptr, db->rep->DropColumnFamily(handle->rep));
|
|
1055
1055
|
}
|
|
1056
1056
|
|
|
1057
|
+
uint32_t rocksdb_column_family_handle_get_id(
|
|
1058
|
+
rocksdb_column_family_handle_t* handle) {
|
|
1059
|
+
return handle->rep->GetID();
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
char* rocksdb_column_family_handle_get_name(
|
|
1063
|
+
rocksdb_column_family_handle_t* handle, size_t* name_len) {
|
|
1064
|
+
auto name = handle->rep->GetName();
|
|
1065
|
+
*name_len = name.size();
|
|
1066
|
+
return CopyString(name);
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1057
1069
|
void rocksdb_column_family_handle_destroy(rocksdb_column_family_handle_t* handle) {
|
|
1058
1070
|
delete handle->rep;
|
|
1059
1071
|
delete handle;
|
|
@@ -2606,6 +2618,11 @@ void rocksdb_block_based_options_destroy(
|
|
|
2606
2618
|
delete options;
|
|
2607
2619
|
}
|
|
2608
2620
|
|
|
2621
|
+
void rocksdb_block_based_options_set_checksum(
|
|
2622
|
+
rocksdb_block_based_table_options_t* opt, char v) {
|
|
2623
|
+
opt->rep.checksum = static_cast<ROCKSDB_NAMESPACE::ChecksumType>(v);
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2609
2626
|
void rocksdb_block_based_options_set_block_size(
|
|
2610
2627
|
rocksdb_block_based_table_options_t* options, size_t block_size) {
|
|
2611
2628
|
options->rep.block_size = block_size;
|
|
@@ -4099,6 +4116,8 @@ uint64_t rocksdb_perfcontext_metric(rocksdb_perfcontext_t* context,
|
|
|
4099
4116
|
return rep->blob_checksum_time;
|
|
4100
4117
|
case rocksdb_blob_decompress_time:
|
|
4101
4118
|
return rep->blob_decompress_time;
|
|
4119
|
+
case rocksdb_internal_range_del_reseek_count:
|
|
4120
|
+
return rep->internal_range_del_reseek_count;
|
|
4102
4121
|
default:
|
|
4103
4122
|
break;
|
|
4104
4123
|
}
|
|
@@ -6449,6 +6468,16 @@ void rocksdb_options_set_memtable_whole_key_filtering(rocksdb_options_t* opt,
|
|
|
6449
6468
|
opt->rep.memtable_whole_key_filtering = val;
|
|
6450
6469
|
}
|
|
6451
6470
|
|
|
6471
|
+
void rocksdb_options_set_avoid_unnecessary_blocking_io(rocksdb_options_t* opt,
|
|
6472
|
+
unsigned char val) {
|
|
6473
|
+
opt->rep.avoid_unnecessary_blocking_io = val;
|
|
6474
|
+
}
|
|
6475
|
+
|
|
6476
|
+
unsigned char rocksdb_options_get_avoid_unnecessary_blocking_io(
|
|
6477
|
+
rocksdb_options_t* opt) {
|
|
6478
|
+
return opt->rep.avoid_unnecessary_blocking_io;
|
|
6479
|
+
}
|
|
6480
|
+
|
|
6452
6481
|
// deletes container with memory usage estimates
|
|
6453
6482
|
void rocksdb_approximate_memory_usage_destroy(rocksdb_memory_usage_t* usage) {
|
|
6454
6483
|
delete usage;
|
|
@@ -1144,7 +1144,8 @@ Status ColumnFamilyData::RangesOverlapWithMemtables(
|
|
|
1144
1144
|
MergeIteratorBuilder merge_iter_builder(&internal_comparator_, &arena);
|
|
1145
1145
|
merge_iter_builder.AddIterator(
|
|
1146
1146
|
super_version->mem->NewIterator(read_opts, &arena));
|
|
1147
|
-
super_version->imm->AddIterators(read_opts, &merge_iter_builder
|
|
1147
|
+
super_version->imm->AddIterators(read_opts, &merge_iter_builder,
|
|
1148
|
+
false /* add_range_tombstone_iter */);
|
|
1148
1149
|
ScopedArenaIterator memtable_iter(merge_iter_builder.Finish());
|
|
1149
1150
|
|
|
1150
1151
|
auto read_seq = super_version->current->version_set()->LastSequence();
|
|
@@ -1415,6 +1416,14 @@ Status ColumnFamilyData::ValidateOptions(
|
|
|
1415
1416
|
"FIFO compaction only supported with max_open_files = -1.");
|
|
1416
1417
|
}
|
|
1417
1418
|
|
|
1419
|
+
std::vector<uint32_t> supported{0, 1, 2, 4, 8};
|
|
1420
|
+
if (std::find(supported.begin(), supported.end(),
|
|
1421
|
+
cf_options.memtable_protection_bytes_per_key) ==
|
|
1422
|
+
supported.end()) {
|
|
1423
|
+
return Status::NotSupported(
|
|
1424
|
+
"Memtable per key-value checksum protection only supports 0, 1, 2, 4 "
|
|
1425
|
+
"or 8 bytes per key.");
|
|
1426
|
+
}
|
|
1418
1427
|
return s;
|
|
1419
1428
|
}
|
|
1420
1429
|
|