@nxtedition/rocksdb 7.0.5 → 7.0.8

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 (262) hide show
  1. package/binding.cc +363 -329
  2. package/chained-batch.js +6 -1
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +8 -3
  4. package/deps/rocksdb/rocksdb/Makefile +10 -4
  5. package/deps/rocksdb/rocksdb/TARGETS +6 -4
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +14 -0
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +8 -8
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +272 -174
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +201 -57
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +19 -19
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -1
  13. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  14. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  15. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  16. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  17. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  18. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  19. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  20. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  21. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  22. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +170 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +95 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +298 -0
  26. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +172 -0
  27. package/deps/rocksdb/rocksdb/db/column_family.cc +8 -3
  28. package/deps/rocksdb/rocksdb/db/column_family.h +6 -3
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +10 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +6 -6
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -2
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +38 -0
  33. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -5
  34. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +4 -7
  35. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -71
  36. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +70 -1
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +13 -12
  38. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +36 -0
  39. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -4
  40. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +139 -91
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +48 -14
  43. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +90 -55
  44. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +9 -4
  45. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -1
  46. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -7
  47. package/deps/rocksdb/rocksdb/db/db_write_test.cc +35 -0
  48. package/deps/rocksdb/rocksdb/db/dbformat.cc +3 -1
  49. package/deps/rocksdb/rocksdb/db/dbformat.h +5 -3
  50. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -1
  51. package/deps/rocksdb/rocksdb/db/memtable.cc +1 -0
  52. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
  53. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  54. package/deps/rocksdb/rocksdb/db/version_builder.cc +43 -1
  55. package/deps/rocksdb/rocksdb/db/version_edit.cc +13 -5
  56. package/deps/rocksdb/rocksdb/db/version_edit.h +22 -1
  57. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +4 -5
  58. package/deps/rocksdb/rocksdb/db/version_set.cc +109 -41
  59. package/deps/rocksdb/rocksdb/db/version_set.h +36 -3
  60. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -4
  61. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -10
  62. package/deps/rocksdb/rocksdb/db/version_util.h +1 -1
  63. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  64. package/deps/rocksdb/rocksdb/db/write_batch.cc +34 -10
  65. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -0
  66. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -0
  67. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
  68. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -1
  69. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -1
  70. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +7 -5
  71. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +5 -10
  72. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -7
  73. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +2 -0
  74. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +24 -3
  75. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  76. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +10 -0
  77. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +5 -0
  78. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
  79. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +9 -5
  80. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  81. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  82. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +1 -1
  83. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  84. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -3
  85. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +8 -6
  86. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
  87. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -2
  88. package/deps/rocksdb/rocksdb/options/options_test.cc +1 -11
  89. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -0
  90. package/deps/rocksdb/rocksdb/port/win/port_win.h +11 -3
  91. package/deps/rocksdb/rocksdb/src.mk +6 -2
  92. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -33
  93. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +3 -3
  94. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +38 -118
  95. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +6 -8
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +10 -13
  97. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +4 -9
  98. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +0 -1
  99. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -28
  100. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -3
  101. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -91
  102. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -30
  103. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -27
  104. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +11 -13
  105. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -40
  106. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +0 -1
  107. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +22 -43
  108. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +11 -22
  109. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +24 -25
  110. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +0 -1
  111. package/deps/rocksdb/rocksdb/table/get_context.h +0 -1
  112. package/deps/rocksdb/rocksdb/table/table_test.cc +3 -18
  113. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +3 -16
  114. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -3
  115. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -1
  116. package/deps/rocksdb/rocksdb/util/bloom_test.cc +0 -201
  117. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +48 -0
  118. package/deps/rocksdb/rocksdb/util/filter_bench.cc +5 -11
  119. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3 -0
  120. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -21
  121. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
  122. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +45 -0
  123. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +21 -14
  124. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +10 -1
  125. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +3 -1
  126. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +9 -0
  127. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +3 -2
  128. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -1
  129. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +5 -4
  130. package/deps/rocksdb/rocksdb.gyp +1 -1
  131. package/index.js +36 -14
  132. package/package-lock.json +23687 -0
  133. package/package.json +1 -1
  134. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  135. package/prebuilds/darwin-x64/node.napi.node +0 -0
  136. package/prebuilds/linux-x64/node.napi.node +0 -0
  137. package/deps/liburing/liburing/README +0 -46
  138. package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
  139. package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
  140. package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
  141. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
  142. package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
  143. package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
  144. package/deps/liburing/liburing/test/Makefile +0 -312
  145. package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
  146. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
  147. package/deps/liburing/liburing/test/accept-link.c +0 -251
  148. package/deps/liburing/liburing/test/accept-reuse.c +0 -164
  149. package/deps/liburing/liburing/test/accept-test.c +0 -79
  150. package/deps/liburing/liburing/test/accept.c +0 -476
  151. package/deps/liburing/liburing/test/across-fork.c +0 -283
  152. package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
  153. package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
  154. package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
  155. package/deps/liburing/liburing/test/close-opath.c +0 -122
  156. package/deps/liburing/liburing/test/config +0 -10
  157. package/deps/liburing/liburing/test/connect.c +0 -398
  158. package/deps/liburing/liburing/test/cq-full.c +0 -96
  159. package/deps/liburing/liburing/test/cq-overflow.c +0 -294
  160. package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
  161. package/deps/liburing/liburing/test/cq-ready.c +0 -94
  162. package/deps/liburing/liburing/test/cq-size.c +0 -58
  163. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
  164. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
  165. package/deps/liburing/liburing/test/defer.c +0 -307
  166. package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
  167. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
  168. package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
  169. package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
  170. package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
  171. package/deps/liburing/liburing/test/eventfd.c +0 -112
  172. package/deps/liburing/liburing/test/fadvise.c +0 -202
  173. package/deps/liburing/liburing/test/fallocate.c +0 -249
  174. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
  175. package/deps/liburing/liburing/test/file-register.c +0 -843
  176. package/deps/liburing/liburing/test/file-update.c +0 -173
  177. package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
  178. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
  179. package/deps/liburing/liburing/test/fixed-link.c +0 -90
  180. package/deps/liburing/liburing/test/fsync.c +0 -224
  181. package/deps/liburing/liburing/test/hardlink.c +0 -136
  182. package/deps/liburing/liburing/test/helpers.c +0 -135
  183. package/deps/liburing/liburing/test/helpers.h +0 -67
  184. package/deps/liburing/liburing/test/io-cancel.c +0 -537
  185. package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
  186. package/deps/liburing/liburing/test/io_uring_register.c +0 -664
  187. package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
  188. package/deps/liburing/liburing/test/iopoll.c +0 -366
  189. package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
  190. package/deps/liburing/liburing/test/lfs-openat.c +0 -273
  191. package/deps/liburing/liburing/test/link-timeout.c +0 -1107
  192. package/deps/liburing/liburing/test/link.c +0 -496
  193. package/deps/liburing/liburing/test/link_drain.c +0 -229
  194. package/deps/liburing/liburing/test/madvise.c +0 -195
  195. package/deps/liburing/liburing/test/mkdir.c +0 -108
  196. package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
  197. package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
  198. package/deps/liburing/liburing/test/nop.c +0 -115
  199. package/deps/liburing/liburing/test/open-close.c +0 -146
  200. package/deps/liburing/liburing/test/openat2.c +0 -240
  201. package/deps/liburing/liburing/test/personality.c +0 -204
  202. package/deps/liburing/liburing/test/pipe-eof.c +0 -81
  203. package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
  204. package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
  205. package/deps/liburing/liburing/test/poll-cancel.c +0 -135
  206. package/deps/liburing/liburing/test/poll-link.c +0 -227
  207. package/deps/liburing/liburing/test/poll-many.c +0 -208
  208. package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
  209. package/deps/liburing/liburing/test/poll-ring.c +0 -48
  210. package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
  211. package/deps/liburing/liburing/test/poll.c +0 -109
  212. package/deps/liburing/liburing/test/probe.c +0 -137
  213. package/deps/liburing/liburing/test/read-write.c +0 -876
  214. package/deps/liburing/liburing/test/register-restrictions.c +0 -633
  215. package/deps/liburing/liburing/test/rename.c +0 -134
  216. package/deps/liburing/liburing/test/ring-leak.c +0 -173
  217. package/deps/liburing/liburing/test/ring-leak2.c +0 -249
  218. package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
  219. package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
  220. package/deps/liburing/liburing/test/runtests.sh +0 -170
  221. package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
  222. package/deps/liburing/liburing/test/self.c +0 -91
  223. package/deps/liburing/liburing/test/send_recv.c +0 -291
  224. package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
  225. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
  226. package/deps/liburing/liburing/test/shared-wq.c +0 -84
  227. package/deps/liburing/liburing/test/short-read.c +0 -75
  228. package/deps/liburing/liburing/test/shutdown.c +0 -163
  229. package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
  230. package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
  231. package/deps/liburing/liburing/test/socket-rw.c +0 -147
  232. package/deps/liburing/liburing/test/splice.c +0 -511
  233. package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
  234. package/deps/liburing/liburing/test/sq-full.c +0 -45
  235. package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
  236. package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
  237. package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
  238. package/deps/liburing/liburing/test/sq-space_left.c +0 -159
  239. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
  240. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
  241. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
  242. package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
  243. package/deps/liburing/liburing/test/statx.c +0 -172
  244. package/deps/liburing/liburing/test/stdout.c +0 -232
  245. package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
  246. package/deps/liburing/liburing/test/submit-reuse.c +0 -239
  247. package/deps/liburing/liburing/test/symlink.c +0 -116
  248. package/deps/liburing/liburing/test/teardowns.c +0 -58
  249. package/deps/liburing/liburing/test/thread-exit.c +0 -131
  250. package/deps/liburing/liburing/test/timeout-new.c +0 -246
  251. package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
  252. package/deps/liburing/liburing/test/timeout.c +0 -1354
  253. package/deps/liburing/liburing/test/unlink.c +0 -111
  254. package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
  255. package/deps/rocksdb/rocksdb/README.md +0 -32
  256. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  257. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  258. package/deps/rocksdb/rocksdb/port/README +0 -10
  259. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +0 -358
  260. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +0 -127
  261. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +0 -219
  262. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -36,7 +36,7 @@ enum Tag : uint32_t {
36
36
  kLogNumber = 2,
37
37
  kNextFileNumber = 3,
38
38
  kLastSequence = 4,
39
- kCompactPointer = 5,
39
+ kCompactCursor = 5,
40
40
  kDeletedFile = 6,
41
41
  kNewFile = 7,
42
42
  // 8 was used for large value refs
@@ -463,6 +463,24 @@ class VersionEdit {
463
463
  using NewFiles = std::vector<std::pair<int, FileMetaData>>;
464
464
  const NewFiles& GetNewFiles() const { return new_files_; }
465
465
 
466
+ // Retrieve all the compact cursors
467
+ using CompactCursors = std::vector<std::pair<int, InternalKey>>;
468
+ const CompactCursors& GetCompactCursors() const { return compact_cursors_; }
469
+ void AddCompactCursor(int level, const InternalKey& cursor) {
470
+ compact_cursors_.push_back(std::make_pair(level, cursor));
471
+ }
472
+ void SetCompactCursors(
473
+ const std::vector<InternalKey>& compact_cursors_by_level) {
474
+ compact_cursors_.clear();
475
+ compact_cursors_.reserve(compact_cursors_by_level.size());
476
+ for (int i = 0; i < (int)compact_cursors_by_level.size(); i++) {
477
+ if (compact_cursors_by_level[i].Valid()) {
478
+ compact_cursors_.push_back(
479
+ std::make_pair(i, compact_cursors_by_level[i]));
480
+ }
481
+ }
482
+ }
483
+
466
484
  // Add a new blob file.
467
485
  void AddBlobFile(uint64_t blob_file_number, uint64_t total_blob_count,
468
486
  uint64_t total_blob_bytes, std::string checksum_method,
@@ -635,6 +653,9 @@ class VersionEdit {
635
653
  bool has_min_log_number_to_keep_ = false;
636
654
  bool has_last_sequence_ = false;
637
655
 
656
+ // Compaction cursors for round-robin compaction policy
657
+ CompactCursors compact_cursors_;
658
+
638
659
  DeletedFiles deleted_files_;
639
660
  NewFiles new_files_;
640
661
 
@@ -12,8 +12,8 @@
12
12
  #include <cinttypes>
13
13
  #include <sstream>
14
14
 
15
- #include "db/blob/blob_file_cache.h"
16
15
  #include "db/blob/blob_file_reader.h"
16
+ #include "db/blob/blob_source.h"
17
17
  #include "logging/logging.h"
18
18
  #include "monitoring/persistent_stats_history.h"
19
19
 
@@ -831,11 +831,10 @@ Status VersionEditHandlerPointInTime::VerifyFile(const std::string& fpath,
831
831
  Status VersionEditHandlerPointInTime::VerifyBlobFile(
832
832
  ColumnFamilyData* cfd, uint64_t blob_file_num,
833
833
  const BlobFileAddition& blob_addition) {
834
- BlobFileCache* blob_file_cache = cfd->blob_file_cache();
835
- assert(blob_file_cache);
834
+ BlobSource* blob_source = cfd->blob_source();
835
+ assert(blob_source);
836
836
  CacheHandleGuard<BlobFileReader> blob_file_reader;
837
- Status s =
838
- blob_file_cache->GetBlobFileReader(blob_file_num, &blob_file_reader);
837
+ Status s = blob_source->GetBlobFileReader(blob_file_num, &blob_file_reader);
839
838
  if (!s.ok()) {
840
839
  return s;
841
840
  }
@@ -25,6 +25,7 @@
25
25
  #include "db/blob/blob_file_reader.h"
26
26
  #include "db/blob/blob_index.h"
27
27
  #include "db/blob/blob_log_format.h"
28
+ #include "db/blob/blob_source.h"
28
29
  #include "db/compaction/compaction.h"
29
30
  #include "db/compaction/file_pri.h"
30
31
  #include "db/dbformat.h"
@@ -1797,6 +1798,7 @@ VersionStorageInfo::VersionStorageInfo(
1797
1798
  compaction_score_(num_levels_),
1798
1799
  compaction_level_(num_levels_),
1799
1800
  l0_delay_trigger_count_(0),
1801
+ compact_cursor_(num_levels_),
1800
1802
  accumulated_file_size_(0),
1801
1803
  accumulated_raw_key_size_(0),
1802
1804
  accumulated_raw_value_size_(0),
@@ -1819,6 +1821,8 @@ VersionStorageInfo::VersionStorageInfo(
1819
1821
  current_num_deletions_ = ref_vstorage->current_num_deletions_;
1820
1822
  current_num_samples_ = ref_vstorage->current_num_samples_;
1821
1823
  oldest_snapshot_seqnum_ = ref_vstorage->oldest_snapshot_seqnum_;
1824
+ compact_cursor_ = ref_vstorage->compact_cursor_;
1825
+ compact_cursor_.resize(num_levels_);
1822
1826
  }
1823
1827
  }
1824
1828
 
@@ -1833,7 +1837,7 @@ Version::Version(ColumnFamilyData* column_family_data, VersionSet* vset,
1833
1837
  info_log_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->logger),
1834
1838
  db_statistics_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->stats),
1835
1839
  table_cache_((cfd_ == nullptr) ? nullptr : cfd_->table_cache()),
1836
- blob_file_cache_(cfd_ ? cfd_->blob_file_cache() : nullptr),
1840
+ blob_source_(cfd_ ? cfd_->blob_source() : nullptr),
1837
1841
  merge_operator_(
1838
1842
  (cfd_ == nullptr) ? nullptr : cfd_->ioptions()->merge_operator.get()),
1839
1843
  storage_info_(
@@ -1880,34 +1884,22 @@ Status Version::GetBlob(const ReadOptions& read_options, const Slice& user_key,
1880
1884
  PinnableSlice* value, uint64_t* bytes_read) const {
1881
1885
  assert(value);
1882
1886
 
1883
- if (read_options.read_tier == kBlockCacheTier) {
1884
- return Status::Incomplete("Cannot read blob: no disk I/O allowed");
1885
- }
1886
-
1887
1887
  if (blob_index.HasTTL() || blob_index.IsInlined()) {
1888
1888
  return Status::Corruption("Unexpected TTL/inlined blob index");
1889
1889
  }
1890
1890
 
1891
1891
  const uint64_t blob_file_number = blob_index.file_number();
1892
1892
 
1893
- if (!storage_info_.GetBlobFileMetaData(blob_file_number)) {
1893
+ auto blob_file_meta = storage_info_.GetBlobFileMetaData(blob_file_number);
1894
+ if (!blob_file_meta) {
1894
1895
  return Status::Corruption("Invalid blob file number");
1895
1896
  }
1896
1897
 
1897
- CacheHandleGuard<BlobFileReader> blob_file_reader;
1898
-
1899
- {
1900
- assert(blob_file_cache_);
1901
- const Status s = blob_file_cache_->GetBlobFileReader(blob_file_number,
1902
- &blob_file_reader);
1903
- if (!s.ok()) {
1904
- return s;
1905
- }
1906
- }
1907
-
1908
- assert(blob_file_reader.GetValue());
1909
- const Status s = blob_file_reader.GetValue()->GetBlob(
1910
- read_options, user_key, blob_index.offset(), blob_index.size(),
1898
+ assert(blob_source_);
1899
+ value->Reset();
1900
+ const Status s = blob_source_->GetBlob(
1901
+ read_options, user_key, blob_file_number, blob_index.offset(),
1902
+ blob_file_meta->GetBlobFileSize(), blob_index.size(),
1911
1903
  blob_index.compression(), prefetch_buffer, value, bytes_read);
1912
1904
 
1913
1905
  return s;
@@ -1948,9 +1940,9 @@ void Version::MultiGetBlob(
1948
1940
  }
1949
1941
 
1950
1942
  CacheHandleGuard<BlobFileReader> blob_file_reader;
1951
- assert(blob_file_cache_);
1952
- status = blob_file_cache_->GetBlobFileReader(blob_file_number,
1953
- &blob_file_reader);
1943
+ assert(blob_source_);
1944
+ status =
1945
+ blob_source_->GetBlobFileReader(blob_file_number, &blob_file_reader);
1954
1946
  assert(!status.ok() || blob_file_reader.GetValue());
1955
1947
 
1956
1948
  auto& blobs_in_file = elem.second;
@@ -2252,8 +2244,8 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
2252
2244
  Status s;
2253
2245
  uint64_t num_index_read = 0;
2254
2246
  uint64_t num_filter_read = 0;
2255
- uint64_t num_data_read = 0;
2256
2247
  uint64_t num_sst_read = 0;
2248
+ uint64_t num_level_read = 0;
2257
2249
 
2258
2250
  MultiGetRange keys_with_blobs_range(*range, range->begin(), range->end());
2259
2251
  // blob_file => [[blob_idx, it], ...]
@@ -2275,7 +2267,7 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
2275
2267
  s = MultiGetFromSST(read_options, fp.CurrentFileRange(),
2276
2268
  fp.GetHitFileLevel(), fp.IsHitFileLastInLevel(), f,
2277
2269
  blob_rqs, num_filter_read, num_index_read,
2278
- num_data_read, num_sst_read);
2270
+ num_sst_read);
2279
2271
  if (fp.GetHitFileLevel() == 0) {
2280
2272
  dump_stats_for_l0_file = true;
2281
2273
  }
@@ -2290,13 +2282,14 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
2290
2282
  mget_tasks.emplace_back(MultiGetFromSSTCoroutine(
2291
2283
  read_options, fp.CurrentFileRange(), fp.GetHitFileLevel(),
2292
2284
  fp.IsHitFileLastInLevel(), f, blob_rqs, num_filter_read,
2293
- num_index_read, num_data_read, num_sst_read));
2285
+ num_index_read, num_sst_read));
2294
2286
  if (fp.KeyMaySpanNextFile()) {
2295
2287
  break;
2296
2288
  }
2297
2289
  f = fp.GetNextFileInLevel();
2298
2290
  }
2299
2291
  if (mget_tasks.size() > 0) {
2292
+ RecordTick(db_statistics_, MULTIGET_COROUTINE_COUNT, mget_tasks.size());
2300
2293
  // Collect all results so far
2301
2294
  std::vector<Status> statuses = folly::coro::blockingWait(
2302
2295
  folly::coro::collectAllRange(std::move(mget_tasks))
@@ -2328,18 +2321,18 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
2328
2321
  (prev_level != 0 && prev_level != (int)fp.GetHitFileLevel())) {
2329
2322
  // Dump the stats if the search has moved to the next level and
2330
2323
  // reset for next level.
2331
- if (num_sst_read || (num_filter_read + num_index_read)) {
2324
+ if (num_filter_read + num_index_read) {
2332
2325
  RecordInHistogram(db_statistics_,
2333
2326
  NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
2334
2327
  num_index_read + num_filter_read);
2335
- RecordInHistogram(db_statistics_, NUM_DATA_BLOCKS_READ_PER_LEVEL,
2336
- num_data_read);
2328
+ }
2329
+ if (num_sst_read) {
2337
2330
  RecordInHistogram(db_statistics_, NUM_SST_READ_PER_LEVEL,
2338
2331
  num_sst_read);
2332
+ num_level_read++;
2339
2333
  }
2340
2334
  num_filter_read = 0;
2341
2335
  num_index_read = 0;
2342
- num_data_read = 0;
2343
2336
  num_sst_read = 0;
2344
2337
  }
2345
2338
  prev_level = fp.GetHitFileLevel();
@@ -2347,11 +2340,19 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
2347
2340
  }
2348
2341
 
2349
2342
  // Dump stats for most recent level
2350
- RecordInHistogram(db_statistics_, NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
2351
- num_index_read + num_filter_read);
2352
- RecordInHistogram(db_statistics_, NUM_DATA_BLOCKS_READ_PER_LEVEL,
2353
- num_data_read);
2354
- RecordInHistogram(db_statistics_, NUM_SST_READ_PER_LEVEL, num_sst_read);
2343
+ if (num_filter_read + num_index_read) {
2344
+ RecordInHistogram(db_statistics_,
2345
+ NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
2346
+ num_index_read + num_filter_read);
2347
+ }
2348
+ if (num_sst_read) {
2349
+ RecordInHistogram(db_statistics_, NUM_SST_READ_PER_LEVEL, num_sst_read);
2350
+ num_level_read++;
2351
+ }
2352
+ if (num_level_read) {
2353
+ RecordInHistogram(db_statistics_, NUM_LEVEL_READ_PER_MULTIGET,
2354
+ num_level_read);
2355
+ }
2355
2356
 
2356
2357
  if (s.ok() && !blob_rqs.empty()) {
2357
2358
  MultiGetBlob(read_options, keys_with_blobs_range, blob_rqs);
@@ -3194,6 +3195,60 @@ void SortFileByOverlappingRatio(
3194
3195
  file_to_order[f2.file->fd.GetNumber()];
3195
3196
  });
3196
3197
  }
3198
+
3199
+ void SortFileByRoundRobin(const InternalKeyComparator& icmp,
3200
+ std::vector<InternalKey>* compact_cursor,
3201
+ bool level0_non_overlapping, int level,
3202
+ std::vector<Fsize>* temp) {
3203
+ if (level == 0 && !level0_non_overlapping) {
3204
+ // Using kOldestSmallestSeqFirst when level === 0, since the
3205
+ // files may overlap (not fully sorted)
3206
+ std::sort(temp->begin(), temp->end(),
3207
+ [](const Fsize& f1, const Fsize& f2) -> bool {
3208
+ return f1.file->fd.smallest_seqno < f2.file->fd.smallest_seqno;
3209
+ });
3210
+ return;
3211
+ }
3212
+
3213
+ bool should_move_files =
3214
+ compact_cursor->at(level).Valid() && temp->size() > 1;
3215
+
3216
+ // The iterator points to the Fsize with smallest key larger than or equal to
3217
+ // the given cursor
3218
+ std::vector<Fsize>::iterator current_file_iter;
3219
+ if (should_move_files) {
3220
+ // Find the file of which the smallest key is larger than or equal to
3221
+ // the cursor (the smallest key in the successor file of the last
3222
+ // chosen file), skip this if the cursor is invalid or there is only
3223
+ // one file in this level
3224
+ current_file_iter = std::lower_bound(
3225
+ temp->begin(), temp->end(), compact_cursor->at(level),
3226
+ [&](const Fsize& f, const InternalKey& cursor) -> bool {
3227
+ return icmp.Compare(cursor, f.file->smallest) > 0;
3228
+ });
3229
+
3230
+ should_move_files = current_file_iter != temp->end();
3231
+ }
3232
+ if (should_move_files) {
3233
+ // Construct a local temporary vector
3234
+ std::vector<Fsize> local_temp;
3235
+ local_temp.reserve(temp->size());
3236
+ // Move the selected File into the first position and its successors
3237
+ // into the second, third, ..., positions
3238
+ for (auto iter = current_file_iter; iter != temp->end(); iter++) {
3239
+ local_temp.push_back(*iter);
3240
+ }
3241
+ // Move the origin predecessors of the selected file in a round-robin
3242
+ // manner
3243
+ for (auto iter = temp->begin(); iter != current_file_iter; iter++) {
3244
+ local_temp.push_back(*iter);
3245
+ }
3246
+ // Replace all the items in temp
3247
+ for (size_t i = 0; i < local_temp.size(); i++) {
3248
+ temp->at(i) = local_temp[i];
3249
+ }
3250
+ }
3251
+ }
3197
3252
  } // namespace
3198
3253
 
3199
3254
  void VersionStorageInfo::UpdateFilesByCompactionPri(
@@ -3246,6 +3301,10 @@ void VersionStorageInfo::UpdateFilesByCompactionPri(
3246
3301
  files_[level + 1], ioptions.clock, level,
3247
3302
  num_non_empty_levels_, options.ttl, &temp);
3248
3303
  break;
3304
+ case kRoundRobin:
3305
+ SortFileByRoundRobin(*internal_comparator_, &compact_cursor_,
3306
+ level0_non_overlapping_, level, &temp);
3307
+ break;
3249
3308
  default:
3250
3309
  assert(false);
3251
3310
  }
@@ -4109,11 +4168,12 @@ VersionSet::VersionSet(const std::string& dbname,
4109
4168
  WriteController* write_controller,
4110
4169
  BlockCacheTracer* const block_cache_tracer,
4111
4170
  const std::shared_ptr<IOTracer>& io_tracer,
4171
+ const std::string& db_id,
4112
4172
  const std::string& db_session_id)
4113
- : column_family_set_(
4114
- new ColumnFamilySet(dbname, _db_options, storage_options, table_cache,
4115
- write_buffer_manager, write_controller,
4116
- block_cache_tracer, io_tracer, db_session_id)),
4173
+ : column_family_set_(new ColumnFamilySet(
4174
+ dbname, _db_options, storage_options, table_cache,
4175
+ write_buffer_manager, write_controller, block_cache_tracer, io_tracer,
4176
+ db_id, db_session_id)),
4117
4177
  table_cache_(table_cache),
4118
4178
  env_(_db_options->env),
4119
4179
  fs_(_db_options->fs, io_tracer),
@@ -4155,9 +4215,13 @@ void VersionSet::Reset() {
4155
4215
  if (column_family_set_) {
4156
4216
  WriteBufferManager* wbm = column_family_set_->write_buffer_manager();
4157
4217
  WriteController* wc = column_family_set_->write_controller();
4218
+ // db_id becomes the source of truth after DBImpl::Recover():
4219
+ // https://github.com/facebook/rocksdb/blob/v7.3.1/db/db_impl/db_impl_open.cc#L527
4220
+ // Note: we may not be able to recover db_id from MANIFEST if
4221
+ // options.write_dbid_to_manifest is false (default).
4158
4222
  column_family_set_.reset(new ColumnFamilySet(
4159
4223
  dbname_, db_options_, file_options_, table_cache_, wbm, wc,
4160
- block_cache_tracer_, io_tracer_, db_session_id_));
4224
+ block_cache_tracer_, io_tracer_, db_id_, db_session_id_));
4161
4225
  }
4162
4226
  db_id_.clear();
4163
4227
  next_file_number_.store(2);
@@ -5210,6 +5274,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
5210
5274
  WriteBufferManager wb(options->db_write_buffer_size);
5211
5275
  VersionSet versions(dbname, &db_options, file_options, tc.get(), &wb, &wc,
5212
5276
  nullptr /*BlockCacheTracer*/, nullptr /*IOTracer*/,
5277
+ /*db_id*/ "",
5213
5278
  /*db_session_id*/ "");
5214
5279
  Status status;
5215
5280
 
@@ -5281,6 +5346,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
5281
5346
  delete[] vstorage -> files_;
5282
5347
  vstorage->files_ = new_files_list;
5283
5348
  vstorage->num_levels_ = new_levels;
5349
+ vstorage->ResizeCompactCursors(new_levels);
5284
5350
 
5285
5351
  MutableCFOptions mutable_cf_options(*options);
5286
5352
  VersionEdit ve;
@@ -5516,6 +5582,8 @@ Status VersionSet::WriteCurrentStateToManifest(
5516
5582
  }
5517
5583
  }
5518
5584
 
5585
+ edit.SetCompactCursors(vstorage->GetCompactCursors());
5586
+
5519
5587
  const auto& blob_files = vstorage->GetBlobFiles();
5520
5588
  for (const auto& meta : blob_files) {
5521
5589
  assert(meta);
@@ -6143,7 +6211,7 @@ ReactiveVersionSet::ReactiveVersionSet(
6143
6211
  const std::shared_ptr<IOTracer>& io_tracer)
6144
6212
  : VersionSet(dbname, _db_options, _file_options, table_cache,
6145
6213
  write_buffer_manager, write_controller,
6146
- /*block_cache_tracer=*/nullptr, io_tracer,
6214
+ /*block_cache_tracer=*/nullptr, io_tracer, /*db_id*/ "",
6147
6215
  /*db_session_id*/ "") {}
6148
6216
 
6149
6217
  ReactiveVersionSet::~ReactiveVersionSet() {}
@@ -130,6 +130,36 @@ class VersionStorageInfo {
130
130
 
131
131
  void AddFile(int level, FileMetaData* f);
132
132
 
133
+ // Resize/Initialize the space for compact_cursor_
134
+ void ResizeCompactCursors(int level) {
135
+ compact_cursor_.resize(level, InternalKey());
136
+ }
137
+
138
+ const std::vector<InternalKey>& GetCompactCursors() const {
139
+ return compact_cursor_;
140
+ }
141
+
142
+ // REQUIRES: ResizeCompactCursors has been called
143
+ void AddCursorForOneLevel(int level,
144
+ const InternalKey& smallest_uncompacted_key) {
145
+ compact_cursor_[level] = smallest_uncompacted_key;
146
+ }
147
+
148
+ // REQUIRES: lock is held
149
+ // Update the compact cursor and advance the file index so that it can point
150
+ // to the next cursor
151
+ const InternalKey& GetNextCompactCursor(int level) {
152
+ int cmp_idx = next_file_to_compact_by_size_[level] + 1;
153
+ // TODO(zichen): may need to update next_file_to_compact_by_size_
154
+ // for parallel compaction.
155
+ InternalKey new_cursor;
156
+ if (cmp_idx >= (int)files_by_compaction_pri_[level].size()) {
157
+ cmp_idx = 0;
158
+ }
159
+ // TODO(zichen): rethink if this strategy gives us some good guarantee
160
+ return files_[level][files_by_compaction_pri_[level][cmp_idx]]->smallest;
161
+ }
162
+
133
163
  void ReserveBlob(size_t size) { blob_files_.reserve(size); }
134
164
 
135
165
  void AddBlobFile(std::shared_ptr<BlobFileMetaData> blob_file_meta);
@@ -657,6 +687,9 @@ class VersionStorageInfo {
657
687
  int l0_delay_trigger_count_ = 0; // Count used to trigger slow down and stop
658
688
  // for number of L0 files.
659
689
 
690
+ // Compact cursors for round-robin compactions in each level
691
+ std::vector<InternalKey> compact_cursor_;
692
+
660
693
  // the following are the sampled temporary stats.
661
694
  // the current accumulated size of sampled files.
662
695
  uint64_t accumulated_file_size_;
@@ -958,13 +991,13 @@ class Version {
958
991
  int hit_file_level, bool is_hit_file_last_in_level, FdWithKeyRange* f,
959
992
  std::unordered_map<uint64_t, BlobReadRequests>& blob_rqs,
960
993
  uint64_t& num_filter_read, uint64_t& num_index_read,
961
- uint64_t& num_data_read, uint64_t& num_sst_read);
994
+ uint64_t& num_sst_read);
962
995
 
963
996
  ColumnFamilyData* cfd_; // ColumnFamilyData to which this Version belongs
964
997
  Logger* info_log_;
965
998
  Statistics* db_statistics_;
966
999
  TableCache* table_cache_;
967
- BlobFileCache* blob_file_cache_;
1000
+ BlobSource* blob_source_;
968
1001
  const MergeOperator* merge_operator_;
969
1002
 
970
1003
  VersionStorageInfo storage_info_;
@@ -1025,7 +1058,7 @@ class VersionSet {
1025
1058
  WriteController* write_controller,
1026
1059
  BlockCacheTracer* const block_cache_tracer,
1027
1060
  const std::shared_ptr<IOTracer>& io_tracer,
1028
- const std::string& db_session_id);
1061
+ const std::string& db_id, const std::string& db_session_id);
1029
1062
  // No copying allowed
1030
1063
  VersionSet(const VersionSet&) = delete;
1031
1064
  void operator=(const VersionSet&) = delete;
@@ -15,8 +15,7 @@ DEFINE_SYNC_AND_ASYNC(Status, Version::MultiGetFromSST)
15
15
  (const ReadOptions& read_options, MultiGetRange file_range, int hit_file_level,
16
16
  bool is_hit_file_last_in_level, FdWithKeyRange* f,
17
17
  std::unordered_map<uint64_t, BlobReadRequests>& blob_rqs,
18
- uint64_t& num_filter_read, uint64_t& num_index_read, uint64_t& num_data_read,
19
- uint64_t& num_sst_read) {
18
+ uint64_t& num_filter_read, uint64_t& num_index_read, uint64_t& num_sst_read) {
20
19
  bool timer_enabled = GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex &&
21
20
  get_perf_context()->per_level_perf_context_enabled;
22
21
 
@@ -63,12 +62,10 @@ DEFINE_SYNC_AND_ASYNC(Status, Version::MultiGetFromSST)
63
62
  batch_size++;
64
63
  num_index_read += get_context.get_context_stats_.num_index_read;
65
64
  num_filter_read += get_context.get_context_stats_.num_filter_read;
66
- num_data_read += get_context.get_context_stats_.num_data_read;
67
65
  num_sst_read += get_context.get_context_stats_.num_sst_read;
68
66
  // Reset these stats since they're specific to a level
69
67
  get_context.get_context_stats_.num_index_read = 0;
70
68
  get_context.get_context_stats_.num_filter_read = 0;
71
- get_context.get_context_stats_.num_data_read = 0;
72
69
  get_context.get_context_stats_.num_sst_read = 0;
73
70
 
74
71
  // report the counters before returning
@@ -1146,7 +1146,7 @@ class VersionSetTestBase {
1146
1146
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1147
1147
  &write_buffer_manager_, &write_controller_,
1148
1148
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1149
- /*db_session_id*/ ""));
1149
+ /*db_id*/ "", /*db_session_id*/ ""));
1150
1150
  reactive_versions_ = std::make_shared<ReactiveVersionSet>(
1151
1151
  dbname_, &db_options_, env_options_, table_cache_.get(),
1152
1152
  &write_buffer_manager_, &write_controller_, nullptr);
@@ -1250,7 +1250,7 @@ class VersionSetTestBase {
1250
1250
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1251
1251
  &write_buffer_manager_, &write_controller_,
1252
1252
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1253
- /*db_session_id*/ ""));
1253
+ /*db_id*/ "", /*db_session_id*/ ""));
1254
1254
  EXPECT_OK(versions_->Recover(column_families_, false));
1255
1255
  }
1256
1256
 
@@ -1756,7 +1756,7 @@ TEST_F(VersionSetTest, WalAddition) {
1756
1756
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1757
1757
  &write_buffer_manager_, &write_controller_,
1758
1758
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1759
- /*db_session_id*/ ""));
1759
+ /*db_id*/ "", /*db_session_id*/ ""));
1760
1760
  ASSERT_OK(new_versions->Recover(column_families_, /*read_only=*/false));
1761
1761
  const auto& wals = new_versions->GetWalSet().GetWals();
1762
1762
  ASSERT_EQ(wals.size(), 1);
@@ -1823,7 +1823,7 @@ TEST_F(VersionSetTest, WalCloseWithoutSync) {
1823
1823
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1824
1824
  &write_buffer_manager_, &write_controller_,
1825
1825
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1826
- /*db_session_id*/ ""));
1826
+ /*db_id*/ "", /*db_session_id*/ ""));
1827
1827
  ASSERT_OK(new_versions->Recover(column_families_, false));
1828
1828
  const auto& wals = new_versions->GetWalSet().GetWals();
1829
1829
  ASSERT_EQ(wals.size(), 2);
@@ -1876,7 +1876,7 @@ TEST_F(VersionSetTest, WalDeletion) {
1876
1876
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1877
1877
  &write_buffer_manager_, &write_controller_,
1878
1878
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1879
- /*db_session_id*/ ""));
1879
+ /*db_id*/ "", /*db_session_id*/ ""));
1880
1880
  ASSERT_OK(new_versions->Recover(column_families_, false));
1881
1881
  const auto& wals = new_versions->GetWalSet().GetWals();
1882
1882
  ASSERT_EQ(wals.size(), 1);
@@ -1914,7 +1914,7 @@ TEST_F(VersionSetTest, WalDeletion) {
1914
1914
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
1915
1915
  &write_buffer_manager_, &write_controller_,
1916
1916
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
1917
- /*db_session_id*/ ""));
1917
+ /*db_id*/ "", /*db_session_id*/ ""));
1918
1918
  ASSERT_OK(new_versions->Recover(column_families_, false));
1919
1919
  const auto& wals = new_versions->GetWalSet().GetWals();
1920
1920
  ASSERT_EQ(wals.size(), 1);
@@ -2032,7 +2032,7 @@ TEST_F(VersionSetTest, DeleteWalsBeforeNonExistingWalNumber) {
2032
2032
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
2033
2033
  &write_buffer_manager_, &write_controller_,
2034
2034
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
2035
- /*db_session_id*/ ""));
2035
+ /*db_id*/ "", /*db_session_id*/ ""));
2036
2036
  ASSERT_OK(new_versions->Recover(column_families_, false));
2037
2037
  const auto& wals = new_versions->GetWalSet().GetWals();
2038
2038
  ASSERT_EQ(wals.size(), 1);
@@ -2068,7 +2068,7 @@ TEST_F(VersionSetTest, DeleteAllWals) {
2068
2068
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
2069
2069
  &write_buffer_manager_, &write_controller_,
2070
2070
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
2071
- /*db_session_id*/ ""));
2071
+ /*db_id*/ "", /*db_session_id*/ ""));
2072
2072
  ASSERT_OK(new_versions->Recover(column_families_, false));
2073
2073
  const auto& wals = new_versions->GetWalSet().GetWals();
2074
2074
  ASSERT_EQ(wals.size(), 0);
@@ -2110,7 +2110,7 @@ TEST_F(VersionSetTest, AtomicGroupWithWalEdits) {
2110
2110
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
2111
2111
  &write_buffer_manager_, &write_controller_,
2112
2112
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
2113
- /*db_session_id*/ ""));
2113
+ /*db_id*/ "", /*db_session_id*/ ""));
2114
2114
  std::string db_id;
2115
2115
  ASSERT_OK(
2116
2116
  new_versions->Recover(column_families_, /*read_only=*/false, &db_id));
@@ -2164,7 +2164,7 @@ class VersionSetWithTimestampTest : public VersionSetTest {
2164
2164
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
2165
2165
  &write_buffer_manager_, &write_controller_,
2166
2166
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
2167
- /*db_session_id*/ ""));
2167
+ /*db_id*/ "", /*db_session_id*/ ""));
2168
2168
  ASSERT_OK(vset->Recover(column_families_, /*read_only=*/false,
2169
2169
  /*db_id=*/nullptr));
2170
2170
  for (auto* cfd : *(vset->GetColumnFamilySet())) {
@@ -25,7 +25,7 @@ class OfflineManifestWriter {
25
25
  options.table_cache_numshardbits)),
26
26
  versions_(db_path, &immutable_db_options_, sopt_, tc_.get(), &wb_, &wc_,
27
27
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
28
- /*db_session_id*/ "") {}
28
+ /*db_id*/ "", /*db_session_id*/ "") {}
29
29
 
30
30
  Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families) {
31
31
  return versions_.Recover(column_families);
@@ -54,7 +54,7 @@ class WalManagerTest : public testing::Test {
54
54
  new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
55
55
  &write_buffer_manager_, &write_controller_,
56
56
  /*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
57
- /*db_session_id*/ ""));
57
+ /*db_id*/ "", /*db_session_id*/ ""));
58
58
 
59
59
  wal_manager_.reset(
60
60
  new WalManager(db_options_, env_options_, nullptr /*IOTracer*/));
@@ -2844,16 +2844,10 @@ class ProtectionInfoUpdater : public WriteBatch::Handler {
2844
2844
 
2845
2845
  Status WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
2846
2846
  assert(contents.size() >= WriteBatchInternal::kHeader);
2847
+ assert(b->prot_info_ == nullptr);
2847
2848
 
2848
2849
  b->rep_.assign(contents.data(), contents.size());
2849
2850
  b->content_flags_.store(ContentFlags::DEFERRED, std::memory_order_relaxed);
2850
-
2851
- // If we have a prot_info_, update protection info entries for the batch.
2852
- if (b->prot_info_) {
2853
- ProtectionInfoUpdater prot_info_updater(b->prot_info_.get());
2854
- return b->Iterate(&prot_info_updater);
2855
- }
2856
-
2857
2851
  return Status::OK();
2858
2852
  }
2859
2853
 
@@ -2885,12 +2879,18 @@ Status WriteBatchInternal::Append(WriteBatch* dst, const WriteBatch* src,
2885
2879
  src_flags = src->content_flags_.load(std::memory_order_relaxed);
2886
2880
  }
2887
2881
 
2888
- if (dst->prot_info_ != nullptr) {
2882
+ if (src->prot_info_ != nullptr) {
2883
+ if (dst->prot_info_ == nullptr) {
2884
+ dst->prot_info_.reset(new WriteBatch::ProtectionInfo());
2885
+ }
2889
2886
  std::copy(src->prot_info_->entries_.begin(),
2890
2887
  src->prot_info_->entries_.begin() + src_count,
2891
2888
  std::back_inserter(dst->prot_info_->entries_));
2892
- } else if (src->prot_info_ != nullptr) {
2893
- dst->prot_info_.reset(new WriteBatch::ProtectionInfo(*src->prot_info_));
2889
+ } else if (dst->prot_info_ != nullptr) {
2890
+ // dst has empty prot_info->entries
2891
+ // In this special case, we allow write batch without prot_info to
2892
+ // be appende to write batch with empty prot_info
2893
+ dst->prot_info_ = nullptr;
2894
2894
  }
2895
2895
  SetCount(dst, Count(dst) + src_count);
2896
2896
  assert(src->rep_.size() >= WriteBatchInternal::kHeader);
@@ -2910,4 +2910,28 @@ size_t WriteBatchInternal::AppendedByteSize(size_t leftByteSize,
2910
2910
  }
2911
2911
  }
2912
2912
 
2913
+ Status WriteBatchInternal::UpdateProtectionInfo(WriteBatch* wb,
2914
+ size_t bytes_per_key) {
2915
+ if (bytes_per_key == 0) {
2916
+ if (wb->prot_info_ != nullptr) {
2917
+ wb->prot_info_.reset();
2918
+ return Status::OK();
2919
+ } else {
2920
+ // Already not protected.
2921
+ return Status::OK();
2922
+ }
2923
+ } else if (bytes_per_key == 8) {
2924
+ if (wb->prot_info_ == nullptr) {
2925
+ wb->prot_info_.reset(new WriteBatch::ProtectionInfo());
2926
+ ProtectionInfoUpdater prot_info_updater(wb->prot_info_.get());
2927
+ return wb->Iterate(&prot_info_updater);
2928
+ } else {
2929
+ // Already protected.
2930
+ return Status::OK();
2931
+ }
2932
+ }
2933
+ return Status::NotSupported(
2934
+ "WriteBatch protection info must be zero or eight bytes/key");
2935
+ }
2936
+
2913
2937
  } // namespace ROCKSDB_NAMESPACE
@@ -236,6 +236,8 @@ class WriteBatchInternal {
236
236
  static bool HasKeyWithTimestamp(const WriteBatch& wb) {
237
237
  return wb.has_key_with_ts_;
238
238
  }
239
+
240
+ static Status UpdateProtectionInfo(WriteBatch* wb, size_t bytes_per_key);
239
241
  };
240
242
 
241
243
  // LocalSavePoint is similar to a scope guard
@@ -307,6 +307,10 @@ TEST_P(WriteCallbackPTest, WriteWithCallbackTest) {
307
307
  WriteOptions woptions;
308
308
  woptions.disableWAL = !enable_WAL_;
309
309
  woptions.sync = enable_WAL_;
310
+ if (woptions.protection_bytes_per_key > 0) {
311
+ ASSERT_OK(WriteBatchInternal::UpdateProtectionInfo(
312
+ &write_op.write_batch_, woptions.protection_bytes_per_key));
313
+ }
310
314
  Status s;
311
315
  if (seq_per_batch_) {
312
316
  class PublishSeqCallback : public PreReleaseCallback {