@nxtedition/rocksdb 10.1.5 → 10.1.6

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 (254) hide show
  1. package/binding.cc +5 -7
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
  3. package/deps/rocksdb/rocksdb/Makefile +38 -15
  4. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
  9. package/deps/rocksdb/rocksdb/db/builder.h +1 -1
  10. package/deps/rocksdb/rocksdb/db/c.cc +205 -6
  11. package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
  12. package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
  14. package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
  26. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
  27. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
  28. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
  29. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
  30. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
  38. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
  39. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
  40. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  44. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
  45. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
  46. package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
  47. package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
  48. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
  50. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
  51. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
  52. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
  53. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
  55. package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
  56. package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
  57. package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
  58. package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
  59. package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
  60. package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
  61. package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
  62. package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
  64. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
  65. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
  68. package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
  69. package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
  70. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
  71. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
  72. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
  73. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
  74. package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
  75. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
  76. package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
  77. package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
  78. package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
  79. package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
  80. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
  82. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
  83. package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
  84. package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
  85. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  86. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
  90. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
  91. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
  95. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
  96. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
  97. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
  98. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
  99. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
  100. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
  101. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
  102. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
  103. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
  104. package/deps/rocksdb/rocksdb/env/env.cc +6 -0
  105. package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
  106. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  107. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
  108. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
  109. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
  110. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
  111. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
  113. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
  115. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
  119. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
  122. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
  128. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  129. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
  130. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  131. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  132. package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
  133. package/deps/rocksdb/rocksdb/options/options.cc +3 -0
  134. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  136. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
  137. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
  138. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  139. package/deps/rocksdb/rocksdb/src.mk +4 -0
  140. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
  147. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
  149. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
  150. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
  151. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
  152. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
  153. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
  154. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
  155. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
  156. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
  157. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
  158. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
  160. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
  161. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
  163. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
  165. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
  166. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
  167. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
  168. package/deps/rocksdb/rocksdb/table/format.cc +1 -2
  169. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
  170. package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
  171. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
  172. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
  173. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
  174. package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
  175. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  176. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
  177. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
  178. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
  179. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
  180. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
  181. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
  182. package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
  183. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  184. package/deps/rocksdb/rocksdb/util/random.cc +2 -1
  185. package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
  186. package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
  187. package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
  188. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
  189. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
  191. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
  192. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
  193. package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
  194. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
  195. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
  196. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
  197. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
  198. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
  199. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
  200. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
  202. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
  203. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  204. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
  205. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
  206. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
  207. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
  208. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
  209. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
  210. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
  211. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
  212. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
  213. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
  214. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
  215. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
  216. package/package.json +1 -1
  217. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  218. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  219. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  220. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  221. package/.tap/test-results/test/batch-test.js.tap +0 -12
  222. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  223. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  224. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  225. package/.tap/test-results/test/column-test.js.tap +0 -55
  226. package/.tap/test-results/test/common.js.tap +0 -0
  227. package/.tap/test-results/test/compression-test.js.tap +0 -30
  228. package/.tap/test-results/test/db-identity.js.tap +0 -12
  229. package/.tap/test-results/test/electron.js.tap +0 -0
  230. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  231. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  232. package/.tap/test-results/test/gc.js.tap +0 -0
  233. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  234. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  235. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  236. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  237. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  238. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  239. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  240. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  241. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  242. package/.tap/test-results/test/lock-test.js.tap +0 -18
  243. package/.tap/test-results/test/lock.js.tap +0 -0
  244. package/.tap/test-results/test/make.js.tap +0 -0
  245. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  246. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  247. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  248. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  249. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  250. package/deps/rocksdb/rocksdb/README.md +0 -29
  251. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  252. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  253. package/deps/rocksdb/rocksdb/port/README +0 -10
  254. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -231,6 +231,7 @@ struct rocksdb_livefiles_t {
231
231
  };
232
232
  struct rocksdb_column_family_handle_t {
233
233
  ColumnFamilyHandle* rep;
234
+ bool immortal; /* only true for default cf */
234
235
  };
235
236
  struct rocksdb_column_family_metadata_t {
236
237
  ColumnFamilyMetaData rep;
@@ -531,6 +532,42 @@ struct rocksdb_universal_compaction_options_t {
531
532
  ROCKSDB_NAMESPACE::CompactionOptionsUniversal* rep;
532
533
  };
533
534
 
535
+ struct rocksdb_callback_logger_t : public Logger {
536
+ static const ssize_t STACK_BUFSZ = 512;
537
+ rocksdb_callback_logger_t(InfoLogLevel log_level,
538
+ void (*logv_cb)(void*, unsigned, char*, size_t),
539
+ void* priv)
540
+ : Logger(log_level), logv_cb_(logv_cb), priv_(priv) {}
541
+
542
+ using Logger::Logv;
543
+ void Logv(const InfoLogLevel level, const char* fmt, va_list ap0) override {
544
+ char stack_buf[STACK_BUFSZ];
545
+ char* alloc_buf = nullptr;
546
+ char* buf = stack_buf;
547
+ int len = 0;
548
+ va_list ap1;
549
+ if (!logv_cb_) return;
550
+ va_copy(ap1, ap0);
551
+ len = vsnprintf(buf, STACK_BUFSZ, fmt, ap0);
552
+ if (len <= 0)
553
+ goto cleanup;
554
+ else if (len >= STACK_BUFSZ) {
555
+ buf = alloc_buf = reinterpret_cast<char*>(malloc(len + 1));
556
+ if (!buf) goto cleanup;
557
+ len = vsnprintf(buf, len + 1, fmt, ap1);
558
+ if (len <= 0) goto cleanup;
559
+ }
560
+ logv_cb_(priv_, unsigned(level), buf, size_t(len));
561
+ cleanup:
562
+ va_end(ap1);
563
+ free(alloc_buf);
564
+ }
565
+
566
+ private:
567
+ void (*logv_cb_)(void*, unsigned, char*, size_t) = nullptr;
568
+ void* priv_ = nullptr;
569
+ };
570
+
534
571
  static bool SaveError(char** errptr, const Status& s) {
535
572
  assert(errptr != nullptr);
536
573
  if (s.ok()) {
@@ -546,6 +583,7 @@ static bool SaveError(char** errptr, const Status& s) {
546
583
  return true;
547
584
  }
548
585
 
586
+ // Copies str to a new malloc()-ed buffer. The buffer is not NUL terminated.
549
587
  static char* CopyString(const std::string& str) {
550
588
  char* result = reinterpret_cast<char*>(malloc(sizeof(char) * str.size()));
551
589
  memcpy(result, str.data(), sizeof(char) * str.size());
@@ -906,6 +944,7 @@ rocksdb_t* rocksdb_open_and_trim_history(
906
944
  rocksdb_column_family_handle_t* c_handle =
907
945
  new rocksdb_column_family_handle_t;
908
946
  c_handle->rep = handles[i];
947
+ c_handle->immortal = false;
909
948
  column_family_handles[i] = c_handle;
910
949
  }
911
950
  rocksdb_t* result = new rocksdb_t;
@@ -936,6 +975,7 @@ rocksdb_t* rocksdb_open_column_families(
936
975
  rocksdb_column_family_handle_t* c_handle =
937
976
  new rocksdb_column_family_handle_t;
938
977
  c_handle->rep = handles[i];
978
+ c_handle->immortal = false;
939
979
  column_family_handles[i] = c_handle;
940
980
  }
941
981
  rocksdb_t* result = new rocksdb_t;
@@ -971,6 +1011,7 @@ rocksdb_t* rocksdb_open_column_families_with_ttl(
971
1011
  rocksdb_column_family_handle_t* c_handle =
972
1012
  new rocksdb_column_family_handle_t;
973
1013
  c_handle->rep = handles[i];
1014
+ c_handle->immortal = false;
974
1015
  column_family_handles[i] = c_handle;
975
1016
  }
976
1017
  rocksdb_t* result = new rocksdb_t;
@@ -1004,6 +1045,7 @@ rocksdb_t* rocksdb_open_for_read_only_column_families(
1004
1045
  rocksdb_column_family_handle_t* c_handle =
1005
1046
  new rocksdb_column_family_handle_t;
1006
1047
  c_handle->rep = handles[i];
1048
+ c_handle->immortal = false;
1007
1049
  column_family_handles[i] = c_handle;
1008
1050
  }
1009
1051
  rocksdb_t* result = new rocksdb_t;
@@ -1035,6 +1077,7 @@ rocksdb_t* rocksdb_open_as_secondary_column_families(
1035
1077
  rocksdb_column_family_handle_t* c_handle =
1036
1078
  new rocksdb_column_family_handle_t;
1037
1079
  c_handle->rep = handles[i];
1080
+ c_handle->immortal = false;
1038
1081
  column_family_handles[i] = c_handle;
1039
1082
  }
1040
1083
  rocksdb_t* result = new rocksdb_t;
@@ -1072,6 +1115,7 @@ rocksdb_column_family_handle_t* rocksdb_create_column_family(
1072
1115
  SaveError(errptr, db->rep->CreateColumnFamily(
1073
1116
  ColumnFamilyOptions(column_family_options->rep),
1074
1117
  std::string(column_family_name), &(handle->rep)));
1118
+ handle->immortal = false;
1075
1119
  return handle;
1076
1120
  }
1077
1121
 
@@ -1095,6 +1139,7 @@ rocksdb_column_family_handle_t** rocksdb_create_column_families(
1095
1139
  for (size_t i = 0; i != handles.size(); ++i) {
1096
1140
  c_handles[i] = new rocksdb_column_family_handle_t;
1097
1141
  c_handles[i]->rep = handles[i];
1142
+ c_handles[i]->immortal = false;
1098
1143
  }
1099
1144
 
1100
1145
  return c_handles;
@@ -1114,6 +1159,7 @@ rocksdb_column_family_handle_t* rocksdb_create_column_family_with_ttl(
1114
1159
  SaveError(errptr, db_with_ttl->CreateColumnFamilyWithTtl(
1115
1160
  ColumnFamilyOptions(column_family_options->rep),
1116
1161
  std::string(column_family_name), &(handle->rep), ttl));
1162
+ handle->immortal = false;
1117
1163
  return handle;
1118
1164
  }
1119
1165
 
@@ -1135,9 +1181,19 @@ char* rocksdb_column_family_handle_get_name(
1135
1181
  return CopyString(name);
1136
1182
  }
1137
1183
 
1184
+ rocksdb_column_family_handle_t* rocksdb_get_default_column_family_handle(
1185
+ rocksdb_t* db) {
1186
+ rocksdb_column_family_handle_t* handle = new rocksdb_column_family_handle_t;
1187
+ handle->rep = db->rep->DefaultColumnFamily();
1188
+ handle->immortal = true;
1189
+ return handle;
1190
+ }
1191
+
1138
1192
  void rocksdb_column_family_handle_destroy(
1139
1193
  rocksdb_column_family_handle_t* handle) {
1140
- delete handle->rep;
1194
+ if (!handle->immortal) {
1195
+ delete handle->rep;
1196
+ }
1141
1197
  delete handle;
1142
1198
  }
1143
1199
 
@@ -1373,6 +1429,18 @@ char* rocksdb_get_cf_with_ts(rocksdb_t* db,
1373
1429
  return result;
1374
1430
  }
1375
1431
 
1432
+ char* rocksdb_get_db_identity(rocksdb_t* db, size_t* id_len) {
1433
+ std::string identity_tmp;
1434
+ Status s = db->rep->GetDbIdentity(identity_tmp);
1435
+ if (!s.ok()) {
1436
+ *id_len = 0;
1437
+ return nullptr;
1438
+ }
1439
+
1440
+ *id_len = identity_tmp.size();
1441
+ return CopyString(identity_tmp);
1442
+ }
1443
+
1376
1444
  void rocksdb_multi_get(rocksdb_t* db, const rocksdb_readoptions_t* options,
1377
1445
  size_t num_keys, const char* const* keys_list,
1378
1446
  const size_t* keys_list_sizes, char** values_list,
@@ -1770,6 +1838,26 @@ void rocksdb_approximate_sizes_cf(
1770
1838
  delete[] ranges;
1771
1839
  }
1772
1840
 
1841
+ extern ROCKSDB_LIBRARY_API void rocksdb_approximate_sizes_cf_with_flags(
1842
+ rocksdb_t* db, rocksdb_column_family_handle_t* column_family,
1843
+ int num_ranges, const char* const* range_start_key,
1844
+ const size_t* range_start_key_len, const char* const* range_limit_key,
1845
+ const size_t* range_limit_key_len, uint8_t include_flags, uint64_t* sizes,
1846
+ char** errptr) {
1847
+ Range* ranges = new Range[num_ranges];
1848
+ for (int i = 0; i < num_ranges; i++) {
1849
+ ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]);
1850
+ ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]);
1851
+ }
1852
+ Status s = db->rep->GetApproximateSizes(
1853
+ column_family->rep, ranges, num_ranges, sizes,
1854
+ static_cast<DB::SizeApproximationFlags>(include_flags));
1855
+ if (!s.ok()) {
1856
+ SaveError(errptr, s);
1857
+ }
1858
+ delete[] ranges;
1859
+ }
1860
+
1773
1861
  void rocksdb_delete_file(rocksdb_t* db, const char* name) {
1774
1862
  db->rep->DeleteFile(name);
1775
1863
  }
@@ -1947,6 +2035,10 @@ void rocksdb_iter_get_error(const rocksdb_iterator_t* iter, char** errptr) {
1947
2035
  SaveError(errptr, iter->rep->status());
1948
2036
  }
1949
2037
 
2038
+ void rocksdb_iter_refresh(const rocksdb_iterator_t* iter, char** errptr) {
2039
+ SaveError(errptr, iter->rep->Refresh());
2040
+ }
2041
+
1950
2042
  rocksdb_writebatch_t* rocksdb_writebatch_create() {
1951
2043
  return new rocksdb_writebatch_t;
1952
2044
  }
@@ -1958,6 +2050,15 @@ rocksdb_writebatch_t* rocksdb_writebatch_create_from(const char* rep,
1958
2050
  return b;
1959
2051
  }
1960
2052
 
2053
+ rocksdb_writebatch_t* rocksdb_writebatch_create_with_params(
2054
+ size_t reserved_bytes, size_t max_bytes, size_t protection_bytes_per_key,
2055
+ size_t default_cf_ts_sz) {
2056
+ rocksdb_writebatch_t* b = new rocksdb_writebatch_t;
2057
+ b->rep = WriteBatch(reserved_bytes, max_bytes, protection_bytes_per_key,
2058
+ default_cf_ts_sz);
2059
+ return b;
2060
+ }
2061
+
1961
2062
  void rocksdb_writebatch_destroy(rocksdb_writebatch_t* b) { delete b; }
1962
2063
 
1963
2064
  void rocksdb_writebatch_clear(rocksdb_writebatch_t* b) { b->rep.Clear(); }
@@ -2185,6 +2286,32 @@ class H : public WriteBatch::Handler {
2185
2286
  }
2186
2287
  };
2187
2288
 
2289
+ class HCF : public WriteBatch::Handler {
2290
+ public:
2291
+ void* state_;
2292
+ void (*put_cf_)(void*, uint32_t cfid, const char* k, size_t klen,
2293
+ const char* v, size_t vlen);
2294
+ void (*deleted_cf_)(void*, uint32_t cfid, const char* k, size_t klen);
2295
+ void (*merge_cf_)(void*, uint32_t cfid, const char* k, size_t klen,
2296
+ const char* v, size_t vlen);
2297
+ Status PutCF(uint32_t column_family_id, const Slice& key,
2298
+ const Slice& value) override {
2299
+ (*put_cf_)(state_, column_family_id, key.data(), key.size(), value.data(),
2300
+ value.size());
2301
+ return Status::OK();
2302
+ }
2303
+ Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
2304
+ (*deleted_cf_)(state_, column_family_id, key.data(), key.size());
2305
+ return Status::OK();
2306
+ }
2307
+ Status MergeCF(uint32_t column_family_id, const Slice& key,
2308
+ const Slice& value) override {
2309
+ (*merge_cf_)(state_, column_family_id, key.data(), key.size(), value.data(),
2310
+ value.size());
2311
+ return Status::OK();
2312
+ }
2313
+ };
2314
+
2188
2315
  void rocksdb_writebatch_iterate(rocksdb_writebatch_t* b, void* state,
2189
2316
  void (*put)(void*, const char* k, size_t klen,
2190
2317
  const char* v, size_t vlen),
@@ -2197,6 +2324,21 @@ void rocksdb_writebatch_iterate(rocksdb_writebatch_t* b, void* state,
2197
2324
  b->rep.Iterate(&handler);
2198
2325
  }
2199
2326
 
2327
+ void rocksdb_writebatch_iterate_cf(
2328
+ rocksdb_writebatch_t* b, void* state,
2329
+ void (*put_cf)(void*, uint32_t cfid, const char* k, size_t klen,
2330
+ const char* v, size_t vlen),
2331
+ void (*deleted_cf)(void*, uint32_t cfid, const char* k, size_t klen),
2332
+ void (*merge_cf)(void*, uint32_t cfid, const char* k, size_t klen,
2333
+ const char* v, size_t vlen)) {
2334
+ HCF handler;
2335
+ handler.state_ = state;
2336
+ handler.put_cf_ = put_cf;
2337
+ handler.deleted_cf_ = deleted_cf;
2338
+ handler.merge_cf_ = merge_cf;
2339
+ b->rep.Iterate(&handler);
2340
+ }
2341
+
2200
2342
  const char* rocksdb_writebatch_data(rocksdb_writebatch_t* b, size_t* size) {
2201
2343
  *size = b->rep.GetDataSize();
2202
2344
  return b->rep.Data().c_str();
@@ -2223,6 +2365,35 @@ rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create(
2223
2365
  return b;
2224
2366
  }
2225
2367
 
2368
+ rocksdb_writebatch_wi_t* rocksdb_writebatch_wi_create_with_params(
2369
+ rocksdb_comparator_t* backup_index_comparator, size_t reserved_bytes,
2370
+ unsigned char overwrite_key, size_t max_bytes,
2371
+ size_t protection_bytes_per_key) {
2372
+ rocksdb_writebatch_wi_t* b = new rocksdb_writebatch_wi_t;
2373
+ b->rep = new WriteBatchWithIndex(backup_index_comparator, reserved_bytes,
2374
+ overwrite_key, max_bytes,
2375
+ protection_bytes_per_key);
2376
+ return b;
2377
+ }
2378
+
2379
+ void rocksdb_writebatch_update_timestamps(
2380
+ rocksdb_writebatch_t* wb, const char* ts, size_t tslen, void* state,
2381
+ size_t (*get_ts_size)(void*, uint32_t), char** errptr) {
2382
+ SaveError(errptr, wb->rep.UpdateTimestamps(
2383
+ Slice(ts, tslen), [&get_ts_size, &state](uint32_t cf) {
2384
+ return (*get_ts_size)(state, cf);
2385
+ }));
2386
+ }
2387
+
2388
+ void rocksdb_writebatch_wi_update_timestamps(
2389
+ rocksdb_writebatch_wi_t* wb, const char* ts, size_t tslen, void* state,
2390
+ size_t (*get_ts_size)(void*, uint32_t), char** errptr) {
2391
+ SaveError(errptr, wb->rep->GetWriteBatch()->UpdateTimestamps(
2392
+ Slice(ts, tslen), [&get_ts_size, &state](uint32_t cf) {
2393
+ return (*get_ts_size)(state, cf);
2394
+ }));
2395
+ }
2396
+
2226
2397
  void rocksdb_writebatch_wi_destroy(rocksdb_writebatch_wi_t* b) {
2227
2398
  if (b->rep) {
2228
2399
  delete b->rep;
@@ -2963,6 +3134,15 @@ rocksdb_logger_t* rocksdb_logger_create_stderr_logger(int log_level,
2963
3134
  return logger;
2964
3135
  }
2965
3136
 
3137
+ rocksdb_logger_t* rocksdb_logger_create_callback_logger(
3138
+ int log_level, void (*callback)(void*, unsigned, char*, size_t),
3139
+ void* priv) {
3140
+ rocksdb_logger_t* logger = new rocksdb_logger_t;
3141
+ logger->rep = std::make_shared<rocksdb_callback_logger_t>(
3142
+ static_cast<InfoLogLevel>(log_level), callback, priv);
3143
+ return logger;
3144
+ }
3145
+
2966
3146
  void rocksdb_logger_destroy(rocksdb_logger_t* logger) { delete logger; }
2967
3147
 
2968
3148
  void rocksdb_options_set_env(rocksdb_options_t* opt, rocksdb_env_t* env) {
@@ -3885,6 +4065,27 @@ void rocksdb_options_set_plain_table_factory(
3885
4065
  opt->rep.table_factory.reset(factory);
3886
4066
  }
3887
4067
 
4068
+ unsigned char rocksdb_options_get_write_dbid_to_manifest(
4069
+ rocksdb_options_t* opt) {
4070
+ return opt->rep.write_dbid_to_manifest;
4071
+ }
4072
+
4073
+ void rocksdb_options_set_write_dbid_to_manifest(
4074
+ rocksdb_options_t* opt, unsigned char write_dbid_to_manifest) {
4075
+ opt->rep.write_dbid_to_manifest = write_dbid_to_manifest;
4076
+ }
4077
+
4078
+ unsigned char rocksdb_options_get_track_and_verify_wals_in_manifest(
4079
+ rocksdb_options_t* opt) {
4080
+ return opt->rep.track_and_verify_wals_in_manifest;
4081
+ }
4082
+
4083
+ void rocksdb_options_set_track_and_verify_wals_in_manifest(
4084
+ rocksdb_options_t* opt, unsigned char track_and_verify_wals_in_manifest) {
4085
+ opt->rep.track_and_verify_wals_in_manifest =
4086
+ track_and_verify_wals_in_manifest;
4087
+ }
4088
+
3888
4089
  void rocksdb_options_set_max_successive_merges(rocksdb_options_t* opt,
3889
4090
  size_t v) {
3890
4091
  opt->rep.max_successive_merges = v;
@@ -4264,13 +4465,8 @@ void rocksdb_perfcontext_destroy(rocksdb_perfcontext_t* context) {
4264
4465
 
4265
4466
  /*
4266
4467
  TODO:
4267
- DB::OpenForReadOnly
4268
- DB::KeyMayExist
4269
4468
  DB::GetOptions
4270
4469
  DB::GetSortedWalFiles
4271
- DB::GetLatestSequenceNumber
4272
- DB::GetUpdatesSince
4273
- DB::GetDbIdentity
4274
4470
  DB::RunManualCompaction
4275
4471
  custom cache
4276
4472
  table_properties_collectors
@@ -5747,6 +5943,7 @@ rocksdb_column_family_handle_t* rocksdb_transactiondb_create_column_family(
5747
5943
  SaveError(errptr, txn_db->rep->CreateColumnFamily(
5748
5944
  ColumnFamilyOptions(column_family_options->rep),
5749
5945
  std::string(column_family_name), &(handle->rep)));
5946
+ handle->immortal = false;
5750
5947
  return handle;
5751
5948
  }
5752
5949
 
@@ -5789,6 +5986,7 @@ rocksdb_transactiondb_t* rocksdb_transactiondb_open_column_families(
5789
5986
  rocksdb_column_family_handle_t* c_handle =
5790
5987
  new rocksdb_column_family_handle_t;
5791
5988
  c_handle->rep = handles[i];
5989
+ c_handle->immortal = false;
5792
5990
  column_family_handles[i] = c_handle;
5793
5991
  }
5794
5992
  rocksdb_transactiondb_t* result = new rocksdb_transactiondb_t;
@@ -6583,6 +6781,7 @@ rocksdb_optimistictransactiondb_open_column_families(
6583
6781
  rocksdb_column_family_handle_t* c_handle =
6584
6782
  new rocksdb_column_family_handle_t;
6585
6783
  c_handle->rep = handles[i];
6784
+ c_handle->immortal = false;
6586
6785
  column_family_handles[i] = c_handle;
6587
6786
  }
6588
6787
  rocksdb_optimistictransactiondb_t* result =
@@ -199,6 +199,79 @@ static void CheckDel(void* ptr, const char* k, size_t klen) {
199
199
  (*state)++;
200
200
  }
201
201
 
202
+ // Callback from rocksdb_writebatch_iterate_cf()
203
+ static void CheckPutCF(void* ptr, uint32_t cfid, const char* k, size_t klen,
204
+ const char* v, size_t vlen) {
205
+ int* state = (int*)ptr;
206
+ switch (*state) {
207
+ case 0:
208
+ CheckEqual("bar", k, klen);
209
+ CheckEqual("b", v, vlen);
210
+ CheckCondition(cfid == 1);
211
+ break;
212
+ case 1:
213
+ CheckEqual("box", k, klen);
214
+ CheckEqual("c", v, vlen);
215
+ CheckCondition(cfid == 1);
216
+ break;
217
+ case 4:
218
+ CheckEqual("foo", k, klen);
219
+ CheckEqual("f", v, vlen);
220
+ CheckCondition(cfid == 0);
221
+ break;
222
+ case 6:
223
+ CheckEqual("baz", k, klen);
224
+ CheckEqual("a", v, vlen);
225
+ CheckCondition(cfid == 0);
226
+ break;
227
+ default:
228
+ CheckCondition(false);
229
+ break;
230
+ }
231
+ (*state)++;
232
+ }
233
+
234
+ // Callback from rocksdb_writebatch_iterate_cf()
235
+ static void CheckDelCF(void* ptr, uint32_t cfid, const char* k, size_t klen) {
236
+ int* state = (int*)ptr;
237
+ switch (*state) {
238
+ case 2:
239
+ CheckEqual("bar", k, klen);
240
+ CheckCondition(cfid == 1);
241
+ break;
242
+ case 5:
243
+ CheckEqual("foo", k, klen);
244
+ CheckCondition(cfid == 0);
245
+ break;
246
+ default:
247
+ CheckCondition(false);
248
+ break;
249
+ }
250
+ (*state)++;
251
+ }
252
+
253
+ // Callback from rocksdb_writebatch_iterate_cf()
254
+ static void CheckMergeCF(void* ptr, uint32_t cfid, const char* k, size_t klen,
255
+ const char* v, size_t vlen) {
256
+ int* state = (int*)ptr;
257
+ switch (*state) {
258
+ case 3:
259
+ CheckEqual("box", k, klen);
260
+ CheckEqual("cc", v, vlen);
261
+ CheckCondition(cfid == 1);
262
+ break;
263
+ case 7:
264
+ CheckEqual("baz", k, klen);
265
+ CheckEqual("aa", v, vlen);
266
+ CheckCondition(cfid == 0);
267
+ break;
268
+ default:
269
+ CheckCondition(false);
270
+ break;
271
+ }
272
+ (*state)++;
273
+ }
274
+
202
275
  static void CmpDestroy(void* arg) { (void)arg; }
203
276
 
204
277
  static int CmpCompare(void* arg, const char* a, size_t alen, const char* b,
@@ -798,6 +871,11 @@ int main(int argc, char** argv) {
798
871
  rocksdb_delete(db, woptions, "foo", 3, &err);
799
872
  CheckNoError(err);
800
873
 
874
+ // get the identity before the backup
875
+ size_t before_db_id_len = 0;
876
+ char* before_db_id = rocksdb_get_db_identity(db, &before_db_id_len);
877
+ CheckCondition(before_db_id_len == 36);
878
+
801
879
  rocksdb_close(db);
802
880
 
803
881
  rocksdb_destroy_db(options, dbname, &err);
@@ -818,6 +896,14 @@ int main(int argc, char** argv) {
818
896
 
819
897
  CheckGet(db, roptions, "foo", "hello");
820
898
 
899
+ // the db_identity after the backup is different
900
+ size_t after_db_id_len = 0;
901
+ char* after_db_id = rocksdb_get_db_identity(db, &after_db_id_len);
902
+ CheckCondition(after_db_id_len == 36);
903
+ CheckCondition(memcmp(after_db_id, before_db_id, after_db_id_len) != 0);
904
+ Free(&before_db_id);
905
+ Free(&after_db_id);
906
+
821
907
  rocksdb_backup_engine_close(be);
822
908
  }
823
909
 
@@ -833,6 +919,14 @@ int main(int argc, char** argv) {
833
919
  rocksdb_checkpoint_create(checkpoint, dbcheckpointname, 0, &err);
834
920
  CheckNoError(err);
835
921
 
922
+ rocksdb_checkpoint_object_destroy(checkpoint);
923
+ checkpoint = NULL;
924
+
925
+ // get the identity before the checkpoint
926
+ size_t before_db_id_len = 0;
927
+ char* before_db_id = rocksdb_get_db_identity(db, &before_db_id_len);
928
+ CheckCondition(before_db_id_len == 36);
929
+
836
930
  // start a new database from the checkpoint
837
931
  rocksdb_close(db);
838
932
  rocksdb_options_set_error_if_exists(options, 0);
@@ -841,7 +935,13 @@ int main(int argc, char** argv) {
841
935
 
842
936
  CheckGet(db, roptions, "foo", "hello");
843
937
 
844
- rocksdb_checkpoint_object_destroy(checkpoint);
938
+ // the db_identity after the checkpoint is different
939
+ size_t after_db_id_len = 0;
940
+ char* after_db_id = rocksdb_get_db_identity(db, &after_db_id_len);
941
+ CheckCondition(after_db_id_len == 36);
942
+ CheckCondition(memcmp(after_db_id, before_db_id, after_db_id_len) != 0);
943
+ Free(&before_db_id);
944
+ Free(&after_db_id);
845
945
 
846
946
  rocksdb_close(db);
847
947
  rocksdb_destroy_db(options, dbcheckpointname, &err);
@@ -852,6 +952,73 @@ int main(int argc, char** argv) {
852
952
  rocksdb_options_set_error_if_exists(options, 1);
853
953
  }
854
954
 
955
+ StartPhase("checkpoint_db_id_in_manifest");
956
+ {
957
+ // create new DB with set_write_dbid_to_manifest=true
958
+ // db_identity is now the same across checkpoints
959
+ rocksdb_close(db);
960
+ db = NULL;
961
+
962
+ rocksdb_options_t* options_dbid_in_manifest = rocksdb_options_create();
963
+ rocksdb_options_set_create_if_missing(options_dbid_in_manifest, 1);
964
+
965
+ unsigned char write_to_manifest =
966
+ rocksdb_options_get_write_dbid_to_manifest(options_dbid_in_manifest);
967
+ CheckCondition(!write_to_manifest);
968
+ rocksdb_options_set_write_dbid_to_manifest(options_dbid_in_manifest, true);
969
+ CheckCondition(!write_to_manifest);
970
+ write_to_manifest =
971
+ rocksdb_options_get_write_dbid_to_manifest(options_dbid_in_manifest);
972
+ CheckCondition(write_to_manifest);
973
+
974
+ db = rocksdb_open(options_dbid_in_manifest, dbbackupname, &err);
975
+ CheckNoError(err);
976
+
977
+ rocksdb_checkpoint_t* checkpoint =
978
+ rocksdb_checkpoint_object_create(db, &err);
979
+ CheckNoError(err);
980
+
981
+ rocksdb_checkpoint_create(checkpoint, dbcheckpointname, 0, &err);
982
+ CheckNoError(err);
983
+
984
+ rocksdb_checkpoint_object_destroy(checkpoint);
985
+ checkpoint = NULL;
986
+
987
+ // get the identity before the backup
988
+ size_t before_db_id_len = 0;
989
+ char* before_db_id = rocksdb_get_db_identity(db, &before_db_id_len);
990
+ CheckCondition(before_db_id_len == 36);
991
+
992
+ // open the checkpoint
993
+ rocksdb_close(db);
994
+ rocksdb_destroy_db(options_dbid_in_manifest, dbbackupname, &err);
995
+ CheckNoError(err);
996
+
997
+ rocksdb_options_set_error_if_exists(options_dbid_in_manifest, 0);
998
+ db = rocksdb_open(options_dbid_in_manifest, dbcheckpointname, &err);
999
+ CheckNoError(err);
1000
+
1001
+ // the db_identity after the checkpoint is the same
1002
+ size_t after_db_id_len = 0;
1003
+ char* after_db_id = rocksdb_get_db_identity(db, &after_db_id_len);
1004
+ CheckCondition(after_db_id_len == 36);
1005
+ CheckCondition(memcmp(after_db_id, before_db_id, after_db_id_len) == 0);
1006
+ Free(&before_db_id);
1007
+ Free(&after_db_id);
1008
+
1009
+ rocksdb_close(db);
1010
+ rocksdb_destroy_db(options_dbid_in_manifest, dbcheckpointname, &err);
1011
+ CheckNoError(err);
1012
+ rocksdb_options_destroy(options_dbid_in_manifest);
1013
+ options_dbid_in_manifest = NULL;
1014
+
1015
+ // re-open the default database
1016
+ rocksdb_options_set_error_if_exists(options, 0);
1017
+ db = rocksdb_open(options, dbname, &err);
1018
+ CheckNoError(err);
1019
+ rocksdb_options_set_error_if_exists(options, 1);
1020
+ }
1021
+
855
1022
  StartPhase("compactall");
856
1023
  rocksdb_compact_range(db, NULL, 0, NULL, 0);
857
1024
  CheckGet(db, roptions, "foo", "hello");
@@ -1594,6 +1761,21 @@ int main(int argc, char** argv) {
1594
1761
  CheckPinGetCF(db, roptions, handles[1], "bar", NULL);
1595
1762
  CheckPinGetCF(db, roptions, handles[1], "box", "c");
1596
1763
  CheckPinGetCF(db, roptions, handles[1], "buff", "rocksdb");
1764
+ rocksdb_writebatch_clear(wb);
1765
+ // Test WriteBatch iteration with Column Family
1766
+ int pos = 0;
1767
+ rocksdb_writebatch_put_cf(wb, handles[1], "bar", 3, "b", 1);
1768
+ rocksdb_writebatch_put_cf(wb, handles[1], "box", 3, "c", 1);
1769
+ rocksdb_writebatch_delete_cf(wb, handles[1], "bar", 3);
1770
+ rocksdb_writebatch_merge_cf(wb, handles[1], "box", 3, "cc", 2);
1771
+ rocksdb_writebatch_put(wb, "foo", 3, "f", 1);
1772
+ rocksdb_writebatch_delete(wb, "foo", 3);
1773
+ rocksdb_writebatch_put(wb, "baz", 3, "a", 1);
1774
+ rocksdb_writebatch_merge(wb, "baz", 3, "aa", 2);
1775
+ rocksdb_writebatch_iterate_cf(wb, &pos, CheckPutCF, CheckDelCF,
1776
+ CheckMergeCF);
1777
+ CheckCondition(pos == 8);
1778
+ rocksdb_writebatch_clear(wb);
1597
1779
  rocksdb_writebatch_destroy(wb);
1598
1780
 
1599
1781
  rocksdb_flush_wal(db, 1, &err);
@@ -2140,6 +2322,12 @@ int main(int argc, char** argv) {
2140
2322
  CheckCondition(rocksdb_statistics_level_all ==
2141
2323
  rocksdb_options_get_statistics_level(o));
2142
2324
 
2325
+ CheckCondition(0 ==
2326
+ rocksdb_options_get_track_and_verify_wals_in_manifest(o));
2327
+ rocksdb_options_set_track_and_verify_wals_in_manifest(o, 42);
2328
+ CheckCondition(1 ==
2329
+ rocksdb_options_get_track_and_verify_wals_in_manifest(o));
2330
+
2143
2331
  /* Blob Options */
2144
2332
  rocksdb_options_set_enable_blob_files(o, 1);
2145
2333
  CheckCondition(1 == rocksdb_options_get_enable_blob_files(o));
@@ -538,6 +538,7 @@ ColumnFamilyData::ColumnFamilyData(
538
538
  refs_(0),
539
539
  initialized_(false),
540
540
  dropped_(false),
541
+ flush_skip_reschedule_(false),
541
542
  internal_comparator_(cf_options.comparator),
542
543
  initial_cf_options_(SanitizeOptions(db_options, cf_options)),
543
544
  ioptions_(db_options, initial_cf_options_),
@@ -1528,6 +1529,20 @@ Status ColumnFamilyData::ValidateOptions(
1528
1529
  }
1529
1530
  }
1530
1531
  }
1532
+
1533
+ if (cf_options.compaction_style == kCompactionStyleUniversal) {
1534
+ int max_read_amp = cf_options.compaction_options_universal.max_read_amp;
1535
+ if (max_read_amp < -1) {
1536
+ return Status::NotSupported(
1537
+ "CompactionOptionsUniversal::max_read_amp should be at least -1.");
1538
+ } else if (0 < max_read_amp &&
1539
+ max_read_amp < cf_options.level0_file_num_compaction_trigger) {
1540
+ return Status::NotSupported(
1541
+ "CompactionOptionsUniversal::max_read_amp limits the number of sorted"
1542
+ " runs but is smaller than the compaction trigger "
1543
+ "level0_file_num_compaction_trigger.");
1544
+ }
1545
+ }
1531
1546
  return s;
1532
1547
  }
1533
1548
 
@@ -1607,6 +1622,19 @@ FSDirectory* ColumnFamilyData::GetDataDir(size_t path_id) const {
1607
1622
  return data_dirs_[path_id].get();
1608
1623
  }
1609
1624
 
1625
+ void ColumnFamilyData::SetFlushSkipReschedule() {
1626
+ const Comparator* ucmp = user_comparator();
1627
+ const size_t ts_sz = ucmp->timestamp_size();
1628
+ if (ts_sz == 0 || ioptions_.persist_user_defined_timestamps) {
1629
+ return;
1630
+ }
1631
+ flush_skip_reschedule_.store(true);
1632
+ }
1633
+
1634
+ bool ColumnFamilyData::GetAndClearFlushSkipReschedule() {
1635
+ return flush_skip_reschedule_.exchange(false);
1636
+ }
1637
+
1610
1638
  bool ColumnFamilyData::ShouldPostponeFlushToRetainUDT(
1611
1639
  uint64_t max_memtable_id) {
1612
1640
  const Comparator* ucmp = user_comparator();