@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
@@ -30,7 +30,7 @@ Status DBImpl::Put(const WriteOptions& o, ColumnFamilyHandle* column_family,
30
30
 
31
31
  Status DBImpl::Put(const WriteOptions& o, ColumnFamilyHandle* column_family,
32
32
  const Slice& key, const Slice& ts, const Slice& val) {
33
- const Status s = FailIfTsSizesMismatch(column_family, ts);
33
+ const Status s = FailIfTsMismatchCf(column_family, ts, /*ts_for_read=*/false);
34
34
  if (!s.ok()) {
35
35
  return s;
36
36
  }
@@ -63,7 +63,7 @@ Status DBImpl::Delete(const WriteOptions& write_options,
63
63
  Status DBImpl::Delete(const WriteOptions& write_options,
64
64
  ColumnFamilyHandle* column_family, const Slice& key,
65
65
  const Slice& ts) {
66
- const Status s = FailIfTsSizesMismatch(column_family, ts);
66
+ const Status s = FailIfTsMismatchCf(column_family, ts, /*ts_for_read=*/false);
67
67
  if (!s.ok()) {
68
68
  return s;
69
69
  }
@@ -83,7 +83,7 @@ Status DBImpl::SingleDelete(const WriteOptions& write_options,
83
83
  Status DBImpl::SingleDelete(const WriteOptions& write_options,
84
84
  ColumnFamilyHandle* column_family, const Slice& key,
85
85
  const Slice& ts) {
86
- const Status s = FailIfTsSizesMismatch(column_family, ts);
86
+ const Status s = FailIfTsMismatchCf(column_family, ts, /*ts_for_read=*/false);
87
87
  if (!s.ok()) {
88
88
  return s;
89
89
  }
@@ -126,7 +126,8 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
126
126
  uint64_t* log_used, uint64_t log_ref,
127
127
  bool disable_memtable, uint64_t* seq_used,
128
128
  size_t batch_cnt,
129
- PreReleaseCallback* pre_release_callback) {
129
+ PreReleaseCallback* pre_release_callback,
130
+ PostMemTableCallback* post_memtable_callback) {
130
131
  assert(!seq_per_batch_ || batch_cnt != 0);
131
132
  if (my_batch == nullptr) {
132
133
  return Status::InvalidArgument("Batch is nullptr!");
@@ -185,6 +186,15 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
185
186
  return Status::NotSupported(
186
187
  "pipelined_writes is not compatible with unordered_write");
187
188
  }
189
+ if (immutable_db_options_.enable_pipelined_write &&
190
+ post_memtable_callback != nullptr) {
191
+ return Status::NotSupported(
192
+ "pipelined write currently does not honor post_memtable_callback");
193
+ }
194
+ if (seq_per_batch_ && post_memtable_callback != nullptr) {
195
+ return Status::NotSupported(
196
+ "seq_per_batch currently does not honor post_memtable_callback");
197
+ }
188
198
  // Otherwise IsLatestPersistentState optimization does not make sense
189
199
  assert(!WriteBatchInternal::IsLatestPersistentState(my_batch) ||
190
200
  disable_memtable);
@@ -241,7 +251,8 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
241
251
 
242
252
  PERF_TIMER_GUARD(write_pre_and_post_process_time);
243
253
  WriteThread::Writer w(write_options, my_batch, callback, log_ref,
244
- disable_memtable, batch_cnt, pre_release_callback);
254
+ disable_memtable, batch_cnt, pre_release_callback,
255
+ post_memtable_callback);
245
256
  StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
246
257
 
247
258
  write_thread_.JoinBatchGroup(&w);
@@ -268,6 +279,16 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
268
279
  // we're responsible for exit batch group
269
280
  // TODO(myabandeh): propagate status to write_group
270
281
  auto last_sequence = w.write_group->last_sequence;
282
+ for (auto* tmp_w : *(w.write_group)) {
283
+ assert(tmp_w);
284
+ if (tmp_w->post_memtable_callback) {
285
+ Status tmp_s =
286
+ (*tmp_w->post_memtable_callback)(last_sequence, disable_memtable);
287
+ // TODO: propagate the execution status of post_memtable_callback to
288
+ // caller.
289
+ assert(tmp_s.ok());
290
+ }
291
+ }
271
292
  versions_->SetLastSequence(last_sequence);
272
293
  MemTableInsertStatusCheck(w.status);
273
294
  write_thread_.ExitAsBatchGroupFollower(&w);
@@ -319,7 +340,11 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
319
340
 
320
341
  PERF_TIMER_START(write_pre_and_post_process_time);
321
342
  }
343
+
322
344
  log::Writer* log_writer = logs_.back().writer;
345
+ LogFileNumberSize& log_file_number_size = alive_log_files_.back();
346
+
347
+ assert(log_writer->get_log_number() == log_file_number_size.number);
323
348
 
324
349
  mutex_.Unlock();
325
350
 
@@ -419,7 +444,8 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
419
444
  if (status.ok() && !write_options.disableWAL) {
420
445
  PERF_TIMER_GUARD(write_wal_time);
421
446
  io_s = WriteToWAL(write_group, log_writer, log_used, need_log_sync,
422
- need_log_dir_sync, last_sequence + 1);
447
+ need_log_dir_sync, last_sequence + 1,
448
+ log_file_number_size);
423
449
  }
424
450
  } else {
425
451
  if (status.ok() && !write_options.disableWAL) {
@@ -545,6 +571,16 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
545
571
  }
546
572
  if (should_exit_batch_group) {
547
573
  if (status.ok()) {
574
+ for (auto* tmp_w : write_group) {
575
+ assert(tmp_w);
576
+ if (tmp_w->post_memtable_callback) {
577
+ Status tmp_s =
578
+ (*tmp_w->post_memtable_callback)(last_sequence, disable_memtable);
579
+ // TODO: propagate the execution status of post_memtable_callback to
580
+ // caller.
581
+ assert(tmp_s.ok());
582
+ }
583
+ }
548
584
  // Note: if we are to resume after non-OK statuses we need to revisit how
549
585
  // we reacts to non-OK statuses here.
550
586
  versions_->SetLastSequence(last_sequence);
@@ -586,6 +622,10 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
586
622
  w.status = PreprocessWrite(write_options, &need_log_sync, &write_context);
587
623
  PERF_TIMER_START(write_pre_and_post_process_time);
588
624
  log::Writer* log_writer = logs_.back().writer;
625
+ LogFileNumberSize& log_file_number_size = alive_log_files_.back();
626
+
627
+ assert(log_writer->get_log_number() == log_file_number_size.number);
628
+
589
629
  mutex_.Unlock();
590
630
 
591
631
  // This can set non-OK status if callback fail.
@@ -649,8 +689,9 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
649
689
  wal_write_group.size - 1);
650
690
  RecordTick(stats_, WRITE_DONE_BY_OTHER, wal_write_group.size - 1);
651
691
  }
652
- io_s = WriteToWAL(wal_write_group, log_writer, log_used, need_log_sync,
653
- need_log_dir_sync, current_sequence);
692
+ io_s =
693
+ WriteToWAL(wal_write_group, log_writer, log_used, need_log_sync,
694
+ need_log_dir_sync, current_sequence, log_file_number_size);
654
695
  w.status = io_s;
655
696
  }
656
697
 
@@ -1041,12 +1082,18 @@ Status DBImpl::PreprocessWrite(const WriteOptions& write_options,
1041
1082
 
1042
1083
  PERF_TIMER_GUARD(write_scheduling_flushes_compactions_time);
1043
1084
 
1044
- assert(!single_column_family_mode_ ||
1045
- versions_->GetColumnFamilySet()->NumberOfColumnFamilies() == 1);
1046
- if (UNLIKELY(status.ok() && !single_column_family_mode_ &&
1047
- total_log_size_ > GetMaxTotalWalSize())) {
1048
- WaitForPendingWrites();
1049
- status = SwitchWAL(write_context);
1085
+ if (UNLIKELY(status.ok() && total_log_size_ > GetMaxTotalWalSize())) {
1086
+ assert(versions_);
1087
+ const ColumnFamilySet* const column_families =
1088
+ versions_->GetColumnFamilySet();
1089
+ assert(column_families);
1090
+ size_t num_cfs = column_families->NumberOfColumnFamilies();
1091
+
1092
+ assert(num_cfs >= 1);
1093
+ if (num_cfs > 1) {
1094
+ WaitForPendingWrites();
1095
+ status = SwitchWAL(write_context);
1096
+ }
1050
1097
  }
1051
1098
 
1052
1099
  if (UNLIKELY(status.ok() && write_buffer_manager_->ShouldFlush())) {
@@ -1172,17 +1219,9 @@ IOStatus DBImpl::WriteToWAL(const WriteBatch& merged_batch,
1172
1219
  log::Writer* log_writer, uint64_t* log_used,
1173
1220
  uint64_t* log_size,
1174
1221
  Env::IOPriority rate_limiter_priority,
1175
- bool with_db_mutex, bool with_log_mutex) {
1222
+ LogFileNumberSize& log_file_number_size) {
1176
1223
  assert(log_size != nullptr);
1177
1224
 
1178
- // Assert mutex explicitly.
1179
- if (with_db_mutex) {
1180
- mutex_.AssertHeld();
1181
- } else if (two_write_queues_) {
1182
- log_write_mutex_.AssertHeld();
1183
- assert(with_log_mutex);
1184
- }
1185
-
1186
1225
  Slice log_entry = WriteBatchInternal::Contents(&merged_batch);
1187
1226
  *log_size = log_entry.size();
1188
1227
  // When two_write_queues_ WriteToWAL has to be protected from concurretn calls
@@ -1205,12 +1244,7 @@ IOStatus DBImpl::WriteToWAL(const WriteBatch& merged_batch,
1205
1244
  *log_used = logfile_number_;
1206
1245
  }
1207
1246
  total_log_size_ += log_entry.size();
1208
- if (with_db_mutex || with_log_mutex) {
1209
- assert(alive_log_files_tail_ == alive_log_files_.rbegin());
1210
- assert(alive_log_files_tail_ != alive_log_files_.rend());
1211
- }
1212
- LogFileNumberSize& last_alive_log = *alive_log_files_tail_;
1213
- last_alive_log.AddSize(*log_size);
1247
+ log_file_number_size.AddSize(*log_size);
1214
1248
  log_empty_ = false;
1215
1249
  return io_s;
1216
1250
  }
@@ -1218,7 +1252,8 @@ IOStatus DBImpl::WriteToWAL(const WriteBatch& merged_batch,
1218
1252
  IOStatus DBImpl::WriteToWAL(const WriteThread::WriteGroup& write_group,
1219
1253
  log::Writer* log_writer, uint64_t* log_used,
1220
1254
  bool need_log_sync, bool need_log_dir_sync,
1221
- SequenceNumber sequence) {
1255
+ SequenceNumber sequence,
1256
+ LogFileNumberSize& log_file_number_size) {
1222
1257
  IOStatus io_s;
1223
1258
  assert(!two_write_queues_);
1224
1259
  assert(!write_group.leader->disable_wal);
@@ -1239,7 +1274,8 @@ IOStatus DBImpl::WriteToWAL(const WriteThread::WriteGroup& write_group,
1239
1274
 
1240
1275
  uint64_t log_size;
1241
1276
  io_s = WriteToWAL(*merged_batch, log_writer, log_used, &log_size,
1242
- write_group.leader->rate_limiter_priority);
1277
+ write_group.leader->rate_limiter_priority,
1278
+ log_file_number_size);
1243
1279
  if (to_be_cached_state) {
1244
1280
  cached_recoverable_state_ = *to_be_cached_state;
1245
1281
  cached_recoverable_state_empty_ = false;
@@ -1333,10 +1369,14 @@ IOStatus DBImpl::ConcurrentWriteToWAL(
1333
1369
  WriteBatchInternal::SetSequence(merged_batch, sequence);
1334
1370
 
1335
1371
  log::Writer* log_writer = logs_.back().writer;
1372
+ LogFileNumberSize& log_file_number_size = alive_log_files_.back();
1373
+
1374
+ assert(log_writer->get_log_number() == log_file_number_size.number);
1375
+
1336
1376
  uint64_t log_size;
1337
1377
  io_s = WriteToWAL(*merged_batch, log_writer, log_used, &log_size,
1338
1378
  write_group.leader->rate_limiter_priority,
1339
- /*with_db_mutex=*/false, /*with_log_mutex=*/true);
1379
+ log_file_number_size);
1340
1380
  if (to_be_cached_state) {
1341
1381
  cached_recoverable_state_ = *to_be_cached_state;
1342
1382
  cached_recoverable_state_empty_ = false;
@@ -1992,7 +2032,6 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
1992
2032
  log_dir_synced_ = false;
1993
2033
  logs_.emplace_back(logfile_number_, new_log);
1994
2034
  alive_log_files_.push_back(LogFileNumberSize(logfile_number_));
1995
- alive_log_files_tail_ = alive_log_files_.rbegin();
1996
2035
  }
1997
2036
  log_write_mutex_.Unlock();
1998
2037
  }