@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.
Files changed (223) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
  2. package/deps/rocksdb/rocksdb/Makefile +15 -3
  3. package/deps/rocksdb/rocksdb/TARGETS +6 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
  5. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
  6. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
  9. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
  11. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
  12. package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
  13. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
  14. package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
  16. package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
  18. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
  19. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
  20. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
  21. package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
  22. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
  23. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
  25. package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
  27. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
  30. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
  33. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
  34. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
  35. package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
  36. package/deps/rocksdb/rocksdb/db/builder.h +2 -1
  37. package/deps/rocksdb/rocksdb/db/c.cc +15 -0
  38. package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
  39. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
  40. package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  60. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
  61. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
  67. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
  76. package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
  77. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  78. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
  79. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
  80. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
  81. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
  83. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
  84. package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
  85. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  86. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
  87. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  88. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  89. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  90. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
  93. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
  94. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
  95. package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
  96. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
  97. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
  98. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  99. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  100. package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
  101. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
  103. package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
  104. package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
  105. package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
  106. package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
  107. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  108. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
  110. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  111. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  112. package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
  113. package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
  114. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
  115. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  116. package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
  117. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  118. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
  119. package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
  121. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
  122. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
  123. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
  124. package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
  125. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  126. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
  127. package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
  128. package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
  129. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  130. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
  137. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
  138. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
  139. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
  140. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
  142. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
  144. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  146. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
  148. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
  150. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  151. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
  152. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  153. package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
  154. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
  155. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  156. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
  157. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  158. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  159. package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
  160. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  161. package/deps/rocksdb/rocksdb/src.mk +3 -0
  162. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
  175. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
  177. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
  178. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
  181. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
  182. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
  183. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
  185. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  186. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  187. package/deps/rocksdb/rocksdb/table/format.h +6 -3
  188. package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
  189. package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
  190. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
  191. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  192. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  193. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  194. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
  196. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
  197. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
  198. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  199. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
  200. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
  201. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  202. package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
  203. package/deps/rocksdb/rocksdb/util/compression.h +11 -2
  204. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  205. package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
  206. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
  207. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
  208. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
  209. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
  210. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  211. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
  212. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
  213. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
  214. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
  215. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
  216. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
  217. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
  218. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  219. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
  220. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
  221. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
  222. package/package.json +1 -1
  223. 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
- const int kNumKeys = 1100;
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 = CurrentOptions();
105
- options.write_buffer_size = 1024;
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
- Options options = CurrentOptions();
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.no_block_cache = true;
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
- Options options = CurrentOptions();
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.no_block_cache = true;
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 = CurrentOptions();
486
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
596
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
864
- options.write_buffer_size = 1024;
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.cache_index_and_filter_blocks = false;
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 = CurrentOptions();
992
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
1126
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
1219
- options.write_buffer_size = 1024;
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.cache_index_and_filter_blocks = false;
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 = CurrentOptions();
1363
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
1502
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
1616
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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
- TEST_P(PrefetchTest, SeekParallelizationTest1) {
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 = CurrentOptions();
1790
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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 = CurrentOptions();
1920
- options.write_buffer_size = 1024;
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.no_block_cache = true;
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(std::move(f), fpath,
2056
- env_->GetSystemClock().get()));
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
- ASSERT_EQ(s, Status::TryAgain());
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