@nxtedition/rocksdb 7.1.14 → 7.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -10,7 +10,6 @@
10
10
 
11
11
  #include "util/compression.h"
12
12
  #ifdef GFLAGS
13
- #include "cache/clock_cache.h"
14
13
  #include "cache/fast_lru_cache.h"
15
14
  #include "db_stress_tool/db_stress_common.h"
16
15
  #include "db_stress_tool/db_stress_compaction_filter.h"
@@ -115,14 +114,13 @@ std::shared_ptr<Cache> StressTest::NewCache(size_t capacity,
115
114
  }
116
115
 
117
116
  if (FLAGS_cache_type == "clock_cache") {
118
- auto cache = ExperimentalNewClockCache(
119
- static_cast<size_t>(capacity), FLAGS_block_size, num_shard_bits,
120
- false /*strict_capacity_limit*/, kDefaultCacheMetadataChargePolicy);
121
- if (!cache) {
122
- fprintf(stderr, "Clock cache not supported.");
123
- exit(1);
124
- }
125
- return cache;
117
+ fprintf(stderr, "Old clock cache implementation has been removed.\n");
118
+ exit(1);
119
+ } else if (FLAGS_cache_type == "hyper_clock_cache") {
120
+ return HyperClockCacheOptions(static_cast<size_t>(capacity),
121
+ FLAGS_block_size /*estimated_entry_charge*/,
122
+ num_shard_bits)
123
+ .MakeSharedCache();
126
124
  } else if (FLAGS_cache_type == "fast_lru_cache") {
127
125
  return NewFastLRUCache(static_cast<size_t>(capacity), FLAGS_block_size,
128
126
  num_shard_bits, false /*strict_capacity_limit*/,
@@ -411,6 +409,19 @@ void StressTest::VerificationAbort(SharedState* shared, std::string msg, int cf,
411
409
  shared->SetVerificationFailure();
412
410
  }
413
411
 
412
+ void StressTest::VerificationAbort(SharedState* shared, std::string msg, int cf,
413
+ int64_t key, Slice value_from_db,
414
+ Slice value_from_expected) const {
415
+ auto key_str = Key(key);
416
+ fprintf(stderr,
417
+ "Verification failed for column family %d key %s (%" PRIi64
418
+ "): value_from_db: %s, value_from_expected: %s, msg: %s\n",
419
+ cf, Slice(key_str).ToString(true).c_str(), key,
420
+ value_from_db.ToString(true).c_str(),
421
+ value_from_expected.ToString(true).c_str(), msg.c_str());
422
+ shared->SetVerificationFailure();
423
+ }
424
+
414
425
  void StressTest::PrintStatistics() {
415
426
  if (dbstats) {
416
427
  fprintf(stdout, "STATISTICS:\n%s\n", dbstats->ToString().c_str());
@@ -622,6 +633,7 @@ void StressTest::OperateDb(ThreadState* thread) {
622
633
  FLAGS_rate_limit_user_ops ? Env::IO_USER : Env::IO_TOTAL;
623
634
  read_opts.async_io = FLAGS_async_io;
624
635
  read_opts.adaptive_readahead = FLAGS_adaptive_readahead;
636
+ read_opts.readahead_size = FLAGS_readahead_size;
625
637
  WriteOptions write_opts;
626
638
  if (FLAGS_rate_limit_auto_wal_flush) {
627
639
  write_opts.rate_limiter_priority = Env::IO_USER;
@@ -734,11 +746,6 @@ void StressTest::OperateDb(ThreadState* thread) {
734
746
  int64_t rand_key = GenerateOneKey(thread, i);
735
747
  std::string keystr = Key(rand_key);
736
748
  Slice key = keystr;
737
- std::unique_ptr<MutexLock> lock;
738
- if (ShouldAcquireMutexOnKey()) {
739
- lock.reset(new MutexLock(
740
- shared->GetMutexForKey(rand_column_family, rand_key)));
741
- }
742
749
 
743
750
  if (thread->rand.OneInOpt(FLAGS_compact_range_one_in)) {
744
751
  TestCompactRange(thread, rand_key, key, column_family);
@@ -811,7 +818,7 @@ void StressTest::OperateDb(ThreadState* thread) {
811
818
  std::vector<int64_t> rand_keys = GenerateKeys(rand_key);
812
819
 
813
820
  if (thread->rand.OneInOpt(FLAGS_ingest_external_file_one_in)) {
814
- TestIngestExternalFile(thread, rand_column_families, rand_keys, lock);
821
+ TestIngestExternalFile(thread, rand_column_families, rand_keys);
815
822
  }
816
823
 
817
824
  if (thread->rand.OneInOpt(FLAGS_backup_one_in)) {
@@ -867,7 +874,7 @@ void StressTest::OperateDb(ThreadState* thread) {
867
874
  std::string write_ts_str;
868
875
  Slice read_ts;
869
876
  Slice write_ts;
870
- if (ShouldAcquireMutexOnKey() && FLAGS_user_timestamp_size > 0) {
877
+ if (FLAGS_user_timestamp_size > 0) {
871
878
  read_ts_str = GetNowNanos();
872
879
  read_ts = read_ts_str;
873
880
  read_opts.timestamp = &read_ts;
@@ -909,25 +916,31 @@ void StressTest::OperateDb(ThreadState* thread) {
909
916
  assert(prefix_bound <= prob_op);
910
917
  // OPERATION write
911
918
  TestPut(thread, write_opts, read_opts, rand_column_families, rand_keys,
912
- value, lock);
919
+ value);
913
920
  } else if (prob_op < del_bound) {
914
921
  assert(write_bound <= prob_op);
915
922
  // OPERATION delete
916
- TestDelete(thread, write_opts, rand_column_families, rand_keys, lock);
923
+ TestDelete(thread, write_opts, rand_column_families, rand_keys);
917
924
  } else if (prob_op < delrange_bound) {
918
925
  assert(del_bound <= prob_op);
919
926
  // OPERATION delete range
920
- TestDeleteRange(thread, write_opts, rand_column_families, rand_keys,
921
- lock);
927
+ TestDeleteRange(thread, write_opts, rand_column_families, rand_keys);
922
928
  } else if (prob_op < iterate_bound) {
923
929
  assert(delrange_bound <= prob_op);
924
930
  // OPERATION iterate
925
- int num_seeks = static_cast<int>(
926
- std::min(static_cast<uint64_t>(thread->rand.Uniform(4)),
927
- FLAGS_ops_per_thread - i - 1));
928
- rand_keys = GenerateNKeys(thread, num_seeks, i);
929
- i += num_seeks - 1;
930
- TestIterate(thread, read_opts, rand_column_families, rand_keys);
931
+ if (!FLAGS_skip_verifydb &&
932
+ thread->rand.OneInOpt(
933
+ FLAGS_verify_iterator_with_expected_state_one_in)) {
934
+ TestIterateAgainstExpected(thread, read_opts, rand_column_families,
935
+ rand_keys);
936
+ } else {
937
+ int num_seeks = static_cast<int>(
938
+ std::min(static_cast<uint64_t>(thread->rand.Uniform(4)),
939
+ FLAGS_ops_per_thread - i - 1));
940
+ rand_keys = GenerateNKeys(thread, num_seeks, i);
941
+ i += num_seeks - 1;
942
+ TestIterate(thread, read_opts, rand_column_families, rand_keys);
943
+ }
931
944
  } else {
932
945
  assert(iterate_bound <= prob_op);
933
946
  TestCustomOperations(thread, rand_column_families);
@@ -1402,6 +1415,15 @@ void StressTest::TestCompactFiles(ThreadState* /* thread */,
1402
1415
  Status StressTest::TestBackupRestore(
1403
1416
  ThreadState* thread, const std::vector<int>& rand_column_families,
1404
1417
  const std::vector<int64_t>& rand_keys) {
1418
+ std::vector<std::unique_ptr<MutexLock>> locks;
1419
+ if (ShouldAcquireMutexOnKey()) {
1420
+ for (int rand_column_family : rand_column_families) {
1421
+ // `rand_keys[0]` on each chosen CF will be verified.
1422
+ locks.emplace_back(new MutexLock(
1423
+ thread->shared->GetMutexForKey(rand_column_family, rand_keys[0])));
1424
+ }
1425
+ }
1426
+
1405
1427
  const std::string backup_dir =
1406
1428
  FLAGS_db + "/.backup" + std::to_string(thread->tid);
1407
1429
  const std::string restore_dir =
@@ -1703,6 +1725,15 @@ Status StressTest::TestApproximateSize(
1703
1725
  Status StressTest::TestCheckpoint(ThreadState* thread,
1704
1726
  const std::vector<int>& rand_column_families,
1705
1727
  const std::vector<int64_t>& rand_keys) {
1728
+ std::vector<std::unique_ptr<MutexLock>> locks;
1729
+ if (ShouldAcquireMutexOnKey()) {
1730
+ for (int rand_column_family : rand_column_families) {
1731
+ // `rand_keys[0]` on each chosen CF will be verified.
1732
+ locks.emplace_back(new MutexLock(
1733
+ thread->shared->GetMutexForKey(rand_column_family, rand_keys[0])));
1734
+ }
1735
+ }
1736
+
1706
1737
  std::string checkpoint_dir =
1707
1738
  FLAGS_db + "/.checkpoint" + std::to_string(thread->tid);
1708
1739
  Options tmp_opts(options_);
@@ -2395,14 +2426,16 @@ void StressTest::Open(SharedState* shared) {
2395
2426
 
2396
2427
  if (FLAGS_use_blob_cache) {
2397
2428
  fprintf(stdout,
2398
- "Integrated BlobDB: blob cache enabled, block and blob caches "
2399
- "shared: %d, blob cache size %" PRIu64
2400
- ", blob cache num shard bits: %d, blob cache prepopulated: %s\n",
2401
- FLAGS_use_shared_block_and_blob_cache, FLAGS_blob_cache_size,
2402
- FLAGS_blob_cache_numshardbits,
2403
- options_.prepopulate_blob_cache == PrepopulateBlobCache::kFlushOnly
2404
- ? "flush only"
2405
- : "disable");
2429
+ "Integrated BlobDB: blob cache enabled"
2430
+ ", block and blob caches shared: %d",
2431
+ FLAGS_use_shared_block_and_blob_cache);
2432
+ if (!FLAGS_use_shared_block_and_blob_cache) {
2433
+ fprintf(stdout,
2434
+ ", blob cache size %" PRIu64 ", blob cache num shard bits: %d",
2435
+ FLAGS_blob_cache_size, FLAGS_blob_cache_numshardbits);
2436
+ }
2437
+ fprintf(stdout, ", blob cache prepopulated: %d\n",
2438
+ FLAGS_prepopulate_blob_cache);
2406
2439
  } else {
2407
2440
  fprintf(stdout, "Integrated BlobDB: blob cache disabled\n");
2408
2441
  }
@@ -2635,6 +2668,10 @@ void StressTest::Open(SharedState* shared) {
2635
2668
  assert(trans.size() == 0);
2636
2669
  #endif
2637
2670
  }
2671
+ if (!s.ok()) {
2672
+ fprintf(stderr, "Error in opening the DB [%s]\n", s.ToString().c_str());
2673
+ fflush(stderr);
2674
+ }
2638
2675
  assert(s.ok());
2639
2676
  assert(column_families_.size() ==
2640
2677
  static_cast<size_t>(FLAGS_column_families));
@@ -2668,6 +2705,21 @@ void StressTest::Open(SharedState* shared) {
2668
2705
  exit(1);
2669
2706
  #endif
2670
2707
  }
2708
+
2709
+ if (FLAGS_preserve_unverified_changes) {
2710
+ // Up until now, no live file should have become obsolete due to these
2711
+ // options. After `DisableFileDeletions()` we can reenable auto compactions
2712
+ // since, even if live files become obsolete, they won't be deleted.
2713
+ assert(options_.avoid_flush_during_recovery);
2714
+ assert(options_.disable_auto_compactions);
2715
+ if (s.ok()) {
2716
+ s = db_->DisableFileDeletions();
2717
+ }
2718
+ if (s.ok()) {
2719
+ s = db_->EnableAutoCompaction(column_families_);
2720
+ }
2721
+ }
2722
+
2671
2723
  if (!s.ok()) {
2672
2724
  fprintf(stderr, "open error: %s\n", s.ToString().c_str());
2673
2725
  exit(1);
@@ -2924,6 +2976,11 @@ void InitializeOptionsFromFlags(
2924
2976
  block_based_options.prepopulate_block_cache =
2925
2977
  static_cast<BlockBasedTableOptions::PrepopulateBlockCache>(
2926
2978
  FLAGS_prepopulate_block_cache);
2979
+ block_based_options.initial_auto_readahead_size =
2980
+ FLAGS_initial_auto_readahead_size;
2981
+ block_based_options.max_auto_readahead_size = FLAGS_max_auto_readahead_size;
2982
+ block_based_options.num_file_reads_for_auto_readahead =
2983
+ FLAGS_num_file_reads_for_auto_readahead;
2927
2984
  options.table_factory.reset(NewBlockBasedTableFactory(block_based_options));
2928
2985
  options.db_write_buffer_size = FLAGS_db_write_buffer_size;
2929
2986
  options.write_buffer_size = FLAGS_write_buffer_size;
@@ -3177,6 +3234,20 @@ void InitializeOptionsGeneral(
3177
3234
  }
3178
3235
  }
3179
3236
 
3237
+ if (FLAGS_preserve_unverified_changes) {
3238
+ if (!options.avoid_flush_during_recovery) {
3239
+ fprintf(stderr,
3240
+ "WARNING: flipping `avoid_flush_during_recovery` to true for "
3241
+ "`preserve_unverified_changes` to keep all files\n");
3242
+ options.avoid_flush_during_recovery = true;
3243
+ }
3244
+ // Together with `avoid_flush_during_recovery == true`, this will prevent
3245
+ // live files from becoming obsolete and deleted between `DB::Open()` and
3246
+ // `DisableFileDeletions()` due to flush or compaction. We do not need to
3247
+ // warn the user since we will reenable compaction soon.
3248
+ options.disable_auto_compactions = true;
3249
+ }
3250
+
3180
3251
  options.table_properties_collector_factories.emplace_back(
3181
3252
  std::make_shared<DbStressTablePropertiesCollectorFactory>());
3182
3253
  }
@@ -94,23 +94,20 @@ class StressTest {
94
94
  virtual Status TestPut(ThreadState* thread, WriteOptions& write_opts,
95
95
  const ReadOptions& read_opts,
96
96
  const std::vector<int>& cf_ids,
97
- const std::vector<int64_t>& keys, char (&value)[100],
98
- std::unique_ptr<MutexLock>& lock) = 0;
97
+ const std::vector<int64_t>& keys,
98
+ char (&value)[100]) = 0;
99
99
 
100
100
  virtual Status TestDelete(ThreadState* thread, WriteOptions& write_opts,
101
101
  const std::vector<int>& rand_column_families,
102
- const std::vector<int64_t>& rand_keys,
103
- std::unique_ptr<MutexLock>& lock) = 0;
102
+ const std::vector<int64_t>& rand_keys) = 0;
104
103
 
105
104
  virtual Status TestDeleteRange(ThreadState* thread, WriteOptions& write_opts,
106
105
  const std::vector<int>& rand_column_families,
107
- const std::vector<int64_t>& rand_keys,
108
- std::unique_ptr<MutexLock>& lock) = 0;
106
+ const std::vector<int64_t>& rand_keys) = 0;
109
107
 
110
108
  virtual void TestIngestExternalFile(
111
109
  ThreadState* thread, const std::vector<int>& rand_column_families,
112
- const std::vector<int64_t>& rand_keys,
113
- std::unique_ptr<MutexLock>& lock) = 0;
110
+ const std::vector<int64_t>& rand_keys) = 0;
114
111
 
115
112
  // Issue compact range, starting with start_key, whose integer value
116
113
  // is rand_key.
@@ -152,6 +149,13 @@ class StressTest {
152
149
  const std::vector<int>& rand_column_families,
153
150
  const std::vector<int64_t>& rand_keys);
154
151
 
152
+ virtual Status TestIterateAgainstExpected(
153
+ ThreadState* /* thread */, const ReadOptions& /* read_opts */,
154
+ const std::vector<int>& /* rand_column_families */,
155
+ const std::vector<int64_t>& /* rand_keys */) {
156
+ return Status::NotSupported();
157
+ }
158
+
155
159
  // Enum used by VerifyIterator() to identify the mode to validate.
156
160
  enum LastIterateOp {
157
161
  kLastOpSeek,
@@ -214,6 +218,10 @@ class StressTest {
214
218
  void VerificationAbort(SharedState* shared, std::string msg, int cf,
215
219
  int64_t key) const;
216
220
 
221
+ void VerificationAbort(SharedState* shared, std::string msg, int cf,
222
+ int64_t key, Slice value_from_db,
223
+ Slice value_from_expected) const;
224
+
217
225
  void PrintEnv() const;
218
226
 
219
227
  void Open(SharedState* shared);
@@ -280,6 +280,12 @@ int db_stress_tool(int argc, char** argv) {
280
280
  }
281
281
  }
282
282
 
283
+ if (FLAGS_preserve_unverified_changes && FLAGS_reopen != 0) {
284
+ fprintf(stderr,
285
+ "Reopen DB is incompatible with preserving unverified changes\n");
286
+ exit(1);
287
+ }
288
+
283
289
  #ifndef NDEBUG
284
290
  KillPoint* kp = KillPoint::GetInstance();
285
291
  kp->rocksdb_kill_odds = FLAGS_kill_random_test;
@@ -416,8 +416,7 @@ Status MultiOpsTxnsStressTest::TestPut(ThreadState* /*thread*/,
416
416
  const ReadOptions& /*read_opts*/,
417
417
  const std::vector<int>& /*cf_ids*/,
418
418
  const std::vector<int64_t>& /*keys*/,
419
- char (&value)[100],
420
- std::unique_ptr<MutexLock>& /*lock*/) {
419
+ char (&value)[100]) {
421
420
  (void)value;
422
421
  return Status::NotSupported();
423
422
  }
@@ -426,8 +425,7 @@ Status MultiOpsTxnsStressTest::TestPut(ThreadState* /*thread*/,
426
425
  Status MultiOpsTxnsStressTest::TestDelete(
427
426
  ThreadState* /*thread*/, WriteOptions& /*write_opts*/,
428
427
  const std::vector<int>& /*rand_column_families*/,
429
- const std::vector<int64_t>& /*rand_keys*/,
430
- std::unique_ptr<MutexLock>& /*lock*/) {
428
+ const std::vector<int64_t>& /*rand_keys*/) {
431
429
  return Status::NotSupported();
432
430
  }
433
431
 
@@ -435,15 +433,13 @@ Status MultiOpsTxnsStressTest::TestDelete(
435
433
  Status MultiOpsTxnsStressTest::TestDeleteRange(
436
434
  ThreadState* /*thread*/, WriteOptions& /*write_opts*/,
437
435
  const std::vector<int>& /*rand_column_families*/,
438
- const std::vector<int64_t>& /*rand_keys*/,
439
- std::unique_ptr<MutexLock>& /*lock*/) {
436
+ const std::vector<int64_t>& /*rand_keys*/) {
440
437
  return Status::NotSupported();
441
438
  }
442
439
 
443
440
  void MultiOpsTxnsStressTest::TestIngestExternalFile(
444
441
  ThreadState* thread, const std::vector<int>& rand_column_families,
445
- const std::vector<int64_t>& /*rand_keys*/,
446
- std::unique_ptr<MutexLock>& /*lock*/) {
442
+ const std::vector<int64_t>& /*rand_keys*/) {
447
443
  // TODO (yanqin)
448
444
  (void)thread;
449
445
  (void)rand_column_families;
@@ -222,23 +222,19 @@ class MultiOpsTxnsStressTest : public StressTest {
222
222
 
223
223
  Status TestPut(ThreadState* thread, WriteOptions& write_opts,
224
224
  const ReadOptions& read_opts, const std::vector<int>& cf_ids,
225
- const std::vector<int64_t>& keys, char (&value)[100],
226
- std::unique_ptr<MutexLock>& lock) override;
225
+ const std::vector<int64_t>& keys, char (&value)[100]) override;
227
226
 
228
227
  Status TestDelete(ThreadState* thread, WriteOptions& write_opts,
229
228
  const std::vector<int>& rand_column_families,
230
- const std::vector<int64_t>& rand_keys,
231
- std::unique_ptr<MutexLock>& lock) override;
229
+ const std::vector<int64_t>& rand_keys) override;
232
230
 
233
231
  Status TestDeleteRange(ThreadState* thread, WriteOptions& write_opts,
234
232
  const std::vector<int>& rand_column_families,
235
- const std::vector<int64_t>& rand_keys,
236
- std::unique_ptr<MutexLock>& lock) override;
233
+ const std::vector<int64_t>& rand_keys) override;
237
234
 
238
235
  void TestIngestExternalFile(ThreadState* thread,
239
236
  const std::vector<int>& rand_column_families,
240
- const std::vector<int64_t>& rand_keys,
241
- std::unique_ptr<MutexLock>& lock) override;
237
+ const std::vector<int64_t>& rand_keys) override;
242
238
 
243
239
  void TestCompactRange(ThreadState* thread, int64_t rand_key,
244
240
  const Slice& start_key,