@nxtedition/rocksdb 7.0.0-alpha.6 → 7.0.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 (207) hide show
  1. package/binding.cc +37 -36
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
  3. package/deps/rocksdb/rocksdb/Makefile +8 -1
  4. package/deps/rocksdb/rocksdb/TARGETS +14 -0
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +50 -2
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -3
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +111 -33
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +71 -31
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +31 -30
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +21 -8
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +35 -38
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +22 -9
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +48 -0
  14. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +78 -0
  15. package/deps/rocksdb/rocksdb/db/builder.cc +7 -5
  16. package/deps/rocksdb/rocksdb/db/c.cc +777 -108
  17. package/deps/rocksdb/rocksdb/db/c_test.c +290 -30
  18. package/deps/rocksdb/rocksdb/db/column_family.cc +13 -0
  19. package/deps/rocksdb/rocksdb/db/column_family_test.cc +24 -36
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +18 -4
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -6
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -9
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +38 -40
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +4 -4
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +14 -17
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -5
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +253 -24
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +9 -3
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +3 -2
  30. package/deps/rocksdb/rocksdb/db/corruption_test.cc +67 -10
  31. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +83 -7
  32. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -2
  33. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +68 -0
  34. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +40 -1
  35. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +94 -23
  36. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +17 -4
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +263 -58
  38. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +186 -23
  39. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -14
  40. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +24 -28
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +116 -83
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +13 -5
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +71 -34
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -3
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +72 -33
  46. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +629 -0
  47. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +438 -10
  48. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +43 -2
  49. package/deps/rocksdb/rocksdb/db/db_test.cc +41 -1
  50. package/deps/rocksdb/rocksdb/db/db_test2.cc +41 -12
  51. package/deps/rocksdb/rocksdb/db/db_test_util.h +1 -0
  52. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +90 -0
  53. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +109 -16
  54. package/deps/rocksdb/rocksdb/db/dbformat.h +1 -1
  55. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +54 -0
  56. package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -3
  57. package/deps/rocksdb/rocksdb/db/log_reader.cc +22 -4
  58. package/deps/rocksdb/rocksdb/db/log_reader.h +4 -0
  59. package/deps/rocksdb/rocksdb/db/memtable.cc +4 -0
  60. package/deps/rocksdb/rocksdb/db/post_memtable_callback.h +25 -0
  61. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  62. package/deps/rocksdb/rocksdb/db/repair_test.cc +3 -2
  63. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +65 -2
  64. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -2
  65. package/deps/rocksdb/rocksdb/db/version_set.cc +52 -0
  66. package/deps/rocksdb/rocksdb/db/version_set.h +57 -43
  67. package/deps/rocksdb/rocksdb/db/wal_manager.cc +14 -4
  68. package/deps/rocksdb/rocksdb/db/wal_manager.h +16 -0
  69. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +141 -0
  70. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +55 -0
  71. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +292 -0
  72. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -1
  73. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +42 -19
  75. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +28 -0
  76. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +6 -2
  77. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +11 -5
  78. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -12
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +74 -167
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -9
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -9
  82. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +117 -10
  83. package/deps/rocksdb/rocksdb/env/composite_env.cc +7 -0
  84. package/deps/rocksdb/rocksdb/env/env.cc +4 -0
  85. package/deps/rocksdb/rocksdb/env/env_posix.cc +3 -3
  86. package/deps/rocksdb/rocksdb/env/env_test.cc +5 -5
  87. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +45 -0
  88. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +14 -0
  89. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1 -1
  90. package/deps/rocksdb/rocksdb/env/io_posix.cc +50 -24
  91. package/deps/rocksdb/rocksdb/env/io_posix.h +9 -7
  92. package/deps/rocksdb/rocksdb/env/mock_env.cc +9 -3
  93. package/deps/rocksdb/rocksdb/file/file_util.cc +4 -1
  94. package/deps/rocksdb/rocksdb/file/filename.cc +14 -0
  95. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +9 -4
  96. package/deps/rocksdb/rocksdb/file/line_file_reader.h +3 -2
  97. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +157 -0
  98. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -1
  99. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +68 -32
  100. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +20 -6
  101. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +10 -6
  102. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +4 -2
  103. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +16 -0
  104. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +231 -2
  105. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -2
  106. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +3 -0
  107. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +13 -1
  108. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +4 -20
  109. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +1 -1
  110. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +31 -0
  111. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +2 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +4 -20
  113. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +2 -2
  114. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  115. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +34 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +36 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +74 -0
  119. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +36 -3
  120. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +16 -3
  121. package/deps/rocksdb/rocksdb/logging/env_logger.h +3 -3
  122. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -2
  123. package/deps/rocksdb/rocksdb/logging/log_buffer.h +1 -1
  124. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -3
  125. package/deps/rocksdb/rocksdb/memory/arena.cc +0 -1
  126. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +61 -73
  127. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +6 -5
  128. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +6 -0
  129. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +7 -3
  130. package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -0
  131. package/deps/rocksdb/rocksdb/options/cf_options.h +3 -0
  132. package/deps/rocksdb/rocksdb/options/options.cc +4 -1
  133. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  134. package/deps/rocksdb/rocksdb/options/options_parser.cc +1 -1
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
  136. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -0
  137. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -2
  138. package/deps/rocksdb/rocksdb/port/sys_time.h +27 -11
  139. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -1
  140. package/deps/rocksdb/rocksdb/port/win/io_win.cc +16 -0
  141. package/deps/rocksdb/rocksdb/port/win/io_win.h +11 -2
  142. package/deps/rocksdb/rocksdb/port/win/port_win.cc +1 -1
  143. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -16
  144. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +2 -2
  145. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +2 -2
  146. package/deps/rocksdb/rocksdb/rocksdb.pc.in +4 -5
  147. package/deps/rocksdb/rocksdb/src.mk +3 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +7 -5
  149. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +39 -43
  150. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +2 -4
  151. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +42 -34
  152. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -7
  153. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +2 -2
  154. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +2 -2
  155. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +7 -13
  156. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +9 -5
  157. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +5 -2
  158. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +4 -4
  159. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +6 -2
  160. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +8 -5
  161. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -2
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -14
  163. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +2 -0
  164. package/deps/rocksdb/rocksdb/table/format.h +1 -3
  165. package/deps/rocksdb/rocksdb/table/get_context.cc +5 -0
  166. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -0
  167. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +3 -4
  168. package/deps/rocksdb/rocksdb/table/table_test.cc +1 -1
  169. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +102 -6
  170. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +19 -2
  172. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +2 -1
  173. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2 -1
  174. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +2 -4
  175. package/deps/rocksdb/rocksdb/util/autovector.h +11 -1
  176. package/deps/rocksdb/rocksdb/util/cleanable.cc +1 -0
  177. package/deps/rocksdb/rocksdb/util/compression.h +5 -7
  178. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +14 -8
  179. package/deps/rocksdb/rocksdb/util/string_util.cc +1 -1
  180. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +33 -63
  181. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -1
  182. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -2
  183. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +14 -0
  184. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +7 -1
  185. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +7 -0
  186. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  187. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +8 -0
  188. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  189. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +6 -4
  190. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -3
  191. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +34 -21
  192. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +31 -7
  193. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +1 -0
  194. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +63 -0
  195. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +40 -0
  196. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +426 -0
  197. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +37 -0
  198. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +6 -0
  199. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +16 -18
  200. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +18 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +61 -0
  202. package/deps/rocksdb/rocksdb.gyp +1 -0
  203. package/index.js +5 -2
  204. package/package.json +1 -1
  205. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  206. package/prebuilds/darwin-x64/node.napi.node +0 -0
  207. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -69,12 +69,138 @@ void VerifyInitializationOfCompactionJobStats(
69
69
  #endif // !defined(IOS_CROSS_COMPILE)
70
70
  }
71
71
 
72
+ // Mock FSWritableFile for testing io priority.
73
+ // Only override the essential functions for testing compaction io priority.
74
+ class MockTestWritableFile : public FSWritableFileOwnerWrapper {
75
+ public:
76
+ MockTestWritableFile(std::unique_ptr<FSWritableFile>&& file,
77
+ Env::IOPriority io_priority)
78
+ : FSWritableFileOwnerWrapper(std::move(file)),
79
+ write_io_priority_(io_priority) {}
80
+ IOStatus Append(const Slice& data, const IOOptions& options,
81
+ IODebugContext* dbg) override {
82
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
83
+ return target()->Append(data, options, dbg);
84
+ }
85
+ IOStatus Append(const Slice& data, const IOOptions& options,
86
+ const DataVerificationInfo& verification_info,
87
+ IODebugContext* dbg) override {
88
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
89
+ return target()->Append(data, options, verification_info, dbg);
90
+ }
91
+ IOStatus Close(const IOOptions& options, IODebugContext* dbg) override {
92
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
93
+ return target()->Close(options, dbg);
94
+ }
95
+ IOStatus Flush(const IOOptions& options, IODebugContext* dbg) override {
96
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
97
+ return target()->Flush(options, dbg);
98
+ }
99
+ IOStatus Sync(const IOOptions& options, IODebugContext* dbg) override {
100
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
101
+ return target()->Sync(options, dbg);
102
+ }
103
+ IOStatus Fsync(const IOOptions& options, IODebugContext* dbg) override {
104
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
105
+ return target()->Fsync(options, dbg);
106
+ }
107
+ uint64_t GetFileSize(const IOOptions& options, IODebugContext* dbg) override {
108
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
109
+ return target()->GetFileSize(options, dbg);
110
+ }
111
+ IOStatus RangeSync(uint64_t offset, uint64_t nbytes, const IOOptions& options,
112
+ IODebugContext* dbg) override {
113
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
114
+ return target()->RangeSync(offset, nbytes, options, dbg);
115
+ }
116
+
117
+ void PrepareWrite(size_t offset, size_t len, const IOOptions& options,
118
+ IODebugContext* dbg) override {
119
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
120
+ target()->PrepareWrite(offset, len, options, dbg);
121
+ }
122
+
123
+ IOStatus Allocate(uint64_t offset, uint64_t len, const IOOptions& options,
124
+ IODebugContext* dbg) override {
125
+ EXPECT_EQ(options.rate_limiter_priority, write_io_priority_);
126
+ return target()->Allocate(offset, len, options, dbg);
127
+ }
128
+
129
+ private:
130
+ Env::IOPriority write_io_priority_;
131
+ };
132
+
133
+ // Mock FSRandomAccessFile for testing io priority.
134
+ // Only override the essential functions for testing compaction io priority.
135
+ class MockTestRandomAccessFile : public FSRandomAccessFileOwnerWrapper {
136
+ public:
137
+ MockTestRandomAccessFile(std::unique_ptr<FSRandomAccessFile>&& file,
138
+ Env::IOPriority io_priority)
139
+ : FSRandomAccessFileOwnerWrapper(std::move(file)),
140
+ read_io_priority_(io_priority) {}
141
+
142
+ IOStatus Read(uint64_t offset, size_t n, const IOOptions& options,
143
+ Slice* result, char* scratch,
144
+ IODebugContext* dbg) const override {
145
+ EXPECT_EQ(options.rate_limiter_priority, read_io_priority_);
146
+ return target()->Read(offset, n, options, result, scratch, dbg);
147
+ }
148
+ IOStatus Prefetch(uint64_t offset, size_t n, const IOOptions& options,
149
+ IODebugContext* dbg) override {
150
+ EXPECT_EQ(options.rate_limiter_priority, read_io_priority_);
151
+ return target()->Prefetch(offset, n, options, dbg);
152
+ }
153
+
154
+ private:
155
+ Env::IOPriority read_io_priority_;
156
+ };
157
+
158
+ // Mock FileSystem for testing io priority.
159
+ class MockTestFileSystem : public FileSystemWrapper {
160
+ public:
161
+ explicit MockTestFileSystem(const std::shared_ptr<FileSystem>& base,
162
+ Env::IOPriority read_io_priority,
163
+ Env::IOPriority write_io_priority)
164
+ : FileSystemWrapper(base),
165
+ read_io_priority_(read_io_priority),
166
+ write_io_priority_(write_io_priority) {}
167
+
168
+ static const char* kClassName() { return "MockTestFileSystem"; }
169
+ const char* Name() const override { return kClassName(); }
170
+
171
+ IOStatus NewRandomAccessFile(const std::string& fname,
172
+ const FileOptions& file_opts,
173
+ std::unique_ptr<FSRandomAccessFile>* result,
174
+ IODebugContext* dbg) override {
175
+ IOStatus s = target()->NewRandomAccessFile(fname, file_opts, result, dbg);
176
+ EXPECT_OK(s);
177
+ result->reset(
178
+ new MockTestRandomAccessFile(std::move(*result), read_io_priority_));
179
+ return s;
180
+ }
181
+ IOStatus NewWritableFile(const std::string& fname,
182
+ const FileOptions& file_opts,
183
+ std::unique_ptr<FSWritableFile>* result,
184
+ IODebugContext* dbg) override {
185
+ IOStatus s = target()->NewWritableFile(fname, file_opts, result, dbg);
186
+ EXPECT_OK(s);
187
+ result->reset(
188
+ new MockTestWritableFile(std::move(*result), write_io_priority_));
189
+ return s;
190
+ }
191
+
192
+ private:
193
+ Env::IOPriority read_io_priority_;
194
+ Env::IOPriority write_io_priority_;
195
+ };
196
+
72
197
  } // namespace
73
198
 
74
199
  class CompactionJobTestBase : public testing::Test {
75
200
  protected:
76
201
  CompactionJobTestBase(std::string dbname, const Comparator* ucmp,
77
- std::function<std::string(uint64_t)> encode_u64_ts)
202
+ std::function<std::string(uint64_t)> encode_u64_ts,
203
+ bool test_io_priority)
78
204
  : dbname_(std::move(dbname)),
79
205
  ucmp_(ucmp),
80
206
  db_options_(),
@@ -90,7 +216,8 @@ class CompactionJobTestBase : public testing::Test {
90
216
  shutting_down_(false),
91
217
  mock_table_factory_(new mock::MockTableFactory()),
92
218
  error_handler_(nullptr, db_options_, &mutex_),
93
- encode_u64_ts_(std::move(encode_u64_ts)) {
219
+ encode_u64_ts_(std::move(encode_u64_ts)),
220
+ test_io_priority_(test_io_priority) {
94
221
  Env* base_env = Env::Default();
95
222
  EXPECT_OK(
96
223
  test::CreateEnvFromSystem(ConfigOptions(), &base_env, &env_guard_));
@@ -105,7 +232,12 @@ class CompactionJobTestBase : public testing::Test {
105
232
  db_options_.db_paths.emplace_back(dbname_,
106
233
  std::numeric_limits<uint64_t>::max());
107
234
  cf_options_.comparator = ucmp_;
108
- cf_options_.table_factory = mock_table_factory_;
235
+ if (test_io_priority_) {
236
+ BlockBasedTableOptions table_options;
237
+ cf_options_.table_factory.reset(NewBlockBasedTableFactory(table_options));
238
+ } else {
239
+ cf_options_.table_factory = mock_table_factory_;
240
+ }
109
241
  }
110
242
 
111
243
  std::string GenerateFileName(uint64_t file_number) {
@@ -145,6 +277,33 @@ class CompactionJobTestBase : public testing::Test {
145
277
  return blob_index;
146
278
  }
147
279
 
280
+ // Creates a table with the specificied key value pairs.
281
+ void CreateTable(const std::string& table_name,
282
+ const mock::KVVector& contents, uint64_t& file_size) {
283
+ std::unique_ptr<WritableFileWriter> file_writer;
284
+ Status s = WritableFileWriter::Create(fs_, table_name, FileOptions(),
285
+ &file_writer, nullptr);
286
+ ASSERT_OK(s);
287
+ std::unique_ptr<TableBuilder> table_builder(
288
+ cf_options_.table_factory->NewTableBuilder(
289
+ TableBuilderOptions(*cfd_->ioptions(), mutable_cf_options_,
290
+ cfd_->internal_comparator(),
291
+ cfd_->int_tbl_prop_collector_factories(),
292
+ CompressionType::kNoCompression,
293
+ CompressionOptions(), 0 /* column_family_id */,
294
+ kDefaultColumnFamilyName, -1 /* level */),
295
+ file_writer.get()));
296
+ // Build table.
297
+ for (auto kv : contents) {
298
+ std::string key;
299
+ std::string value;
300
+ std::tie(key, value) = kv;
301
+ table_builder->Add(key, value);
302
+ }
303
+ ASSERT_OK(table_builder->Finish());
304
+ file_size = table_builder->FileSize();
305
+ }
306
+
148
307
  void AddMockFile(const mock::KVVector& contents, int level = 0) {
149
308
  assert(contents.size() > 0);
150
309
 
@@ -198,11 +357,18 @@ class CompactionJobTestBase : public testing::Test {
198
357
  }
199
358
 
200
359
  uint64_t file_number = versions_->NewFileNumber();
201
- EXPECT_OK(mock_table_factory_->CreateMockTable(
202
- env_, GenerateFileName(file_number), std::move(contents)));
360
+
361
+ uint64_t file_size;
362
+ if (test_io_priority_) {
363
+ CreateTable(GenerateFileName(file_number), contents, file_size);
364
+ } else {
365
+ file_size = 10;
366
+ EXPECT_OK(mock_table_factory_->CreateMockTable(
367
+ env_, GenerateFileName(file_number), std::move(contents)));
368
+ }
203
369
 
204
370
  VersionEdit edit;
205
- edit.AddFile(level, file_number, 0, 10, smallest_key, largest_key,
371
+ edit.AddFile(level, file_number, 0, file_size, smallest_key, largest_key,
206
372
  smallest_seqno, largest_seqno, false, Temperature::kUnknown,
207
373
  oldest_blob_file_number, kUnknownOldestAncesterTime,
208
374
  kUnknownFileCreationTime, kUnknownFileChecksum,
@@ -323,7 +489,15 @@ class CompactionJobTestBase : public testing::Test {
323
489
  SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber,
324
490
  int output_level = 1, bool verify = true,
325
491
  uint64_t expected_oldest_blob_file_number = kInvalidBlobFileNumber,
326
- bool check_get_priority = false) {
492
+ bool check_get_priority = false,
493
+ Env::IOPriority read_io_priority = Env::IO_TOTAL,
494
+ Env::IOPriority write_io_priority = Env::IO_TOTAL) {
495
+ // For compaction, set fs as MockTestFileSystem to check the io_priority.
496
+ if (test_io_priority_) {
497
+ db_options_.fs.reset(
498
+ new MockTestFileSystem(fs_, read_io_priority, write_io_priority));
499
+ }
500
+
327
501
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
328
502
 
329
503
  size_t num_input_files = 0;
@@ -353,6 +527,7 @@ class CompactionJobTestBase : public testing::Test {
353
527
  SnapshotChecker* snapshot_checker = nullptr;
354
528
  ASSERT_TRUE(full_history_ts_low_.empty() ||
355
529
  ucmp_->timestamp_size() == full_history_ts_low_.size());
530
+ const std::atomic<bool> kManualCompactionCanceledFalse{false};
356
531
  CompactionJob compaction_job(
357
532
  0, &compaction, db_options_, mutable_db_options_, env_options_,
358
533
  versions_.get(), &shutting_down_, &log_buffer, nullptr, nullptr,
@@ -360,9 +535,9 @@ class CompactionJobTestBase : public testing::Test {
360
535
  earliest_write_conflict_snapshot, snapshot_checker, nullptr,
361
536
  table_cache_, &event_logger, false, false, dbname_,
362
537
  &compaction_job_stats_, Env::Priority::USER, nullptr /* IOTracer */,
363
- /*manual_compaction_paused=*/nullptr,
364
- /*manual_compaction_canceled=*/nullptr, env_->GenerateUniqueId(),
365
- DBImpl::GenerateDbSessionId(nullptr), full_history_ts_low_);
538
+ /*manual_compaction_canceled=*/kManualCompactionCanceledFalse,
539
+ env_->GenerateUniqueId(), DBImpl::GenerateDbSessionId(nullptr),
540
+ full_history_ts_low_);
366
541
  VerifyInitializationOfCompactionJobStats(compaction_job_stats_);
367
542
 
368
543
  compaction_job.Prepare();
@@ -444,15 +619,16 @@ class CompactionJobTestBase : public testing::Test {
444
619
  ErrorHandler error_handler_;
445
620
  std::string full_history_ts_low_;
446
621
  const std::function<std::string(uint64_t)> encode_u64_ts_;
622
+ bool test_io_priority_;
447
623
  };
448
624
 
449
625
  // TODO(icanadi) Make it simpler once we mock out VersionSet
450
626
  class CompactionJobTest : public CompactionJobTestBase {
451
627
  public:
452
628
  CompactionJobTest()
453
- : CompactionJobTestBase(test::PerThreadDBPath("compaction_job_test"),
454
- BytewiseComparator(),
455
- [](uint64_t /*ts*/) { return ""; }) {}
629
+ : CompactionJobTestBase(
630
+ test::PerThreadDBPath("compaction_job_test"), BytewiseComparator(),
631
+ [](uint64_t /*ts*/) { return ""; }, false) {}
456
632
  };
457
633
 
458
634
  TEST_F(CompactionJobTest, Simple) {
@@ -1342,23 +1518,13 @@ TEST_F(CompactionJobTest, ResultSerialization) {
1342
1518
  }
1343
1519
  }
1344
1520
 
1345
- TEST_F(CompactionJobTest, GetRateLimiterPriority) {
1346
- NewDB();
1347
-
1348
- auto expected_results = CreateTwoFiles(false);
1349
- auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1350
- auto files = cfd->current()->storage_info()->LevelFiles(0);
1351
- ASSERT_EQ(2U, files.size());
1352
- RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, true,
1353
- kInvalidBlobFileNumber, true);
1354
- }
1355
1521
 
1356
1522
  class CompactionJobTimestampTest : public CompactionJobTestBase {
1357
1523
  public:
1358
1524
  CompactionJobTimestampTest()
1359
1525
  : CompactionJobTestBase(test::PerThreadDBPath("compaction_job_ts_test"),
1360
1526
  test::BytewiseComparatorWithU64TsWrapper(),
1361
- test::EncodeInt) {}
1527
+ test::EncodeInt, false) {}
1362
1528
  };
1363
1529
 
1364
1530
  TEST_F(CompactionJobTimestampTest, GCDisabled) {
@@ -1474,6 +1640,69 @@ TEST_F(CompactionJobTimestampTest, SomeKeysExpired) {
1474
1640
  RunCompaction({files}, expected_results);
1475
1641
  }
1476
1642
 
1643
+ // The io priority of the compaction reads and writes are different from
1644
+ // other DB reads and writes. To prepare the compaction input files, use the
1645
+ // default filesystem from Env. To test the io priority of the compaction
1646
+ // reads and writes, db_options_.fs is set as MockTestFileSystem.
1647
+ class CompactionJobIOPriorityTest : public CompactionJobTestBase {
1648
+ public:
1649
+ CompactionJobIOPriorityTest()
1650
+ : CompactionJobTestBase(
1651
+ test::PerThreadDBPath("compaction_job_io_priority_test"),
1652
+ BytewiseComparator(), [](uint64_t /*ts*/) { return ""; }, true) {}
1653
+ };
1654
+
1655
+ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateNormal) {
1656
+ // When the state from WriteController is normal.
1657
+ NewDB();
1658
+ mock::KVVector expected_results = CreateTwoFiles(false);
1659
+ auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1660
+ auto files = cfd->current()->storage_info()->LevelFiles(0);
1661
+ ASSERT_EQ(2U, files.size());
1662
+ RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1663
+ kInvalidBlobFileNumber, false, Env::IO_LOW, Env::IO_LOW);
1664
+ }
1665
+
1666
+ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateDelayed) {
1667
+ // When the state from WriteController is Delayed.
1668
+ NewDB();
1669
+ mock::KVVector expected_results = CreateTwoFiles(false);
1670
+ auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1671
+ auto files = cfd->current()->storage_info()->LevelFiles(0);
1672
+ ASSERT_EQ(2U, files.size());
1673
+ {
1674
+ std::unique_ptr<WriteControllerToken> delay_token =
1675
+ write_controller_.GetDelayToken(1000000);
1676
+ RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1677
+ kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
1678
+ }
1679
+ }
1680
+
1681
+ TEST_F(CompactionJobIOPriorityTest, WriteControllerStateStalled) {
1682
+ // When the state from WriteController is Stalled.
1683
+ NewDB();
1684
+ mock::KVVector expected_results = CreateTwoFiles(false);
1685
+ auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1686
+ auto files = cfd->current()->storage_info()->LevelFiles(0);
1687
+ ASSERT_EQ(2U, files.size());
1688
+ {
1689
+ std::unique_ptr<WriteControllerToken> stop_token =
1690
+ write_controller_.GetStopToken();
1691
+ RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1692
+ kInvalidBlobFileNumber, false, Env::IO_USER, Env::IO_USER);
1693
+ }
1694
+ }
1695
+
1696
+ TEST_F(CompactionJobIOPriorityTest, GetRateLimiterPriority) {
1697
+ NewDB();
1698
+ mock::KVVector expected_results = CreateTwoFiles(false);
1699
+ auto cfd = versions_->GetColumnFamilySet()->GetDefault();
1700
+ auto files = cfd->current()->storage_info()->LevelFiles(0);
1701
+ ASSERT_EQ(2U, files.size());
1702
+ RunCompaction({files}, expected_results, {}, kMaxSequenceNumber, 1, false,
1703
+ kInvalidBlobFileNumber, true, Env::IO_LOW, Env::IO_LOW);
1704
+ }
1705
+
1477
1706
  } // namespace ROCKSDB_NAMESPACE
1478
1707
 
1479
1708
  int main(int argc, char** argv) {
@@ -640,7 +640,11 @@ Compaction* CompactionPicker::CompactRange(
640
640
  GetCompressionType(vstorage, mutable_cf_options, output_level, 1),
641
641
  GetCompressionOptions(mutable_cf_options, vstorage, output_level),
642
642
  Temperature::kUnknown, compact_range_options.max_subcompactions,
643
- /* grandparents */ {}, /* is manual */ true, trim_ts);
643
+ /* grandparents */ {}, /* is manual */ true, trim_ts, /* score */ -1,
644
+ /* deletion_compaction */ false, CompactionReason::kUnknown,
645
+ compact_range_options.blob_garbage_collection_policy,
646
+ compact_range_options.blob_garbage_collection_age_cutoff);
647
+
644
648
  RegisterCompaction(c);
645
649
  vstorage->ComputeCompactionScore(ioptions_, mutable_cf_options);
646
650
  return c;
@@ -818,8 +822,10 @@ Compaction* CompactionPicker::CompactRange(
818
822
  vstorage->base_level()),
819
823
  GetCompressionOptions(mutable_cf_options, vstorage, output_level),
820
824
  Temperature::kUnknown, compact_range_options.max_subcompactions,
821
- std::move(grandparents),
822
- /* is manual compaction */ true, trim_ts);
825
+ std::move(grandparents), /* is manual */ true, trim_ts, /* score */ -1,
826
+ /* deletion_compaction */ false, CompactionReason::kUnknown,
827
+ compact_range_options.blob_garbage_collection_policy,
828
+ compact_range_options.blob_garbage_collection_age_cutoff);
823
829
 
824
830
  TEST_SYNC_POINT_CALLBACK("CompactionPicker::CompactRange:Return", compaction);
825
831
  RegisterCompaction(compaction);
@@ -7,6 +7,7 @@
7
7
 
8
8
  #include "db/db_test_util.h"
9
9
  #include "port/stack_trace.h"
10
+ #include "table/unique_id_impl.h"
10
11
 
11
12
  namespace ROCKSDB_NAMESPACE {
12
13
 
@@ -294,8 +295,8 @@ TEST_F(CompactionServiceTest, BasicCompactions) {
294
295
  SyncPoint::GetInstance()->SetCallBack(
295
296
  "Version::VerifySstUniqueIds::Passed", [&](void* arg) {
296
297
  // override job status
297
- auto id = static_cast<std::string*>(arg);
298
- assert(!id->empty());
298
+ auto id = static_cast<UniqueId64x2*>(arg);
299
+ assert(*id != kNullUniqueId64x2);
299
300
  verify_passed++;
300
301
  });
301
302
  SyncPoint::GetInstance()->EnableProcessing();
@@ -1065,7 +1065,7 @@ INSTANTIATE_TEST_CASE_P(CorruptionTest, CrashDuringRecoveryWithCorruptionTest,
1065
1065
  // The combination of corrupting a WAL and injecting an error during subsequent
1066
1066
  // re-open exposes the bug of prematurely persisting a new MANIFEST with
1067
1067
  // advanced ColumnFamilyData::log_number.
1068
- TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
1068
+ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecovery) {
1069
1069
  CloseDb();
1070
1070
  Options options;
1071
1071
  options.track_and_verify_wals_in_manifest =
@@ -1107,7 +1107,8 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
1107
1107
  // number. TEST_SwitchMemtable makes sure WALs are not synced and test can
1108
1108
  // corrupt un-sync WAL.
1109
1109
  for (int i = 0; i < 2; ++i) {
1110
- ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i), "value"));
1110
+ ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
1111
+ "value" + std::to_string(i)));
1111
1112
  ASSERT_OK(dbimpl->TEST_SwitchMemtable());
1112
1113
  }
1113
1114
 
@@ -1188,6 +1189,23 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
1188
1189
  {
1189
1190
  options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1190
1191
  ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
1192
+
1193
+ // Verify that data is not lost.
1194
+ {
1195
+ std::string v;
1196
+ ASSERT_OK(db_->Get(ReadOptions(), handles[1], "old_key", &v));
1197
+ ASSERT_EQ("dontcare", v);
1198
+
1199
+ v.clear();
1200
+ ASSERT_OK(db_->Get(ReadOptions(), "key" + std::to_string(0), &v));
1201
+ ASSERT_EQ("value" + std::to_string(0), v);
1202
+
1203
+ // Since it's corrupting second last wal, below key is not found.
1204
+ v.clear();
1205
+ ASSERT_EQ(db_->Get(ReadOptions(), "key" + std::to_string(1), &v),
1206
+ Status::NotFound());
1207
+ }
1208
+
1191
1209
  for (auto* h : handles) {
1192
1210
  delete h;
1193
1211
  }
@@ -1219,8 +1237,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest, DISABLED_CrashDuringRecovery) {
1219
1237
  // The combination of corrupting a WAL and injecting an error during subsequent
1220
1238
  // re-open exposes the bug of prematurely persisting a new MANIFEST with
1221
1239
  // advanced ColumnFamilyData::log_number.
1222
- TEST_P(CrashDuringRecoveryWithCorruptionTest,
1223
- DISABLED_TxnDbCrashDuringRecovery) {
1240
+ TEST_P(CrashDuringRecoveryWithCorruptionTest, TxnDbCrashDuringRecovery) {
1224
1241
  CloseDb();
1225
1242
  Options options;
1226
1243
  options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
@@ -1271,13 +1288,14 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1271
1288
 
1272
1289
  // Put and flush cf0
1273
1290
  for (int i = 0; i < 2; ++i) {
1274
- ASSERT_OK(txn_db->Put(WriteOptions(), "dontcare", "value"));
1291
+ ASSERT_OK(txn_db->Put(WriteOptions(), "key" + std::to_string(i),
1292
+ "value" + std::to_string(i)));
1275
1293
  ASSERT_OK(dbimpl->TEST_SwitchMemtable());
1276
1294
  }
1277
1295
 
1278
1296
  // Put cf1
1279
1297
  txn = txn_db->BeginTransaction(WriteOptions(), TransactionOptions());
1280
- ASSERT_OK(txn->Put(handles[1], "foo1", "value"));
1298
+ ASSERT_OK(txn->Put(handles[1], "foo1", "value1"));
1281
1299
  ASSERT_OK(txn->Commit());
1282
1300
 
1283
1301
  delete txn;
@@ -1337,7 +1355,6 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1337
1355
  std::vector<uint64_t> file_nums;
1338
1356
  GetSortedWalFiles(file_nums);
1339
1357
  size_t size = file_nums.size();
1340
- assert(size >= 2);
1341
1358
  uint64_t log_num = file_nums[size - 1];
1342
1359
  CorruptFileWithTruncation(FileType::kWalFile, log_num);
1343
1360
  }
@@ -1354,6 +1371,27 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1354
1371
  {
1355
1372
  ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, cf_descs,
1356
1373
  &handles, &txn_db));
1374
+
1375
+ // Verify that data is not lost.
1376
+ {
1377
+ std::string v;
1378
+ // Key not visible since it's not committed.
1379
+ ASSERT_EQ(txn_db->Get(ReadOptions(), handles[1], "foo", &v),
1380
+ Status::NotFound());
1381
+
1382
+ v.clear();
1383
+ ASSERT_OK(txn_db->Get(ReadOptions(), "key" + std::to_string(0), &v));
1384
+ ASSERT_EQ("value" + std::to_string(0), v);
1385
+
1386
+ // Last WAL is corrupted which contains two keys below.
1387
+ v.clear();
1388
+ ASSERT_EQ(txn_db->Get(ReadOptions(), "key" + std::to_string(1), &v),
1389
+ Status::NotFound());
1390
+ v.clear();
1391
+ ASSERT_EQ(txn_db->Get(ReadOptions(), handles[1], "foo1", &v),
1392
+ Status::NotFound());
1393
+ }
1394
+
1357
1395
  for (auto* h : handles) {
1358
1396
  delete h;
1359
1397
  }
@@ -1396,8 +1434,7 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1396
1434
  // The combination of corrupting a WAL and injecting an error during subsequent
1397
1435
  // re-open exposes the bug of prematurely persisting a new MANIFEST with
1398
1436
  // advanced ColumnFamilyData::log_number.
1399
- TEST_P(CrashDuringRecoveryWithCorruptionTest,
1400
- DISABLED_CrashDuringRecoveryWithFlush) {
1437
+ TEST_P(CrashDuringRecoveryWithCorruptionTest, CrashDuringRecoveryWithFlush) {
1401
1438
  CloseDb();
1402
1439
  Options options;
1403
1440
  options.wal_recovery_mode = WALRecoveryMode::kPointInTimeRecovery;
@@ -1430,7 +1467,8 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1430
1467
  // Write to default_cf and flush this cf several times to advance wal
1431
1468
  // number.
1432
1469
  for (int i = 0; i < 2; ++i) {
1433
- ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i), "value"));
1470
+ ASSERT_OK(db_->Put(WriteOptions(), "key" + std::to_string(i),
1471
+ "value" + std::to_string(i)));
1434
1472
  ASSERT_OK(db_->Flush(FlushOptions()));
1435
1473
  }
1436
1474
 
@@ -1483,6 +1521,25 @@ TEST_P(CrashDuringRecoveryWithCorruptionTest,
1483
1521
  {
1484
1522
  options.avoid_flush_during_recovery = avoid_flush_during_recovery_;
1485
1523
  ASSERT_OK(DB::Open(options, dbname_, cf_descs, &handles, &db_));
1524
+
1525
+ // Verify that data is not lost.
1526
+ {
1527
+ std::string v;
1528
+ ASSERT_OK(db_->Get(ReadOptions(), handles[1], "old_key", &v));
1529
+ ASSERT_EQ("dontcare", v);
1530
+
1531
+ for (int i = 0; i < 2; ++i) {
1532
+ v.clear();
1533
+ ASSERT_OK(db_->Get(ReadOptions(), "key" + std::to_string(i), &v));
1534
+ ASSERT_EQ("value" + std::to_string(i), v);
1535
+ }
1536
+
1537
+ // Since it's corrupting last wal after Flush, below key is not found.
1538
+ v.clear();
1539
+ ASSERT_EQ(db_->Get(ReadOptions(), handles[1], "dontcare", &v),
1540
+ Status::NotFound());
1541
+ }
1542
+
1486
1543
  for (auto* h : handles) {
1487
1544
  delete h;
1488
1545
  }