@nxtedition/rocksdb 8.1.4 → 8.1.5
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/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
- package/deps/rocksdb/rocksdb/Makefile +15 -3
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
- package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +15 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
- package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
- package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
- package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +6 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
- package/package.json +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
|
@@ -79,6 +79,27 @@ class PrefetchTest
|
|
|
79
79
|
public ::testing::WithParamInterface<std::tuple<bool, bool>> {
|
|
80
80
|
public:
|
|
81
81
|
PrefetchTest() : DBTestBase("prefetch_test", true) {}
|
|
82
|
+
|
|
83
|
+
void SetGenericOptions(Env* env, bool use_direct_io, Options& options) {
|
|
84
|
+
options = CurrentOptions();
|
|
85
|
+
options.write_buffer_size = 1024;
|
|
86
|
+
options.create_if_missing = true;
|
|
87
|
+
options.compression = kNoCompression;
|
|
88
|
+
options.env = env;
|
|
89
|
+
options.disable_auto_compactions = true;
|
|
90
|
+
if (use_direct_io) {
|
|
91
|
+
options.use_direct_reads = true;
|
|
92
|
+
options.use_direct_io_for_flush_and_compaction = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void SetBlockBasedTableOptions(BlockBasedTableOptions& table_options) {
|
|
97
|
+
table_options.no_block_cache = true;
|
|
98
|
+
table_options.cache_index_and_filter_blocks = false;
|
|
99
|
+
table_options.metadata_block_size = 1024;
|
|
100
|
+
table_options.index_type =
|
|
101
|
+
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
102
|
+
}
|
|
82
103
|
};
|
|
83
104
|
|
|
84
105
|
INSTANTIATE_TEST_CASE_P(PrefetchTest, PrefetchTest,
|
|
@@ -89,28 +110,23 @@ std::string BuildKey(int num, std::string postfix = "") {
|
|
|
89
110
|
return "my_key_" + std::to_string(num) + postfix;
|
|
90
111
|
}
|
|
91
112
|
|
|
113
|
+
// This test verifies the basic functionality of prefetching.
|
|
92
114
|
TEST_P(PrefetchTest, Basic) {
|
|
93
115
|
// First param is if the mockFS support_prefetch or not
|
|
94
116
|
bool support_prefetch =
|
|
95
117
|
std::get<0>(GetParam()) &&
|
|
96
118
|
test::IsPrefetchSupported(env_->GetFileSystem(), dbname_);
|
|
119
|
+
std::shared_ptr<MockFS> fs =
|
|
120
|
+
std::make_shared<MockFS>(env_->GetFileSystem(), support_prefetch);
|
|
97
121
|
|
|
98
122
|
// Second param is if directIO is enabled or not
|
|
99
123
|
bool use_direct_io = std::get<1>(GetParam());
|
|
100
|
-
|
|
101
|
-
std::shared_ptr<MockFS> fs =
|
|
102
|
-
std::make_shared<MockFS>(env_->GetFileSystem(), support_prefetch);
|
|
124
|
+
|
|
103
125
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
104
|
-
Options options
|
|
105
|
-
|
|
106
|
-
options.create_if_missing = true;
|
|
107
|
-
options.compression = kNoCompression;
|
|
108
|
-
options.env = env.get();
|
|
109
|
-
if (use_direct_io) {
|
|
110
|
-
options.use_direct_reads = true;
|
|
111
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
112
|
-
}
|
|
126
|
+
Options options;
|
|
127
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
113
128
|
|
|
129
|
+
const int kNumKeys = 1100;
|
|
114
130
|
int buff_prefetch_count = 0;
|
|
115
131
|
SyncPoint::GetInstance()->SetCallBack("FilePrefetchBuffer::Prefetch:Start",
|
|
116
132
|
[&](void*) { buff_prefetch_count++; });
|
|
@@ -192,35 +208,24 @@ TEST_P(PrefetchTest, Basic) {
|
|
|
192
208
|
}
|
|
193
209
|
|
|
194
210
|
#ifndef ROCKSDB_LITE
|
|
211
|
+
// This test verifies BlockBasedTableOptions.max_auto_readahead_size is
|
|
212
|
+
// configured dynamically.
|
|
195
213
|
TEST_P(PrefetchTest, ConfigureAutoMaxReadaheadSize) {
|
|
196
214
|
// First param is if the mockFS support_prefetch or not
|
|
197
215
|
bool support_prefetch =
|
|
198
216
|
std::get<0>(GetParam()) &&
|
|
199
217
|
test::IsPrefetchSupported(env_->GetFileSystem(), dbname_);
|
|
218
|
+
std::shared_ptr<MockFS> fs =
|
|
219
|
+
std::make_shared<MockFS>(env_->GetFileSystem(), support_prefetch);
|
|
200
220
|
|
|
201
221
|
// Second param is if directIO is enabled or not
|
|
202
222
|
bool use_direct_io = std::get<1>(GetParam());
|
|
203
223
|
|
|
204
|
-
std::shared_ptr<MockFS> fs =
|
|
205
|
-
std::make_shared<MockFS>(env_->GetFileSystem(), support_prefetch);
|
|
206
224
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
options.write_buffer_size = 1024;
|
|
210
|
-
options.create_if_missing = true;
|
|
211
|
-
options.compression = kNoCompression;
|
|
212
|
-
options.env = env.get();
|
|
213
|
-
options.disable_auto_compactions = true;
|
|
214
|
-
if (use_direct_io) {
|
|
215
|
-
options.use_direct_reads = true;
|
|
216
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
217
|
-
}
|
|
225
|
+
Options options;
|
|
226
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
218
227
|
BlockBasedTableOptions table_options;
|
|
219
|
-
table_options
|
|
220
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
221
|
-
table_options.metadata_block_size = 1024;
|
|
222
|
-
table_options.index_type =
|
|
223
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
228
|
+
SetBlockBasedTableOptions(table_options);
|
|
224
229
|
table_options.max_auto_readahead_size = 0;
|
|
225
230
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
226
231
|
|
|
@@ -329,6 +334,8 @@ TEST_P(PrefetchTest, ConfigureAutoMaxReadaheadSize) {
|
|
|
329
334
|
Close();
|
|
330
335
|
}
|
|
331
336
|
|
|
337
|
+
// This test verifies BlockBasedTableOptions.initial_auto_readahead_size is
|
|
338
|
+
// configured dynamically.
|
|
332
339
|
TEST_P(PrefetchTest, ConfigureInternalAutoReadaheadSize) {
|
|
333
340
|
// First param is if the mockFS support_prefetch or not
|
|
334
341
|
bool support_prefetch =
|
|
@@ -341,23 +348,10 @@ TEST_P(PrefetchTest, ConfigureInternalAutoReadaheadSize) {
|
|
|
341
348
|
std::shared_ptr<MockFS> fs =
|
|
342
349
|
std::make_shared<MockFS>(env_->GetFileSystem(), support_prefetch);
|
|
343
350
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
options.write_buffer_size = 1024;
|
|
347
|
-
options.create_if_missing = true;
|
|
348
|
-
options.compression = kNoCompression;
|
|
349
|
-
options.env = env.get();
|
|
350
|
-
options.disable_auto_compactions = true;
|
|
351
|
-
if (use_direct_io) {
|
|
352
|
-
options.use_direct_reads = true;
|
|
353
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
354
|
-
}
|
|
351
|
+
Options options;
|
|
352
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
355
353
|
BlockBasedTableOptions table_options;
|
|
356
|
-
table_options
|
|
357
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
358
|
-
table_options.metadata_block_size = 1024;
|
|
359
|
-
table_options.index_type =
|
|
360
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
354
|
+
SetBlockBasedTableOptions(table_options);
|
|
361
355
|
table_options.initial_auto_readahead_size = 0;
|
|
362
356
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
363
357
|
|
|
@@ -468,6 +462,8 @@ TEST_P(PrefetchTest, ConfigureInternalAutoReadaheadSize) {
|
|
|
468
462
|
Close();
|
|
469
463
|
}
|
|
470
464
|
|
|
465
|
+
// This test verifies BlockBasedTableOptions.num_file_reads_for_auto_readahead
|
|
466
|
+
// is configured dynamically.
|
|
471
467
|
TEST_P(PrefetchTest, ConfigureNumFilesReadsForReadaheadSize) {
|
|
472
468
|
// First param is if the mockFS support_prefetch or not
|
|
473
469
|
bool support_prefetch =
|
|
@@ -482,26 +478,13 @@ TEST_P(PrefetchTest, ConfigureNumFilesReadsForReadaheadSize) {
|
|
|
482
478
|
// Second param is if directIO is enabled or not
|
|
483
479
|
bool use_direct_io = std::get<1>(GetParam());
|
|
484
480
|
|
|
485
|
-
Options options
|
|
486
|
-
|
|
487
|
-
options.create_if_missing = true;
|
|
488
|
-
options.compression = kNoCompression;
|
|
489
|
-
options.env = env.get();
|
|
490
|
-
|
|
481
|
+
Options options;
|
|
482
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
491
483
|
BlockBasedTableOptions table_options;
|
|
492
|
-
table_options
|
|
493
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
494
|
-
table_options.metadata_block_size = 1024;
|
|
495
|
-
table_options.index_type =
|
|
496
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
484
|
+
SetBlockBasedTableOptions(table_options);
|
|
497
485
|
table_options.num_file_reads_for_auto_readahead = 0;
|
|
498
486
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
499
487
|
|
|
500
|
-
if (use_direct_io) {
|
|
501
|
-
options.use_direct_reads = true;
|
|
502
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
488
|
int buff_prefetch_count = 0;
|
|
506
489
|
SyncPoint::GetInstance()->SetCallBack("FilePrefetchBuffer::Prefetch:Start",
|
|
507
490
|
[&](void*) { buff_prefetch_count++; });
|
|
@@ -578,6 +561,13 @@ TEST_P(PrefetchTest, ConfigureNumFilesReadsForReadaheadSize) {
|
|
|
578
561
|
}
|
|
579
562
|
#endif // !ROCKSDB_LITE
|
|
580
563
|
|
|
564
|
+
// This test verifies the basic functionality of implicit autoreadahead:
|
|
565
|
+
// - Enable implicit autoreadahead and prefetch only if sequential blocks are
|
|
566
|
+
// read,
|
|
567
|
+
// - If data is already in buffer and few blocks are not requested to read,
|
|
568
|
+
// don't reset,
|
|
569
|
+
// - If data blocks are sequential during read after enabling implicit
|
|
570
|
+
// autoreadahead, reset readahead parameters.
|
|
581
571
|
TEST_P(PrefetchTest, PrefetchWhenReseek) {
|
|
582
572
|
// First param is if the mockFS support_prefetch or not
|
|
583
573
|
bool support_prefetch =
|
|
@@ -592,25 +582,12 @@ TEST_P(PrefetchTest, PrefetchWhenReseek) {
|
|
|
592
582
|
// Second param is if directIO is enabled or not
|
|
593
583
|
bool use_direct_io = std::get<1>(GetParam());
|
|
594
584
|
|
|
595
|
-
Options options
|
|
596
|
-
|
|
597
|
-
options.create_if_missing = true;
|
|
598
|
-
options.compression = kNoCompression;
|
|
599
|
-
options.env = env.get();
|
|
600
|
-
|
|
585
|
+
Options options;
|
|
586
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
601
587
|
BlockBasedTableOptions table_options;
|
|
602
|
-
table_options
|
|
603
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
604
|
-
table_options.metadata_block_size = 1024;
|
|
605
|
-
table_options.index_type =
|
|
606
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
588
|
+
SetBlockBasedTableOptions(table_options);
|
|
607
589
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
608
590
|
|
|
609
|
-
if (use_direct_io) {
|
|
610
|
-
options.use_direct_reads = true;
|
|
611
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
591
|
int buff_prefetch_count = 0;
|
|
615
592
|
SyncPoint::GetInstance()->SetCallBack("FilePrefetchBuffer::Prefetch:Start",
|
|
616
593
|
[&](void*) { buff_prefetch_count++; });
|
|
@@ -846,6 +823,12 @@ TEST_P(PrefetchTest, PrefetchWhenReseek) {
|
|
|
846
823
|
Close();
|
|
847
824
|
}
|
|
848
825
|
|
|
826
|
+
// This test verifies the functionality of implicit autoreadahead when caching
|
|
827
|
+
// is enabled:
|
|
828
|
+
// - If data is already in buffer and few blocks are not requested to read,
|
|
829
|
+
// don't reset,
|
|
830
|
+
// - If block was eligible for prefetching/in buffer but found in cache, don't
|
|
831
|
+
// prefetch and reset.
|
|
849
832
|
TEST_P(PrefetchTest, PrefetchWhenReseekwithCache) {
|
|
850
833
|
// First param is if the mockFS support_prefetch or not
|
|
851
834
|
bool support_prefetch =
|
|
@@ -860,26 +843,15 @@ TEST_P(PrefetchTest, PrefetchWhenReseekwithCache) {
|
|
|
860
843
|
// Second param is if directIO is enabled or not
|
|
861
844
|
bool use_direct_io = std::get<1>(GetParam());
|
|
862
845
|
|
|
863
|
-
Options options
|
|
864
|
-
|
|
865
|
-
options.create_if_missing = true;
|
|
866
|
-
options.compression = kNoCompression;
|
|
867
|
-
options.env = env.get();
|
|
868
|
-
|
|
846
|
+
Options options;
|
|
847
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
869
848
|
BlockBasedTableOptions table_options;
|
|
849
|
+
SetBlockBasedTableOptions(table_options);
|
|
870
850
|
std::shared_ptr<Cache> cache = NewLRUCache(4 * 1024 * 1024, 2); // 8MB
|
|
871
851
|
table_options.block_cache = cache;
|
|
872
|
-
table_options.
|
|
873
|
-
table_options.metadata_block_size = 1024;
|
|
874
|
-
table_options.index_type =
|
|
875
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
852
|
+
table_options.no_block_cache = false;
|
|
876
853
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
877
854
|
|
|
878
|
-
if (use_direct_io) {
|
|
879
|
-
options.use_direct_reads = true;
|
|
880
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
881
|
-
}
|
|
882
|
-
|
|
883
855
|
int buff_prefetch_count = 0;
|
|
884
856
|
SyncPoint::GetInstance()->SetCallBack("FilePrefetchBuffer::Prefetch:Start",
|
|
885
857
|
[&](void*) { buff_prefetch_count++; });
|
|
@@ -978,6 +950,7 @@ TEST_P(PrefetchTest, PrefetchWhenReseekwithCache) {
|
|
|
978
950
|
}
|
|
979
951
|
|
|
980
952
|
#ifndef ROCKSDB_LITE
|
|
953
|
+
// This test verifies the functionality of ReadOptions.adaptive_readahead.
|
|
981
954
|
TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
982
955
|
const int kNumKeys = 1000;
|
|
983
956
|
// Set options
|
|
@@ -988,23 +961,11 @@ TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
|
988
961
|
bool use_direct_io = std::get<0>(GetParam());
|
|
989
962
|
bool is_adaptive_readahead = std::get<1>(GetParam());
|
|
990
963
|
|
|
991
|
-
Options options
|
|
992
|
-
|
|
993
|
-
options.create_if_missing = true;
|
|
994
|
-
options.compression = kNoCompression;
|
|
964
|
+
Options options;
|
|
965
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
995
966
|
options.statistics = CreateDBStatistics();
|
|
996
|
-
options.env = env.get();
|
|
997
|
-
|
|
998
|
-
if (use_direct_io) {
|
|
999
|
-
options.use_direct_reads = true;
|
|
1000
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1001
|
-
}
|
|
1002
967
|
BlockBasedTableOptions table_options;
|
|
1003
|
-
table_options
|
|
1004
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1005
|
-
table_options.metadata_block_size = 1024;
|
|
1006
|
-
table_options.index_type =
|
|
1007
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
968
|
+
SetBlockBasedTableOptions(table_options);
|
|
1008
969
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1009
970
|
|
|
1010
971
|
Status s = TryReopen(options);
|
|
@@ -1028,7 +989,6 @@ TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
|
1028
989
|
}
|
|
1029
990
|
MoveFilesToLevel(2);
|
|
1030
991
|
int buff_prefetch_count = 0;
|
|
1031
|
-
int buff_async_prefetch_count = 0;
|
|
1032
992
|
int readahead_carry_over_count = 0;
|
|
1033
993
|
int num_sst_files = NumTableFilesAtLevel(2);
|
|
1034
994
|
size_t current_readahead_size = 0;
|
|
@@ -1039,6 +999,101 @@ TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
|
1039
999
|
"FilePrefetchBuffer::Prefetch:Start",
|
|
1040
1000
|
[&](void*) { buff_prefetch_count++; });
|
|
1041
1001
|
|
|
1002
|
+
// The callback checks, since reads are sequential, readahead_size doesn't
|
|
1003
|
+
// start from 8KB when iterator moves to next file and its called
|
|
1004
|
+
// num_sst_files-1 times (excluding for first file).
|
|
1005
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1006
|
+
"BlockPrefetcher::SetReadaheadState", [&](void* arg) {
|
|
1007
|
+
readahead_carry_over_count++;
|
|
1008
|
+
size_t readahead_size = *reinterpret_cast<size_t*>(arg);
|
|
1009
|
+
if (readahead_carry_over_count) {
|
|
1010
|
+
ASSERT_GT(readahead_size, 8 * 1024);
|
|
1011
|
+
}
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1015
|
+
"FilePrefetchBuffer::TryReadFromCache", [&](void* arg) {
|
|
1016
|
+
current_readahead_size = *reinterpret_cast<size_t*>(arg);
|
|
1017
|
+
ASSERT_GT(current_readahead_size, 0);
|
|
1018
|
+
});
|
|
1019
|
+
|
|
1020
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1021
|
+
|
|
1022
|
+
ReadOptions ro;
|
|
1023
|
+
if (is_adaptive_readahead) {
|
|
1024
|
+
ro.adaptive_readahead = true;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
ASSERT_OK(options.statistics->Reset());
|
|
1028
|
+
|
|
1029
|
+
auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
|
|
1030
|
+
int num_keys = 0;
|
|
1031
|
+
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
|
1032
|
+
ASSERT_OK(iter->status());
|
|
1033
|
+
num_keys++;
|
|
1034
|
+
}
|
|
1035
|
+
ASSERT_EQ(num_keys, total_keys);
|
|
1036
|
+
|
|
1037
|
+
// For index and data blocks.
|
|
1038
|
+
if (is_adaptive_readahead) {
|
|
1039
|
+
ASSERT_EQ(readahead_carry_over_count, 2 * (num_sst_files - 1));
|
|
1040
|
+
} else {
|
|
1041
|
+
ASSERT_GT(buff_prefetch_count, 0);
|
|
1042
|
+
ASSERT_EQ(readahead_carry_over_count, 0);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1046
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
1047
|
+
}
|
|
1048
|
+
Close();
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
// This test verifies the functionality of ReadOptions.adaptive_readahead when
|
|
1052
|
+
// async_io is enabled.
|
|
1053
|
+
TEST_P(PrefetchTest, DBIterLevelReadAheadWithAsyncIO) {
|
|
1054
|
+
const int kNumKeys = 1000;
|
|
1055
|
+
// Set options
|
|
1056
|
+
std::shared_ptr<MockFS> fs =
|
|
1057
|
+
std::make_shared<MockFS>(env_->GetFileSystem(), false);
|
|
1058
|
+
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1059
|
+
|
|
1060
|
+
bool use_direct_io = std::get<0>(GetParam());
|
|
1061
|
+
bool is_adaptive_readahead = std::get<1>(GetParam());
|
|
1062
|
+
|
|
1063
|
+
Options options;
|
|
1064
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
1065
|
+
options.statistics = CreateDBStatistics();
|
|
1066
|
+
BlockBasedTableOptions table_options;
|
|
1067
|
+
SetBlockBasedTableOptions(table_options);
|
|
1068
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1069
|
+
|
|
1070
|
+
Status s = TryReopen(options);
|
|
1071
|
+
if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
|
|
1072
|
+
// If direct IO is not supported, skip the test
|
|
1073
|
+
return;
|
|
1074
|
+
} else {
|
|
1075
|
+
ASSERT_OK(s);
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
WriteBatch batch;
|
|
1079
|
+
Random rnd(309);
|
|
1080
|
+
int total_keys = 0;
|
|
1081
|
+
for (int j = 0; j < 5; j++) {
|
|
1082
|
+
for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
|
|
1083
|
+
ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
|
|
1084
|
+
total_keys++;
|
|
1085
|
+
}
|
|
1086
|
+
ASSERT_OK(db_->Write(WriteOptions(), &batch));
|
|
1087
|
+
ASSERT_OK(Flush());
|
|
1088
|
+
}
|
|
1089
|
+
MoveFilesToLevel(2);
|
|
1090
|
+
int buff_async_prefetch_count = 0;
|
|
1091
|
+
int readahead_carry_over_count = 0;
|
|
1092
|
+
int num_sst_files = NumTableFilesAtLevel(2);
|
|
1093
|
+
size_t current_readahead_size = 0;
|
|
1094
|
+
|
|
1095
|
+
// Test - Iterate over the keys sequentially.
|
|
1096
|
+
{
|
|
1042
1097
|
SyncPoint::GetInstance()->SetCallBack(
|
|
1043
1098
|
"FilePrefetchBuffer::PrefetchAsyncInternal:Start",
|
|
1044
1099
|
[&](void*) { buff_async_prefetch_count++; });
|
|
@@ -1066,8 +1121,8 @@ TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
|
1066
1121
|
ReadOptions ro;
|
|
1067
1122
|
if (is_adaptive_readahead) {
|
|
1068
1123
|
ro.adaptive_readahead = true;
|
|
1069
|
-
ro.async_io = true;
|
|
1070
1124
|
}
|
|
1125
|
+
ro.async_io = true;
|
|
1071
1126
|
|
|
1072
1127
|
ASSERT_OK(options.statistics->Reset());
|
|
1073
1128
|
|
|
@@ -1082,11 +1137,10 @@ TEST_P(PrefetchTest, DBIterLevelReadAhead) {
|
|
|
1082
1137
|
// For index and data blocks.
|
|
1083
1138
|
if (is_adaptive_readahead) {
|
|
1084
1139
|
ASSERT_EQ(readahead_carry_over_count, 2 * (num_sst_files - 1));
|
|
1085
|
-
ASSERT_GT(buff_async_prefetch_count, 0);
|
|
1086
1140
|
} else {
|
|
1087
|
-
ASSERT_GT(buff_prefetch_count, 0);
|
|
1088
1141
|
ASSERT_EQ(readahead_carry_over_count, 0);
|
|
1089
1142
|
}
|
|
1143
|
+
ASSERT_GT(buff_async_prefetch_count, 0);
|
|
1090
1144
|
|
|
1091
1145
|
// Check stats to make sure async prefetch is done.
|
|
1092
1146
|
{
|
|
@@ -1110,11 +1164,34 @@ class PrefetchTest1 : public DBTestBase,
|
|
|
1110
1164
|
public ::testing::WithParamInterface<bool> {
|
|
1111
1165
|
public:
|
|
1112
1166
|
PrefetchTest1() : DBTestBase("prefetch_test1", true) {}
|
|
1167
|
+
|
|
1168
|
+
void SetGenericOptions(Env* env, bool use_direct_io, Options& options) {
|
|
1169
|
+
options = CurrentOptions();
|
|
1170
|
+
options.write_buffer_size = 1024;
|
|
1171
|
+
options.create_if_missing = true;
|
|
1172
|
+
options.compression = kNoCompression;
|
|
1173
|
+
options.env = env;
|
|
1174
|
+
options.disable_auto_compactions = true;
|
|
1175
|
+
if (use_direct_io) {
|
|
1176
|
+
options.use_direct_reads = true;
|
|
1177
|
+
options.use_direct_io_for_flush_and_compaction = true;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
void SetBlockBasedTableOptions(BlockBasedTableOptions& table_options) {
|
|
1182
|
+
table_options.no_block_cache = true;
|
|
1183
|
+
table_options.cache_index_and_filter_blocks = false;
|
|
1184
|
+
table_options.metadata_block_size = 1024;
|
|
1185
|
+
table_options.index_type =
|
|
1186
|
+
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1187
|
+
}
|
|
1113
1188
|
};
|
|
1114
1189
|
|
|
1115
1190
|
INSTANTIATE_TEST_CASE_P(PrefetchTest1, PrefetchTest1, ::testing::Bool());
|
|
1116
1191
|
|
|
1117
1192
|
#ifndef ROCKSDB_LITE
|
|
1193
|
+
// This test verifies the functionality of ReadOptions.adaptive_readahead when
|
|
1194
|
+
// reads are not sequential.
|
|
1118
1195
|
TEST_P(PrefetchTest1, NonSequentialReadsWithAdaptiveReadahead) {
|
|
1119
1196
|
const int kNumKeys = 1000;
|
|
1120
1197
|
// Set options
|
|
@@ -1122,21 +1199,10 @@ TEST_P(PrefetchTest1, NonSequentialReadsWithAdaptiveReadahead) {
|
|
|
1122
1199
|
std::make_shared<MockFS>(env_->GetFileSystem(), false);
|
|
1123
1200
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1124
1201
|
|
|
1125
|
-
Options options
|
|
1126
|
-
|
|
1127
|
-
options.create_if_missing = true;
|
|
1128
|
-
options.compression = kNoCompression;
|
|
1129
|
-
options.env = env.get();
|
|
1130
|
-
if (GetParam()) {
|
|
1131
|
-
options.use_direct_reads = true;
|
|
1132
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1133
|
-
}
|
|
1202
|
+
Options options;
|
|
1203
|
+
SetGenericOptions(env.get(), GetParam(), options);
|
|
1134
1204
|
BlockBasedTableOptions table_options;
|
|
1135
|
-
table_options
|
|
1136
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1137
|
-
table_options.metadata_block_size = 1024;
|
|
1138
|
-
table_options.index_type =
|
|
1139
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1205
|
+
SetBlockBasedTableOptions(table_options);
|
|
1140
1206
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1141
1207
|
|
|
1142
1208
|
Status s = TryReopen(options);
|
|
@@ -1208,6 +1274,16 @@ TEST_P(PrefetchTest1, NonSequentialReadsWithAdaptiveReadahead) {
|
|
|
1208
1274
|
}
|
|
1209
1275
|
#endif //! ROCKSDB_LITE
|
|
1210
1276
|
|
|
1277
|
+
// This test verifies the functionality of adaptive_readaheadsize with cache and
|
|
1278
|
+
// if block is found in cache, decrease the readahead_size if
|
|
1279
|
+
// - its enabled internally by RocksDB (implicit_auto_readahead_) and,
|
|
1280
|
+
// - readahead_size is greater than 0 and,
|
|
1281
|
+
// - the block would have called prefetch API if not found in cache for
|
|
1282
|
+
// which conditions are:
|
|
1283
|
+
// - few/no bytes are in buffer and,
|
|
1284
|
+
// - block is sequential with the previous read and,
|
|
1285
|
+
// - num_file_reads_ + 1 (including this read) >
|
|
1286
|
+
// num_file_reads_for_auto_readahead_
|
|
1211
1287
|
TEST_P(PrefetchTest1, DecreaseReadAheadIfInCache) {
|
|
1212
1288
|
const int kNumKeys = 2000;
|
|
1213
1289
|
// Set options
|
|
@@ -1215,24 +1291,14 @@ TEST_P(PrefetchTest1, DecreaseReadAheadIfInCache) {
|
|
|
1215
1291
|
std::make_shared<MockFS>(env_->GetFileSystem(), false);
|
|
1216
1292
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1217
1293
|
|
|
1218
|
-
Options options
|
|
1219
|
-
|
|
1220
|
-
options.create_if_missing = true;
|
|
1221
|
-
options.compression = kNoCompression;
|
|
1222
|
-
options.env = env.get();
|
|
1223
|
-
if (GetParam()) {
|
|
1224
|
-
options.use_direct_reads = true;
|
|
1225
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1294
|
+
Options options;
|
|
1295
|
+
SetGenericOptions(env.get(), GetParam(), options);
|
|
1228
1296
|
options.statistics = CreateDBStatistics();
|
|
1229
1297
|
BlockBasedTableOptions table_options;
|
|
1298
|
+
SetBlockBasedTableOptions(table_options);
|
|
1230
1299
|
std::shared_ptr<Cache> cache = NewLRUCache(4 * 1024 * 1024, 2); // 8MB
|
|
1231
1300
|
table_options.block_cache = cache;
|
|
1232
|
-
table_options.
|
|
1233
|
-
table_options.metadata_block_size = 1024;
|
|
1234
|
-
table_options.index_type =
|
|
1235
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1301
|
+
table_options.no_block_cache = false;
|
|
1236
1302
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1237
1303
|
|
|
1238
1304
|
Status s = TryReopen(options);
|
|
@@ -1352,6 +1418,8 @@ TEST_P(PrefetchTest1, DecreaseReadAheadIfInCache) {
|
|
|
1352
1418
|
Close();
|
|
1353
1419
|
}
|
|
1354
1420
|
|
|
1421
|
+
// This test verifies the basic functionality of seek parallelization for
|
|
1422
|
+
// async_io.
|
|
1355
1423
|
TEST_P(PrefetchTest1, SeekParallelizationTest) {
|
|
1356
1424
|
const int kNumKeys = 2000;
|
|
1357
1425
|
// Set options
|
|
@@ -1359,23 +1427,11 @@ TEST_P(PrefetchTest1, SeekParallelizationTest) {
|
|
|
1359
1427
|
std::make_shared<MockFS>(env_->GetFileSystem(), false);
|
|
1360
1428
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1361
1429
|
|
|
1362
|
-
Options options
|
|
1363
|
-
|
|
1364
|
-
options.create_if_missing = true;
|
|
1365
|
-
options.compression = kNoCompression;
|
|
1366
|
-
options.env = env.get();
|
|
1367
|
-
if (GetParam()) {
|
|
1368
|
-
options.use_direct_reads = true;
|
|
1369
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1370
|
-
}
|
|
1371
|
-
|
|
1430
|
+
Options options;
|
|
1431
|
+
SetGenericOptions(env.get(), GetParam(), options);
|
|
1372
1432
|
options.statistics = CreateDBStatistics();
|
|
1373
1433
|
BlockBasedTableOptions table_options;
|
|
1374
|
-
table_options
|
|
1375
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1376
|
-
table_options.metadata_block_size = 1024;
|
|
1377
|
-
table_options.index_type =
|
|
1378
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1434
|
+
SetBlockBasedTableOptions(table_options);
|
|
1379
1435
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1380
1436
|
|
|
1381
1437
|
Status s = TryReopen(options);
|
|
@@ -1485,7 +1541,8 @@ void RunIOTracerParserTool(std::string trace_file) {
|
|
|
1485
1541
|
#endif // ROCKSDB_LITE
|
|
1486
1542
|
} // namespace
|
|
1487
1543
|
|
|
1488
|
-
// Tests the default implementation of ReadAsync API with PosixFileSystem
|
|
1544
|
+
// Tests the default implementation of ReadAsync API with PosixFileSystem during
|
|
1545
|
+
// prefetching.
|
|
1489
1546
|
TEST_P(PrefetchTest, ReadAsyncWithPosixFS) {
|
|
1490
1547
|
if (mem_env_ || encrypted_env_) {
|
|
1491
1548
|
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
@@ -1498,22 +1555,11 @@ TEST_P(PrefetchTest, ReadAsyncWithPosixFS) {
|
|
|
1498
1555
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1499
1556
|
|
|
1500
1557
|
bool use_direct_io = std::get<0>(GetParam());
|
|
1501
|
-
Options options
|
|
1502
|
-
|
|
1503
|
-
options.create_if_missing = true;
|
|
1504
|
-
options.compression = kNoCompression;
|
|
1505
|
-
options.env = env.get();
|
|
1558
|
+
Options options;
|
|
1559
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
1506
1560
|
options.statistics = CreateDBStatistics();
|
|
1507
|
-
if (use_direct_io) {
|
|
1508
|
-
options.use_direct_reads = true;
|
|
1509
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1510
|
-
}
|
|
1511
1561
|
BlockBasedTableOptions table_options;
|
|
1512
|
-
table_options
|
|
1513
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1514
|
-
table_options.metadata_block_size = 1024;
|
|
1515
|
-
table_options.index_type =
|
|
1516
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1562
|
+
SetBlockBasedTableOptions(table_options);
|
|
1517
1563
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1518
1564
|
|
|
1519
1565
|
Status s = TryReopen(options);
|
|
@@ -1600,6 +1646,8 @@ TEST_P(PrefetchTest, ReadAsyncWithPosixFS) {
|
|
|
1600
1646
|
Close();
|
|
1601
1647
|
}
|
|
1602
1648
|
|
|
1649
|
+
// This test verifies implementation of seek parallelization with
|
|
1650
|
+
// PosixFileSystem during prefetching.
|
|
1603
1651
|
TEST_P(PrefetchTest, MultipleSeekWithPosixFS) {
|
|
1604
1652
|
if (mem_env_ || encrypted_env_) {
|
|
1605
1653
|
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
@@ -1612,22 +1660,11 @@ TEST_P(PrefetchTest, MultipleSeekWithPosixFS) {
|
|
|
1612
1660
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1613
1661
|
|
|
1614
1662
|
bool use_direct_io = std::get<0>(GetParam());
|
|
1615
|
-
Options options
|
|
1616
|
-
|
|
1617
|
-
options.create_if_missing = true;
|
|
1618
|
-
options.compression = kNoCompression;
|
|
1619
|
-
options.env = env.get();
|
|
1663
|
+
Options options;
|
|
1664
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
1620
1665
|
options.statistics = CreateDBStatistics();
|
|
1621
|
-
if (use_direct_io) {
|
|
1622
|
-
options.use_direct_reads = true;
|
|
1623
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1624
|
-
}
|
|
1625
1666
|
BlockBasedTableOptions table_options;
|
|
1626
|
-
table_options
|
|
1627
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1628
|
-
table_options.metadata_block_size = 1024;
|
|
1629
|
-
table_options.index_type =
|
|
1630
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1667
|
+
SetBlockBasedTableOptions(table_options);
|
|
1631
1668
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1632
1669
|
|
|
1633
1670
|
Status s = TryReopen(options);
|
|
@@ -1774,7 +1811,9 @@ TEST_P(PrefetchTest, MultipleSeekWithPosixFS) {
|
|
|
1774
1811
|
Close();
|
|
1775
1812
|
}
|
|
1776
1813
|
|
|
1777
|
-
|
|
1814
|
+
// This test verifies implementation of seek parallelization with
|
|
1815
|
+
// PosixFileSystem during prefetching.
|
|
1816
|
+
TEST_P(PrefetchTest, SeekParallelizationTestWithPosix) {
|
|
1778
1817
|
if (mem_env_ || encrypted_env_) {
|
|
1779
1818
|
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
1780
1819
|
return;
|
|
@@ -1786,23 +1825,11 @@ TEST_P(PrefetchTest, SeekParallelizationTest1) {
|
|
|
1786
1825
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1787
1826
|
|
|
1788
1827
|
bool use_direct_io = std::get<0>(GetParam());
|
|
1789
|
-
Options options
|
|
1790
|
-
|
|
1791
|
-
options.create_if_missing = true;
|
|
1792
|
-
options.compression = kNoCompression;
|
|
1793
|
-
options.env = env.get();
|
|
1794
|
-
if (use_direct_io) {
|
|
1795
|
-
options.use_direct_reads = true;
|
|
1796
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1797
|
-
}
|
|
1798
|
-
|
|
1828
|
+
Options options;
|
|
1829
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
1799
1830
|
options.statistics = CreateDBStatistics();
|
|
1800
1831
|
BlockBasedTableOptions table_options;
|
|
1801
|
-
table_options
|
|
1802
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1803
|
-
table_options.metadata_block_size = 1024;
|
|
1804
|
-
table_options.index_type =
|
|
1805
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1832
|
+
SetBlockBasedTableOptions(table_options);
|
|
1806
1833
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1807
1834
|
|
|
1808
1835
|
Status s = TryReopen(options);
|
|
@@ -1904,6 +1931,7 @@ TEST_P(PrefetchTest, SeekParallelizationTest1) {
|
|
|
1904
1931
|
|
|
1905
1932
|
#ifndef ROCKSDB_LITE
|
|
1906
1933
|
#ifdef GFLAGS
|
|
1934
|
+
// This test verifies io_tracing with PosixFileSystem during prefetching.
|
|
1907
1935
|
TEST_P(PrefetchTest, TraceReadAsyncWithCallbackWrapper) {
|
|
1908
1936
|
if (mem_env_ || encrypted_env_) {
|
|
1909
1937
|
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
@@ -1916,22 +1944,11 @@ TEST_P(PrefetchTest, TraceReadAsyncWithCallbackWrapper) {
|
|
|
1916
1944
|
std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
|
|
1917
1945
|
|
|
1918
1946
|
bool use_direct_io = std::get<0>(GetParam());
|
|
1919
|
-
Options options
|
|
1920
|
-
|
|
1921
|
-
options.create_if_missing = true;
|
|
1922
|
-
options.compression = kNoCompression;
|
|
1923
|
-
options.env = env.get();
|
|
1947
|
+
Options options;
|
|
1948
|
+
SetGenericOptions(env.get(), use_direct_io, options);
|
|
1924
1949
|
options.statistics = CreateDBStatistics();
|
|
1925
|
-
if (use_direct_io) {
|
|
1926
|
-
options.use_direct_reads = true;
|
|
1927
|
-
options.use_direct_io_for_flush_and_compaction = true;
|
|
1928
|
-
}
|
|
1929
1950
|
BlockBasedTableOptions table_options;
|
|
1930
|
-
table_options
|
|
1931
|
-
table_options.cache_index_and_filter_blocks = false;
|
|
1932
|
-
table_options.metadata_block_size = 1024;
|
|
1933
|
-
table_options.index_type =
|
|
1934
|
-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
|
|
1951
|
+
SetBlockBasedTableOptions(table_options);
|
|
1935
1952
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1936
1953
|
|
|
1937
1954
|
Status s = TryReopen(options);
|
|
@@ -2036,6 +2053,7 @@ class FilePrefetchBufferTest : public testing::Test {
|
|
|
2036
2053
|
fs_ = FileSystem::Default();
|
|
2037
2054
|
test_dir_ = test::PerThreadDBPath("file_prefetch_buffer_test");
|
|
2038
2055
|
ASSERT_OK(fs_->CreateDir(test_dir_, IOOptions(), nullptr));
|
|
2056
|
+
stats_ = CreateDBStatistics();
|
|
2039
2057
|
}
|
|
2040
2058
|
|
|
2041
2059
|
void TearDown() override { EXPECT_OK(DestroyDir(env_, test_dir_)); }
|
|
@@ -2052,8 +2070,9 @@ class FilePrefetchBufferTest : public testing::Test {
|
|
|
2052
2070
|
std::string fpath = Path(fname);
|
|
2053
2071
|
std::unique_ptr<FSRandomAccessFile> f;
|
|
2054
2072
|
ASSERT_OK(fs_->NewRandomAccessFile(fpath, opts, &f, nullptr));
|
|
2055
|
-
reader->reset(new RandomAccessFileReader(
|
|
2056
|
-
|
|
2073
|
+
reader->reset(new RandomAccessFileReader(
|
|
2074
|
+
std::move(f), fpath, env_->GetSystemClock().get(),
|
|
2075
|
+
/*io_tracer=*/nullptr, stats_.get()));
|
|
2057
2076
|
}
|
|
2058
2077
|
|
|
2059
2078
|
void AssertResult(const std::string& content,
|
|
@@ -2066,11 +2085,13 @@ class FilePrefetchBufferTest : public testing::Test {
|
|
|
2066
2085
|
}
|
|
2067
2086
|
|
|
2068
2087
|
FileSystem* fs() { return fs_.get(); }
|
|
2088
|
+
Statistics* stats() { return stats_.get(); }
|
|
2069
2089
|
|
|
2070
2090
|
private:
|
|
2071
2091
|
Env* env_;
|
|
2072
2092
|
std::shared_ptr<FileSystem> fs_;
|
|
2073
2093
|
std::string test_dir_;
|
|
2094
|
+
std::shared_ptr<Statistics> stats_;
|
|
2074
2095
|
|
|
2075
2096
|
std::string Path(const std::string& fname) { return test_dir_ + "/" + fname; }
|
|
2076
2097
|
};
|
|
@@ -2090,7 +2111,8 @@ TEST_F(FilePrefetchBufferTest, SeekWithBlockCacheHit) {
|
|
|
2090
2111
|
// Simulate a seek of 4096 bytes at offset 0. Due to the readahead settings,
|
|
2091
2112
|
// it will do two reads of 4096+8192 and 8192
|
|
2092
2113
|
Status s = fpb.PrefetchAsync(IOOptions(), r.get(), 0, 4096, &result);
|
|
2093
|
-
|
|
2114
|
+
// Platforms that don't have IO uring may not support async IO
|
|
2115
|
+
ASSERT_TRUE(s.IsTryAgain() || s.IsNotSupported());
|
|
2094
2116
|
// Simulate a block cache hit
|
|
2095
2117
|
fpb.UpdateReadPattern(0, 4096, false);
|
|
2096
2118
|
// Now read some data that straddles the two prefetch buffers - offset 8192 to
|
|
@@ -2098,6 +2120,53 @@ TEST_F(FilePrefetchBufferTest, SeekWithBlockCacheHit) {
|
|
|
2098
2120
|
ASSERT_TRUE(fpb.TryReadFromCacheAsync(IOOptions(), r.get(), 8192, 8192,
|
|
2099
2121
|
&result, &s, Env::IOPriority::IO_LOW));
|
|
2100
2122
|
}
|
|
2123
|
+
|
|
2124
|
+
TEST_F(FilePrefetchBufferTest, NoSyncWithAsyncIO) {
|
|
2125
|
+
std::string fname = "seek-with-block-cache-hit";
|
|
2126
|
+
Random rand(0);
|
|
2127
|
+
std::string content = rand.RandomString(32768);
|
|
2128
|
+
Write(fname, content);
|
|
2129
|
+
|
|
2130
|
+
FileOptions opts;
|
|
2131
|
+
std::unique_ptr<RandomAccessFileReader> r;
|
|
2132
|
+
Read(fname, opts, &r);
|
|
2133
|
+
|
|
2134
|
+
FilePrefetchBuffer fpb(
|
|
2135
|
+
/*readahead_size=*/8192, /*max_readahead_size=*/16384, /*enable=*/true,
|
|
2136
|
+
/*track_min_offset=*/false, /*implicit_auto_readahead=*/false,
|
|
2137
|
+
/*num_file_reads=*/0, /*num_file_reads_for_auto_readahead=*/0, fs());
|
|
2138
|
+
|
|
2139
|
+
int read_async_called = 0;
|
|
2140
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2141
|
+
"FilePrefetchBuffer::ReadAsync",
|
|
2142
|
+
[&](void* /*arg*/) { read_async_called++; });
|
|
2143
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
2144
|
+
|
|
2145
|
+
Slice async_result;
|
|
2146
|
+
// Simulate a seek of 4000 bytes at offset 3000. Due to the readahead
|
|
2147
|
+
// settings, it will do two reads of 4000+4096 and 4096
|
|
2148
|
+
Status s = fpb.PrefetchAsync(IOOptions(), r.get(), 3000, 4000, &async_result);
|
|
2149
|
+
// Platforms that don't have IO uring may not support async IO
|
|
2150
|
+
ASSERT_TRUE(s.IsTryAgain() || s.IsNotSupported());
|
|
2151
|
+
|
|
2152
|
+
ASSERT_TRUE(fpb.TryReadFromCacheAsync(IOOptions(), r.get(), /*offset=*/3000,
|
|
2153
|
+
/*length=*/4000, &async_result, &s,
|
|
2154
|
+
Env::IOPriority::IO_LOW));
|
|
2155
|
+
// No sync call should be made.
|
|
2156
|
+
HistogramData sst_read_micros;
|
|
2157
|
+
stats()->histogramData(SST_READ_MICROS, &sst_read_micros);
|
|
2158
|
+
ASSERT_EQ(sst_read_micros.count, 0);
|
|
2159
|
+
|
|
2160
|
+
// Number of async calls should be.
|
|
2161
|
+
ASSERT_EQ(read_async_called, 2);
|
|
2162
|
+
// Length should be 4000.
|
|
2163
|
+
ASSERT_EQ(async_result.size(), 4000);
|
|
2164
|
+
// Data correctness.
|
|
2165
|
+
Slice result(content.c_str() + 3000, 4000);
|
|
2166
|
+
ASSERT_EQ(result.size(), 4000);
|
|
2167
|
+
ASSERT_EQ(result, async_result);
|
|
2168
|
+
}
|
|
2169
|
+
|
|
2101
2170
|
#endif // ROCKSDB_LITE
|
|
2102
2171
|
} // namespace ROCKSDB_NAMESPACE
|
|
2103
2172
|
|