@nxtedition/rocksdb 13.1.5 → 13.2.0

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 (237) hide show
  1. package/binding.cc +37 -12
  2. package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  7. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
  8. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
  9. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
  11. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  12. package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
  13. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
  14. package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
  15. package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
  16. package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
  39. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
  54. package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
  55. package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
  56. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
  57. package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
  58. package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
  59. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
  60. package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
  61. package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
  62. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
  65. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
  67. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
  68. package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
  69. package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
  70. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
  71. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
  72. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
  75. package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
  76. package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
  77. package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
  78. package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
  79. package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
  80. package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
  81. package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
  82. package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
  83. package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
  84. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
  85. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
  86. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
  87. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
  88. package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
  89. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
  90. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
  91. package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
  92. package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
  93. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
  94. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
  96. package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
  98. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
  99. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
  100. package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
  101. package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
  102. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
  103. package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
  104. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
  105. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
  106. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
  107. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
  108. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
  110. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
  113. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
  115. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
  120. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
  121. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
  122. package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
  123. package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
  124. package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
  125. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  126. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
  127. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
  128. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
  129. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
  130. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  131. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  132. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
  134. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
  135. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
  137. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
  140. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
  142. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
  144. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
  147. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
  148. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
  150. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
  152. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  153. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
  154. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
  155. package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
  156. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
  157. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
  158. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
  159. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
  160. package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
  161. package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
  162. package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
  163. package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
  164. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
  165. package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
  166. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
  167. package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
  168. package/deps/rocksdb/rocksdb/port/port.h +5 -9
  169. package/deps/rocksdb/rocksdb/src.mk +8 -0
  170. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
  171. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
  174. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
  175. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
  177. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
  178. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
  181. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  182. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  183. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
  184. package/deps/rocksdb/rocksdb/table/format.cc +3 -3
  185. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
  186. package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
  187. package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
  188. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
  189. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  190. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
  191. package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
  192. package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
  193. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
  194. package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
  196. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
  197. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
  198. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  199. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
  200. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
  201. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
  202. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
  203. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
  204. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
  205. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
  206. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
  207. package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
  208. package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
  209. package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
  210. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
  211. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
  212. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
  213. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
  214. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
  215. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
  216. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
  217. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
  218. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
  219. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
  220. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
  221. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
  222. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
  223. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
  224. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
  225. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
  226. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
  227. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
  228. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
  229. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
  230. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
  231. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
  232. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
  233. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
  234. package/deps/rocksdb/rocksdb.gyp +2 -0
  235. package/package.json +1 -1
  236. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  237. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -129,21 +129,6 @@ Status WideColumnSerialization::Deserialize(Slice& input,
129
129
  return Status::OK();
130
130
  }
131
131
 
132
- WideColumns::const_iterator WideColumnSerialization::Find(
133
- const WideColumns& columns, const Slice& column_name) {
134
- const auto it =
135
- std::lower_bound(columns.cbegin(), columns.cend(), column_name,
136
- [](const WideColumn& lhs, const Slice& rhs) {
137
- return lhs.name().compare(rhs) < 0;
138
- });
139
-
140
- if (it == columns.cend() || it->name() != column_name) {
141
- return columns.cend();
142
- }
143
-
144
- return it;
145
- }
146
-
147
132
  Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
148
133
  Slice& value) {
149
134
  WideColumns columns;
@@ -47,8 +47,6 @@ class WideColumnSerialization {
47
47
 
48
48
  static Status Deserialize(Slice& input, WideColumns& columns);
49
49
 
50
- static WideColumns::const_iterator Find(const WideColumns& columns,
51
- const Slice& column_name);
52
50
  static Status GetValueOfDefaultColumn(Slice& input, Slice& value);
53
51
 
54
52
  static constexpr uint32_t kCurrentVersion = 1;
@@ -5,6 +5,7 @@
5
5
 
6
6
  #include "db/wide/wide_column_serialization.h"
7
7
 
8
+ #include "db/wide/wide_columns_helper.h"
8
9
  #include "test_util/testharness.h"
9
10
  #include "util/coding.h"
10
11
 
@@ -99,27 +100,28 @@ TEST(WideColumnSerializationTest, SerializeDeserialize) {
99
100
  ASSERT_EQ(columns, deserialized_columns);
100
101
 
101
102
  {
102
- const auto it = WideColumnSerialization::Find(deserialized_columns, "foo");
103
+ const auto it = WideColumnsHelper::Find(deserialized_columns.cbegin(),
104
+ deserialized_columns.cend(), "foo");
103
105
  ASSERT_NE(it, deserialized_columns.cend());
104
106
  ASSERT_EQ(*it, deserialized_columns.front());
105
107
  }
106
108
 
107
109
  {
108
- const auto it =
109
- WideColumnSerialization::Find(deserialized_columns, "hello");
110
+ const auto it = WideColumnsHelper::Find(
111
+ deserialized_columns.cbegin(), deserialized_columns.cend(), "hello");
110
112
  ASSERT_NE(it, deserialized_columns.cend());
111
113
  ASSERT_EQ(*it, deserialized_columns.back());
112
114
  }
113
115
 
114
116
  {
115
- const auto it =
116
- WideColumnSerialization::Find(deserialized_columns, "fubar");
117
+ const auto it = WideColumnsHelper::Find(
118
+ deserialized_columns.cbegin(), deserialized_columns.cend(), "fubar");
117
119
  ASSERT_EQ(it, deserialized_columns.cend());
118
120
  }
119
121
 
120
122
  {
121
- const auto it =
122
- WideColumnSerialization::Find(deserialized_columns, "snafu");
123
+ const auto it = WideColumnsHelper::Find(
124
+ deserialized_columns.cbegin(), deserialized_columns.cend(), "snafu");
123
125
  ASSERT_EQ(it, deserialized_columns.cend());
124
126
  }
125
127
  }
@@ -5,7 +5,6 @@
5
5
 
6
6
  #include "db/wide/wide_columns_helper.h"
7
7
 
8
- #include <algorithm>
9
8
  #include <ios>
10
9
 
11
10
  #include "db/wide/wide_column_serialization.h"
@@ -42,11 +41,4 @@ Status WideColumnsHelper::DumpSliceAsWideColumns(const Slice& value,
42
41
  return s;
43
42
  }
44
43
 
45
- void WideColumnsHelper::SortColumns(WideColumns& columns) {
46
- std::sort(columns.begin(), columns.end(),
47
- [](const WideColumn& lhs, const WideColumn& rhs) {
48
- return lhs.name().compare(rhs.name()) < 0;
49
- });
50
- }
51
-
52
44
  } // namespace ROCKSDB_NAMESPACE
@@ -4,8 +4,10 @@
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
 
6
6
  #pragma once
7
+
8
+ #include <algorithm>
9
+ #include <cassert>
7
10
  #include <ostream>
8
- #include <string>
9
11
 
10
12
  #include "rocksdb/rocksdb_namespace.h"
11
13
  #include "rocksdb/wide_columns.h"
@@ -34,7 +36,31 @@ class WideColumnsHelper {
34
36
  return columns.front().value();
35
37
  }
36
38
 
37
- static void SortColumns(WideColumns& columns);
39
+ static void SortColumns(WideColumns& columns) {
40
+ std::sort(columns.begin(), columns.end(),
41
+ [](const WideColumn& lhs, const WideColumn& rhs) {
42
+ return lhs.name().compare(rhs.name()) < 0;
43
+ });
44
+ }
45
+
46
+ template <typename Iterator>
47
+ static Iterator Find(Iterator begin, Iterator end, const Slice& column_name) {
48
+ assert(std::is_sorted(begin, end,
49
+ [](const WideColumn& lhs, const WideColumn& rhs) {
50
+ return lhs.name().compare(rhs.name()) < 0;
51
+ }));
52
+
53
+ auto it = std::lower_bound(begin, end, column_name,
54
+ [](const WideColumn& lhs, const Slice& rhs) {
55
+ return lhs.name().compare(rhs) < 0;
56
+ });
57
+
58
+ if (it == end || it->name() != column_name) {
59
+ return end;
60
+ }
61
+
62
+ return it;
63
+ }
38
64
  };
39
65
 
40
66
  } // namespace ROCKSDB_NAMESPACE
@@ -1160,6 +1160,34 @@ Status WriteBatchInternal::InsertNoop(WriteBatch* b) {
1160
1160
  return Status::OK();
1161
1161
  }
1162
1162
 
1163
+ ValueType WriteBatchInternal::GetBeginPrepareType(bool write_after_commit,
1164
+ bool unprepared_batch) {
1165
+ return write_after_commit
1166
+ ? kTypeBeginPrepareXID
1167
+ : (unprepared_batch ? kTypeBeginUnprepareXID
1168
+ : kTypeBeginPersistedPrepareXID);
1169
+ }
1170
+
1171
+ Status WriteBatchInternal::InsertBeginPrepare(WriteBatch* b,
1172
+ bool write_after_commit,
1173
+ bool unprepared_batch) {
1174
+ b->rep_.push_back(static_cast<char>(
1175
+ GetBeginPrepareType(write_after_commit, unprepared_batch)));
1176
+ b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
1177
+ ContentFlags::HAS_BEGIN_PREPARE,
1178
+ std::memory_order_relaxed);
1179
+ return Status::OK();
1180
+ }
1181
+
1182
+ Status WriteBatchInternal::InsertEndPrepare(WriteBatch* b, const Slice& xid) {
1183
+ b->rep_.push_back(static_cast<char>(kTypeEndPrepareXID));
1184
+ PutLengthPrefixedSlice(&b->rep_, xid);
1185
+ b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
1186
+ ContentFlags::HAS_END_PREPARE,
1187
+ std::memory_order_relaxed);
1188
+ return Status::OK();
1189
+ }
1190
+
1163
1191
  Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
1164
1192
  bool write_after_commit,
1165
1193
  bool unprepared_batch) {
@@ -1175,13 +1203,8 @@ Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
1175
1203
 
1176
1204
  // rewrite noop as begin marker
1177
1205
  b->rep_[12] = static_cast<char>(
1178
- write_after_commit ? kTypeBeginPrepareXID
1179
- : (unprepared_batch ? kTypeBeginUnprepareXID
1180
- : kTypeBeginPersistedPrepareXID));
1181
- b->rep_.push_back(static_cast<char>(kTypeEndPrepareXID));
1182
- PutLengthPrefixedSlice(&b->rep_, xid);
1206
+ GetBeginPrepareType(write_after_commit, unprepared_batch));
1183
1207
  b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
1184
- ContentFlags::HAS_END_PREPARE |
1185
1208
  ContentFlags::HAS_BEGIN_PREPARE,
1186
1209
  std::memory_order_relaxed);
1187
1210
  if (unprepared_batch) {
@@ -1189,7 +1212,7 @@ Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
1189
1212
  ContentFlags::HAS_BEGIN_UNPREPARE,
1190
1213
  std::memory_order_relaxed);
1191
1214
  }
1192
- return Status::OK();
1215
+ return WriteBatchInternal::InsertEndPrepare(b, xid);
1193
1216
  }
1194
1217
 
1195
1218
  Status WriteBatchInternal::MarkCommit(WriteBatch* b, const Slice& xid) {
@@ -2624,9 +2647,8 @@ class MemTableInserter : public WriteBatch::Handler {
2624
2647
  // TODO(ajkr): refactor `SeekToColumnFamily()` so it returns a `Status`.
2625
2648
  ret_status.PermitUncheckedError();
2626
2649
  return Status::NotSupported(
2627
- std::string("DeleteRange not supported for table type ") +
2628
- cfd->ioptions()->table_factory->Name() + " in CF " +
2629
- cfd->GetName());
2650
+ std::string("CF " + cfd->GetName() +
2651
+ " reports it does not support DeleteRange"));
2630
2652
  }
2631
2653
  int cmp =
2632
2654
  cfd->user_comparator()->CompareWithoutTimestamp(begin_key, end_key);
@@ -122,6 +122,15 @@ class WriteBatchInternal {
122
122
  static Status PutBlobIndex(WriteBatch* batch, uint32_t column_family_id,
123
123
  const Slice& key, const Slice& value);
124
124
 
125
+ static ValueType GetBeginPrepareType(bool write_after_commit,
126
+ bool unprepared_batch);
127
+
128
+ static Status InsertBeginPrepare(WriteBatch* batch,
129
+ const bool write_after_commit = true,
130
+ bool unprepared_batch = false);
131
+
132
+ static Status InsertEndPrepare(WriteBatch* batch, const Slice& xid);
133
+
125
134
  static Status MarkEndPrepare(WriteBatch* batch, const Slice& xid,
126
135
  const bool write_after_commit = true,
127
136
  const bool unprepared_batch = false);
@@ -59,7 +59,8 @@ static std::string PrintContents(WriteBatch* b,
59
59
  InternalIterator* iter;
60
60
  if (i == 0) {
61
61
  iter = mem->NewIterator(ReadOptions(), /*seqno_to_time_mapping=*/nullptr,
62
- &arena, /*prefix_extractor=*/nullptr);
62
+ &arena, /*prefix_extractor=*/nullptr,
63
+ /*for_flush=*/false);
63
64
  arena_iter_guard.reset(iter);
64
65
  } else {
65
66
  iter = mem->NewRangeTombstoneIterator(ReadOptions(),
@@ -523,8 +523,10 @@ size_t WriteThread::EnterAsBatchGroupLeader(Writer* leader,
523
523
  // those are something else. They want to be alone
524
524
  (w->callback != nullptr && !w->callback->AllowWriteBatching()) ||
525
525
  // dont batch writes that don't want to be batched
526
- (size + WriteBatchInternal::ByteSize(w->batch) > max_size)
526
+ (size + WriteBatchInternal::ByteSize(w->batch) > max_size) ||
527
527
  // Do not make batch too big
528
+ (leader->ingest_wbwi || w->ingest_wbwi)
529
+ // ingesting WBWI needs to be its own group
528
530
  ) {
529
531
  // remove from list
530
532
  w->link_older->link_newer = w->link_newer;
@@ -148,6 +148,8 @@ class WriteThread {
148
148
  Writer* link_older; // read/write only before linking, or as leader
149
149
  Writer* link_newer; // lazy, read/write only before linking, or as leader
150
150
 
151
+ bool ingest_wbwi;
152
+
151
153
  Writer()
152
154
  : batch(nullptr),
153
155
  sync(false),
@@ -174,7 +176,8 @@ class WriteThread {
174
176
  WriteCallback* _callback, UserWriteCallback* _user_write_cb,
175
177
  uint64_t _log_ref, bool _disable_memtable, size_t _batch_cnt = 0,
176
178
  PreReleaseCallback* _pre_release_callback = nullptr,
177
- PostMemTableCallback* _post_memtable_callback = nullptr)
179
+ PostMemTableCallback* _post_memtable_callback = nullptr,
180
+ bool _ingest_wbwi = false)
178
181
  : batch(_batch),
179
182
  // TODO: store a copy of WriteOptions instead of its seperated data
180
183
  // members
@@ -196,7 +199,8 @@ class WriteThread {
196
199
  write_group(nullptr),
197
200
  sequence(kMaxSequenceNumber),
198
201
  link_older(nullptr),
199
- link_newer(nullptr) {}
202
+ link_newer(nullptr),
203
+ ingest_wbwi(_ingest_wbwi) {}
200
204
 
201
205
  ~Writer() {
202
206
  if (made_waitable) {
@@ -613,6 +613,21 @@ class BatchedOpsStressTest : public StressTest {
613
613
  // no iterator should finish before the first one
614
614
  assert(iters[i]->Valid() &&
615
615
  iters[i]->key().starts_with(prefix_slices[i]));
616
+
617
+ if (ro_copies[i].allow_unprepared_value) {
618
+ // Save key in case PrepareValue fails and invalidates the iterator
619
+ const std::string prepare_value_key =
620
+ iters[i]->key().ToString(/* hex */ true);
621
+
622
+ if (!iters[i]->PrepareValue()) {
623
+ fprintf(stderr,
624
+ "prefix scan error: PrepareValue failed for key %s: %s\n",
625
+ prepare_value_key.c_str(),
626
+ iters[i]->status().ToString().c_str());
627
+ continue;
628
+ }
629
+ }
630
+
616
631
  values[i] = iters[i]->value().ToString();
617
632
 
618
633
  // make sure the last character of the value is the expected digit
@@ -802,6 +802,13 @@ class CfConsistencyStressTest : public StressTest {
802
802
  iter->Next()) {
803
803
  ++count;
804
804
 
805
+ if (ro_copy.allow_unprepared_value) {
806
+ if (!iter->PrepareValue()) {
807
+ s = iter->status();
808
+ break;
809
+ }
810
+ }
811
+
805
812
  if (!VerifyWideColumns(iter->value(), iter->columns())) {
806
813
  s = Status::Corruption("Value and columns inconsistent",
807
814
  DebugString(iter->value(), iter->columns()));
@@ -417,6 +417,10 @@ DECLARE_bool(check_multiget_consistency);
417
417
  DECLARE_bool(check_multiget_entity_consistency);
418
418
  DECLARE_bool(inplace_update_support);
419
419
  DECLARE_uint32(uncache_aggressiveness);
420
+ DECLARE_int32(test_ingest_standalone_range_deletion_one_in);
421
+ DECLARE_bool(allow_unprepared_value);
422
+ DECLARE_string(file_temperature_age_thresholds);
423
+ DECLARE_uint32(commit_bypass_memtable_one_in);
420
424
 
421
425
  constexpr long KB = 1024;
422
426
  constexpr int kRandomValueMaxFactor = 3;
@@ -546,6 +546,10 @@ DEFINE_uint32(use_timed_put_one_in, 0,
546
546
  "If greater than zero, TimedPut is used per every N write ops on "
547
547
  "on average.");
548
548
 
549
+ DEFINE_string(file_temperature_age_thresholds, "",
550
+ "See CompactionOptionsFIFO::file_temperature_age_thresholds. "
551
+ "empty == unset");
552
+
549
553
  static const bool FLAGS_subcompactions_dummy __attribute__((__unused__)) =
550
554
  RegisterFlagValidator(&FLAGS_subcompactions, &ValidateUint32Range);
551
555
 
@@ -835,6 +839,14 @@ DEFINE_bool(use_get_entity, false, "If set, use the GetEntity API for reads");
835
839
  DEFINE_bool(use_multi_get_entity, false,
836
840
  "If set, use the MultiGetEntity API for reads");
837
841
 
842
+ DEFINE_int32(test_ingest_standalone_range_deletion_one_in, 0,
843
+ "If non-zero, file ingestion flow will test standalone range "
844
+ "deletion file once every N file ingestion operations.");
845
+
846
+ DEFINE_bool(allow_unprepared_value,
847
+ ROCKSDB_NAMESPACE::ReadOptions().allow_unprepared_value,
848
+ "Allow lazy loading of values for range scans");
849
+
838
850
  static bool ValidateInt32Percent(const char* flagname, int32_t value) {
839
851
  if (value < 0 || value > 100) {
840
852
  fprintf(stderr, "Invalid value for --%s: %d, 0<= pct <=100 \n", flagname,
@@ -1031,8 +1043,9 @@ DEFINE_int32(continuous_verification_interval, 1000,
1031
1043
  "disables continuous verification.");
1032
1044
 
1033
1045
  DEFINE_int32(approximate_size_one_in, 64,
1034
- "If non-zero, DB::GetApproximateSizes() will be called against"
1035
- " random key ranges.");
1046
+ "If non-zero, DB::GetApproximateSizes() and "
1047
+ "DB::GetApproximateMemTableStats() will be called against "
1048
+ "random key ranges.");
1036
1049
 
1037
1050
  DEFINE_int32(read_fault_one_in, 1000,
1038
1051
  "On non-zero, enables fault injection on read");
@@ -1456,4 +1469,7 @@ DEFINE_bool(paranoid_memory_checks,
1456
1469
  ROCKSDB_NAMESPACE::Options().paranoid_memory_checks,
1457
1470
  "Sets CF option paranoid_memory_checks.");
1458
1471
 
1472
+ DEFINE_uint32(commit_bypass_memtable_one_in, 0,
1473
+ "If greater than zero, transaction option will set "
1474
+ "commit_bypass_memtable to per every N transactions on average.");
1459
1475
  #endif // GFLAGS
@@ -274,6 +274,8 @@ bool StressTest::BuildOptionsTable() {
274
274
  return true;
275
275
  }
276
276
 
277
+ bool keepRibbonFilterPolicyOnly = FLAGS_bloom_before_level != INT_MAX;
278
+
277
279
  std::unordered_map<std::string, std::vector<std::string>> options_tbl = {
278
280
  {"write_buffer_size",
279
281
  {std::to_string(options_.write_buffer_size),
@@ -339,6 +341,17 @@ bool StressTest::BuildOptionsTable() {
339
341
  "2",
340
342
  }},
341
343
  {"max_sequential_skip_in_iterations", {"4", "8", "12"}},
344
+ {"block_based_table_factory",
345
+ {
346
+ keepRibbonFilterPolicyOnly ? "{filter_policy=ribbonfilter:2.35}"
347
+ : "{filter_policy=bloomfilter:2.34}",
348
+ "{filter_policy=ribbonfilter:5.67:-1}",
349
+ keepRibbonFilterPolicyOnly ? "{filter_policy=ribbonfilter:8.9:3}"
350
+ : "{filter_policy=nullptr}",
351
+ "{block_size=" + std::to_string(FLAGS_block_size) + "}",
352
+ "{block_size=" +
353
+ std::to_string(FLAGS_block_size + (FLAGS_seed & 0xFFFU)) + "}",
354
+ }},
342
355
  };
343
356
  if (FLAGS_compaction_style == kCompactionStyleUniversal &&
344
357
  FLAGS_universal_max_read_amp > 0) {
@@ -393,13 +406,23 @@ bool StressTest::BuildOptionsTable() {
393
406
  std::vector<std::string>{"kDisable", "kFlushOnly"});
394
407
  }
395
408
 
396
- if (FLAGS_bloom_before_level != INT_MAX) {
409
+ if (keepRibbonFilterPolicyOnly) {
397
410
  // Can modify RibbonFilterPolicy field
398
411
  options_tbl.emplace("table_factory.filter_policy.bloom_before_level",
399
412
  std::vector<std::string>{"-1", "0", "1", "2",
400
413
  "2147483646", "2147483647"});
401
414
  }
402
415
 
416
+ if (!FLAGS_file_temperature_age_thresholds.empty()) {
417
+ // Modify file_temperature_age_thresholds only if it is set initially
418
+ // (FIFO tiered storage setup)
419
+ options_tbl.emplace(
420
+ "file_temperature_age_thresholds",
421
+ std::vector<std::string>{
422
+ "{{temperature=kWarm;age=30}:{temperature=kCold;age=300}}",
423
+ "{{temperature=kCold;age=100}}", "{}"});
424
+ }
425
+
403
426
  options_table_ = std::move(options_tbl);
404
427
 
405
428
  for (const auto& iter : options_table_) {
@@ -782,8 +805,9 @@ void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
782
805
  }
783
806
  }
784
807
 
785
- Status StressTest::NewTxn(WriteOptions& write_opts,
786
- std::unique_ptr<Transaction>* out_txn) {
808
+ Status StressTest::NewTxn(WriteOptions& write_opts, ThreadState* thread,
809
+ std::unique_ptr<Transaction>* out_txn,
810
+ bool* commit_bypass_memtable) {
787
811
  if (!FLAGS_use_txn) {
788
812
  return Status::InvalidArgument("NewTxn when FLAGS_use_txn is not set");
789
813
  }
@@ -798,6 +822,15 @@ Status StressTest::NewTxn(WriteOptions& write_opts,
798
822
  FLAGS_use_only_the_last_commit_time_batch_for_recovery;
799
823
  txn_options.lock_timeout = 600000; // 10 min
800
824
  txn_options.deadlock_detect = true;
825
+ if (FLAGS_commit_bypass_memtable_one_in > 0) {
826
+ assert(FLAGS_txn_write_policy == 0);
827
+ assert(FLAGS_user_timestamp_size == 0);
828
+ txn_options.commit_bypass_memtable =
829
+ thread->rand.OneIn(FLAGS_commit_bypass_memtable_one_in);
830
+ if (commit_bypass_memtable) {
831
+ *commit_bypass_memtable = txn_options.commit_bypass_memtable;
832
+ }
833
+ }
801
834
  out_txn->reset(txn_db_->BeginTransaction(write_opts, txn_options));
802
835
  auto istr = std::to_string(txn_id.fetch_add(1));
803
836
  Status s = (*out_txn)->SetName("xid" + istr);
@@ -853,11 +886,12 @@ Status StressTest::CommitTxn(Transaction& txn, ThreadState* thread) {
853
886
  return s;
854
887
  }
855
888
 
856
- Status StressTest::ExecuteTransaction(
857
- WriteOptions& write_opts, ThreadState* thread,
858
- std::function<Status(Transaction&)>&& ops) {
889
+ Status StressTest::ExecuteTransaction(WriteOptions& write_opts,
890
+ ThreadState* thread,
891
+ std::function<Status(Transaction&)>&& ops,
892
+ bool* commit_bypass_memtable) {
859
893
  std::unique_ptr<Transaction> txn;
860
- Status s = NewTxn(write_opts, &txn);
894
+ Status s = NewTxn(write_opts, thread, &txn, commit_bypass_memtable);
861
895
  std::string try_again_messages;
862
896
  if (s.ok()) {
863
897
  for (int tries = 1;; ++tries) {
@@ -905,6 +939,8 @@ void StressTest::OperateDb(ThreadState* thread) {
905
939
  read_opts.auto_readahead_size = FLAGS_auto_readahead_size;
906
940
  read_opts.fill_cache = FLAGS_fill_cache;
907
941
  read_opts.optimize_multiget_for_io = FLAGS_optimize_multiget_for_io;
942
+ read_opts.allow_unprepared_value = FLAGS_allow_unprepared_value;
943
+
908
944
  WriteOptions write_opts;
909
945
  if (FLAGS_rate_limit_auto_wal_flush) {
910
946
  write_opts.rate_limiter_priority = Env::IO_USER;
@@ -1733,6 +1769,15 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
1733
1769
  op_logs += "S " + key.ToString(true) + " ";
1734
1770
  }
1735
1771
 
1772
+ if (iter->Valid() && ro.allow_unprepared_value) {
1773
+ op_logs += "*";
1774
+
1775
+ if (!iter->PrepareValue()) {
1776
+ assert(!iter->Valid());
1777
+ assert(!iter->status().ok());
1778
+ }
1779
+ }
1780
+
1736
1781
  if (!iter->status().ok() && IsErrorInjectedAndRetryable(iter->status())) {
1737
1782
  return iter->status();
1738
1783
  } else if (!cmp_iter->status().ok() &&
@@ -1764,6 +1809,15 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
1764
1809
 
1765
1810
  last_op = kLastOpNextOrPrev;
1766
1811
 
1812
+ if (iter->Valid() && ro.allow_unprepared_value) {
1813
+ op_logs += "*";
1814
+
1815
+ if (!iter->PrepareValue()) {
1816
+ assert(!iter->Valid());
1817
+ assert(!iter->status().ok());
1818
+ }
1819
+ }
1820
+
1767
1821
  if (!iter->status().ok() && IsErrorInjectedAndRetryable(iter->status())) {
1768
1822
  return iter->status();
1769
1823
  } else if (!cmp_iter->status().ok() &&
@@ -1893,7 +1947,9 @@ void StressTest::VerifyIterator(
1893
1947
  << ", iterate_lower_bound: "
1894
1948
  << (ro.iterate_lower_bound
1895
1949
  ? ro.iterate_lower_bound->ToString(true).c_str()
1896
- : "");
1950
+ : "")
1951
+ << ", allow_unprepared_value: " << ro.allow_unprepared_value;
1952
+
1897
1953
  if (iter->Valid() && !cmp_iter->Valid()) {
1898
1954
  if (pe != nullptr) {
1899
1955
  if (!pe->InDomain(seek_key)) {
@@ -1987,6 +2043,7 @@ void StressTest::VerifyIterator(
1987
2043
  *diverged = true;
1988
2044
  }
1989
2045
  }
2046
+
1990
2047
  if (*diverged) {
1991
2048
  fprintf(stderr, "VerifyIterator failed. Control CF %s\n",
1992
2049
  cmp_cfh->GetName().c_str());
@@ -2427,22 +2484,31 @@ Status StressTest::TestApproximateSize(
2427
2484
  std::string key1_str = Key(key1);
2428
2485
  std::string key2_str = Key(key2);
2429
2486
  Range range{Slice(key1_str), Slice(key2_str)};
2430
- SizeApproximationOptions sao;
2431
- sao.include_memtables = thread->rand.OneIn(2);
2432
- if (sao.include_memtables) {
2433
- sao.include_files = thread->rand.OneIn(2);
2434
- }
2435
- if (thread->rand.OneIn(2)) {
2487
+ if (thread->rand.OneIn(3)) {
2488
+ // Call GetApproximateMemTableStats instead
2489
+ uint64_t count, size;
2490
+ db_->GetApproximateMemTableStats(column_families_[rand_column_families[0]],
2491
+ range, &count, &size);
2492
+ return Status::OK();
2493
+ } else {
2494
+ // Call GetApproximateSizes
2495
+ SizeApproximationOptions sao;
2496
+ sao.include_memtables = thread->rand.OneIn(2);
2497
+ if (sao.include_memtables) {
2498
+ sao.include_files = thread->rand.OneIn(2);
2499
+ }
2436
2500
  if (thread->rand.OneIn(2)) {
2437
- sao.files_size_error_margin = 0.0;
2438
- } else {
2439
- sao.files_size_error_margin =
2440
- static_cast<double>(thread->rand.Uniform(3));
2501
+ if (thread->rand.OneIn(2)) {
2502
+ sao.files_size_error_margin = 0.0;
2503
+ } else {
2504
+ sao.files_size_error_margin =
2505
+ static_cast<double>(thread->rand.Uniform(3));
2506
+ }
2441
2507
  }
2508
+ uint64_t result;
2509
+ return db_->GetApproximateSizes(
2510
+ sao, column_families_[rand_column_families[0]], &range, 1, &result);
2442
2511
  }
2443
- uint64_t result;
2444
- return db_->GetApproximateSizes(
2445
- sao, column_families_[rand_column_families[0]], &range, 1, &result);
2446
2512
  }
2447
2513
 
2448
2514
  Status StressTest::TestCheckpoint(ThreadState* thread,
@@ -3674,7 +3740,7 @@ void StressTest::Reopen(ThreadState* thread) {
3674
3740
  // crash-recovery verification does. Therefore it always expects no data loss
3675
3741
  // and we should ensure no data loss in testing.
3676
3742
  // TODO(hx235): eliminate the FlushWAL(true /* sync */)/SyncWAL() below
3677
- if (!FLAGS_disable_wal && FLAGS_avoid_flush_during_shutdown) {
3743
+ if (!FLAGS_disable_wal) {
3678
3744
  Status s;
3679
3745
  if (FLAGS_manual_wal_flush_one_in > 0) {
3680
3746
  s = db_->FlushWAL(/*sync=*/true);
@@ -4111,6 +4177,18 @@ void InitializeOptionsFromFlags(
4111
4177
  options.default_temperature =
4112
4178
  StringToTemperature(FLAGS_default_temperature.c_str());
4113
4179
 
4180
+ if (!FLAGS_file_temperature_age_thresholds.empty()) {
4181
+ Status s = GetColumnFamilyOptionsFromString(
4182
+ {}, options,
4183
+ "compaction_options_fifo={file_temperature_age_thresholds=" +
4184
+ FLAGS_file_temperature_age_thresholds + "}",
4185
+ &options);
4186
+ if (!s.ok()) {
4187
+ fprintf(stderr, "While setting file_temperature_age_thresholds: %s\n",
4188
+ s.ToString().c_str());
4189
+ exit(1);
4190
+ }
4191
+ }
4114
4192
  options.preclude_last_level_data_seconds =
4115
4193
  FLAGS_preclude_last_level_data_seconds;
4116
4194
  options.preserve_internal_time_seconds = FLAGS_preserve_internal_time_seconds;
@@ -71,14 +71,19 @@ class StressTest {
71
71
  void UpdateIfInitialWriteFails(Env* db_stress_env, const Status& write_s,
72
72
  Status* initial_write_s,
73
73
  bool* initial_wal_write_may_succeed,
74
- uint64_t* wait_for_recover_start_time) {
74
+ uint64_t* wait_for_recover_start_time,
75
+ bool commit_bypass_memtable = false) {
75
76
  assert(db_stress_env && initial_write_s && initial_wal_write_may_succeed &&
76
77
  wait_for_recover_start_time);
77
78
  // Only update `initial_write_s`, `initial_wal_write_may_succeed` when the
78
79
  // first write fails
79
80
  if (!write_s.ok() && (*initial_write_s).ok()) {
80
81
  *initial_write_s = write_s;
82
+ // With commit_bypass_memtable, we create a new WAL after WAL write
83
+ // succeeds, that wal creation may fail due to injected error. So the
84
+ // initial wal write may succeed even if status is failed to write to wal
81
85
  *initial_wal_write_may_succeed =
86
+ commit_bypass_memtable ||
82
87
  !FaultInjectionTestFS::IsFailedToWriteToWALError(*initial_write_s);
83
88
  *wait_for_recover_start_time = db_stress_env->NowMicros();
84
89
  }
@@ -138,13 +143,19 @@ class StressTest {
138
143
  SharedState* shared);
139
144
 
140
145
  // ExecuteTransaction is recommended instead
141
- Status NewTxn(WriteOptions& write_opts,
142
- std::unique_ptr<Transaction>* out_txn);
146
+ // @param commit_bypass_memtable Whether commit_bypass_memtable is set to
147
+ // true in transaction options.
148
+ Status NewTxn(WriteOptions& write_opts, ThreadState* thread,
149
+ std::unique_ptr<Transaction>* out_txn,
150
+ bool* commit_bypass_memtable = nullptr);
143
151
  Status CommitTxn(Transaction& txn, ThreadState* thread = nullptr);
144
152
 
145
153
  // Creates a transaction, executes `ops`, and tries to commit
154
+ // @param commit_bypass_memtable Whether commit_bypass_memtable is set to
155
+ // true in transaction options.
146
156
  Status ExecuteTransaction(WriteOptions& write_opts, ThreadState* thread,
147
- std::function<Status(Transaction&)>&& ops);
157
+ std::function<Status(Transaction&)>&& ops,
158
+ bool* commit_bypass_memtable = nullptr);
148
159
 
149
160
  virtual void MaybeClearOneColumnFamily(ThreadState* /* thread */) {}
150
161