@nxtedition/rocksdb 15.1.2 → 15.1.4

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 (154) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/binding.cc +79 -38
  3. package/build.sh +1 -2
  4. package/deps/rocksdb/rocksdb/BUCK +10 -8
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +27 -2
  6. package/deps/rocksdb/rocksdb/Makefile +27 -116
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -1
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +101 -124
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.h +47 -30
  10. package/deps/rocksdb/rocksdb/db/c.cc +793 -131
  11. package/deps/rocksdb/rocksdb/db/c_test.c +571 -0
  12. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +226 -0
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +4 -0
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +95 -59
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -2
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +45 -35
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -6
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +8 -2
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +47 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -2
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +82 -0
  24. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +1 -1
  26. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +69 -24
  27. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +9 -1
  28. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +65 -0
  29. package/deps/rocksdb/rocksdb/db/db_etc3_test.cc +161 -0
  30. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +20 -7
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +13 -0
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +114 -39
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +3 -3
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +39 -25
  38. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +361 -0
  39. package/deps/rocksdb/rocksdb/db/db_options_test.cc +35 -0
  40. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +83 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +249 -4
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +2 -1
  44. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +3 -2
  45. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -7
  46. package/deps/rocksdb/rocksdb/db/listener_test.cc +7 -17
  47. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +41 -0
  49. package/deps/rocksdb/rocksdb/db/repair.cc +2 -2
  50. package/deps/rocksdb/rocksdb/db/version_edit.h +7 -4
  51. package/deps/rocksdb/rocksdb/db/version_set.cc +299 -90
  52. package/deps/rocksdb/rocksdb/db/version_set.h +56 -9
  53. package/deps/rocksdb/rocksdb/db/version_set_test.cc +41 -39
  54. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  55. package/deps/rocksdb/rocksdb/db/wal_manager.cc +7 -1
  56. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +48 -10
  57. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  58. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +16 -5
  60. package/deps/rocksdb/rocksdb/env/env_test.cc +126 -41
  61. package/deps/rocksdb/rocksdb/env/fs_posix.cc +14 -7
  62. package/deps/rocksdb/rocksdb/env/io_posix.cc +304 -112
  63. package/deps/rocksdb/rocksdb/env/io_posix.h +16 -4
  64. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  65. package/deps/rocksdb/rocksdb/folly.mk +148 -0
  66. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +29 -3
  67. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +73 -0
  68. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +246 -0
  69. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +0 -2
  70. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +15 -9
  71. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -9
  72. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  73. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -4
  74. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +14 -0
  75. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +67 -6
  76. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +1 -7
  77. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  78. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +6 -14
  79. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +8 -1
  80. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +2 -2
  81. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +0 -4
  82. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +33 -5
  83. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +6 -0
  84. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  85. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +2 -0
  86. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +5 -2
  87. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -2
  88. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +6 -6
  89. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +2 -2
  90. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +10 -5
  91. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  92. package/deps/rocksdb/rocksdb/options/cf_options.cc +15 -3
  93. package/deps/rocksdb/rocksdb/options/cf_options.h +7 -0
  94. package/deps/rocksdb/rocksdb/options/db_options.cc +27 -36
  95. package/deps/rocksdb/rocksdb/options/db_options.h +3 -2
  96. package/deps/rocksdb/rocksdb/options/options.cc +4 -0
  97. package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -2
  98. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +4 -1
  99. package/deps/rocksdb/rocksdb/options/options_test.cc +19 -3
  100. package/deps/rocksdb/rocksdb/src.mk +1 -1
  101. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +155 -32
  102. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -3
  103. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +169 -125
  104. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +22 -7
  105. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +43 -24
  106. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +9 -5
  107. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +9 -8
  108. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +17 -0
  109. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +15 -5
  110. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +13 -18
  111. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +29 -0
  112. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +6 -0
  113. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +15 -0
  114. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +79 -19
  115. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +48 -20
  116. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +51 -0
  117. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +19 -0
  118. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +1 -1
  119. package/deps/rocksdb/rocksdb/table/external_table.cc +2 -2
  120. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +3 -2
  121. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +3 -1
  122. package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
  123. package/deps/rocksdb/rocksdb/table/table_reader.h +4 -2
  124. package/deps/rocksdb/rocksdb/table/table_test.cc +48 -39
  125. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +4 -0
  126. package/deps/rocksdb/rocksdb/test_util/sync_point.h +32 -0
  127. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -2
  128. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +14 -4
  129. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
  130. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +3 -2
  131. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +63 -12
  132. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +16 -1
  133. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +5 -1
  134. package/deps/rocksdb/rocksdb/util/bit_fields.h +133 -23
  135. package/deps/rocksdb/rocksdb/util/bloom_test.cc +2 -5
  136. package/deps/rocksdb/rocksdb/util/compression.cc +51 -23
  137. package/deps/rocksdb/rocksdb/util/compression_test.cc +525 -270
  138. package/deps/rocksdb/rocksdb/util/filter_bench.cc +3 -4
  139. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +11 -2
  140. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -1
  141. package/deps/rocksdb/rocksdb/util/slice_test.cc +92 -0
  142. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -2
  143. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -2
  144. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +2 -2
  145. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +19 -2
  146. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +75 -0
  147. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +1 -0
  148. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +303 -111
  149. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +379 -0
  150. package/deps/rocksdb/rocksdb.gyp +1 -0
  151. package/iterator.js +66 -70
  152. package/package.json +6 -6
  153. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  154. package/deps/rocksdb/rocksdb/table/block_based/index_builder_test.cc +0 -183
@@ -0,0 +1,148 @@
1
+ # This file contains the vast majority of folly-related build configuration
2
+ # for the checkout_folly and build_folly targets, so that this file can be
3
+ # hashed for purposes of caching folly builds and not hitting that cache when
4
+ # something here changes.
5
+
6
+ # This provides a Makefile simulation of a Meta-internal folly integration.
7
+ # It is not validated for general use.
8
+ #
9
+ # USE_FOLLY links the build targets with libfolly.a. The latter could be
10
+ # built using 'make build_folly', or built externally and specified in
11
+ # the CXXFLAGS and EXTRA_LDFLAGS env variables. The build_detect_platform
12
+ # script tries to detect if an external folly dependency has been specified.
13
+ # If not, it exports FOLLY_PATH to the path of the installed Folly and
14
+ # dependency libraries.
15
+ #
16
+ # USE_FOLLY_LITE cherry picks source files from Folly to include in the
17
+ # RocksDB library. Its faster and has fewer dependencies on 3rd party
18
+ # libraries, but with limited functionality. For example, coroutine
19
+ # functionality is not available.
20
+ ifeq ($(USE_FOLLY),1)
21
+ ifeq ($(USE_FOLLY_LITE),1)
22
+ $(error Please specify only one of USE_FOLLY and USE_FOLLY_LITE)
23
+ endif
24
+ ifneq ($(strip $(FOLLY_PATH)),)
25
+ BOOST_PATH = $(shell (ls -d $(FOLLY_PATH)/../boost*))
26
+ DBL_CONV_PATH = $(shell (ls -d $(FOLLY_PATH)/../double-conversion*))
27
+ GFLAGS_PATH = $(shell (ls -d $(FOLLY_PATH)/../gflags*))
28
+ GLOG_PATH = $(shell (ls -d $(FOLLY_PATH)/../glog*))
29
+ LIBEVENT_PATH = $(shell (ls -d $(FOLLY_PATH)/../libevent*))
30
+ XZ_PATH = $(shell (ls -d $(FOLLY_PATH)/../xz*))
31
+ LIBSODIUM_PATH = $(shell (ls -d $(FOLLY_PATH)/../libsodium*))
32
+ FMT_PATH = $(shell (ls -d $(FOLLY_PATH)/../fmt*))
33
+
34
+ # For some reason, glog and fmt libraries are under either lib or lib64
35
+ GLOG_LIB_PATH = $(shell (ls -d $(GLOG_PATH)/lib*))
36
+ FMT_LIB_PATH = $(shell (ls -d $(FMT_PATH)/lib*))
37
+
38
+ # AIX: pre-defined system headers are surrounded by an extern "C" block
39
+ ifeq ($(PLATFORM), OS_AIX)
40
+ PLATFORM_CCFLAGS += -I$(BOOST_PATH)/include -I$(DBL_CONV_PATH)/include -I$(GLOG_PATH)/include -I$(LIBEVENT_PATH)/include -I$(XZ_PATH)/include -I$(LIBSODIUM_PATH)/include -I$(FOLLY_PATH)/include -I$(FMT_PATH)/include
41
+ PLATFORM_CXXFLAGS += -I$(BOOST_PATH)/include -I$(DBL_CONV_PATH)/include -I$(GLOG_PATH)/include -I$(LIBEVENT_PATH)/include -I$(XZ_PATH)/include -I$(LIBSODIUM_PATH)/include -I$(FOLLY_PATH)/include -I$(FMT_PATH)/include
42
+ else
43
+ PLATFORM_CCFLAGS += -isystem $(BOOST_PATH)/include -isystem $(DBL_CONV_PATH)/include -isystem $(GLOG_PATH)/include -isystem $(LIBEVENT_PATH)/include -isystem $(XZ_PATH)/include -isystem $(LIBSODIUM_PATH)/include -isystem $(FOLLY_PATH)/include -isystem $(FMT_PATH)/include
44
+ PLATFORM_CXXFLAGS += -isystem $(BOOST_PATH)/include -isystem $(DBL_CONV_PATH)/include -isystem $(GLOG_PATH)/include -isystem $(LIBEVENT_PATH)/include -isystem $(XZ_PATH)/include -isystem $(LIBSODIUM_PATH)/include -isystem $(FOLLY_PATH)/include -isystem $(FMT_PATH)/include
45
+ endif
46
+
47
+ # Add -ldl at the end as gcc resolves a symbol in a library by searching only in libraries specified later
48
+ # in the command line
49
+
50
+ PLATFORM_LDFLAGS += $(FOLLY_PATH)/lib/libfolly.a $(BOOST_PATH)/lib/libboost_context.a $(BOOST_PATH)/lib/libboost_filesystem.a $(BOOST_PATH)/lib/libboost_atomic.a $(BOOST_PATH)/lib/libboost_program_options.a $(BOOST_PATH)/lib/libboost_regex.a $(BOOST_PATH)/lib/libboost_system.a $(BOOST_PATH)/lib/libboost_thread.a $(DBL_CONV_PATH)/lib/libdouble-conversion.a $(LIBEVENT_PATH)/lib/libevent-2.1.so $(LIBSODIUM_PATH)/lib/libsodium.a -ldl
51
+ ifneq ($(DEBUG_LEVEL),0)
52
+ PLATFORM_LDFLAGS += $(FMT_LIB_PATH)/libfmtd.a $(GLOG_LIB_PATH)/libglogd.so $(GFLAGS_PATH)/lib/libgflags_debug.so.2.2
53
+ else
54
+ PLATFORM_LDFLAGS += $(FMT_LIB_PATH)/libfmt.a $(GLOG_LIB_PATH)/libglog.so $(GFLAGS_PATH)/lib/libgflags.so.2.2
55
+ endif
56
+ PLATFORM_LDFLAGS += -Wl,-rpath=$(LIBEVENT_PATH)/lib -Wl,-rpath=$(GLOG_LIB_PATH) -Wl,-rpath=$(GFLAGS_PATH)/lib
57
+ endif
58
+ PLATFORM_CCFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
59
+ PLATFORM_CXXFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
60
+ endif
61
+
62
+ ifeq ($(USE_FOLLY_LITE),1)
63
+ # Path to the Folly source code and include files
64
+ FOLLY_DIR = ./third-party/folly
65
+ ifneq ($(strip $(BOOST_SOURCE_PATH)),)
66
+ BOOST_INCLUDE = $(shell (ls -d $(BOOST_SOURCE_PATH)/boost*/))
67
+ # AIX: pre-defined system headers are surrounded by an extern "C" block
68
+ ifeq ($(PLATFORM), OS_AIX)
69
+ PLATFORM_CCFLAGS += -I$(BOOST_INCLUDE)
70
+ PLATFORM_CXXFLAGS += -I$(BOOST_INCLUDE)
71
+ else
72
+ PLATFORM_CCFLAGS += -isystem $(BOOST_INCLUDE)
73
+ PLATFORM_CXXFLAGS += -isystem $(BOOST_INCLUDE)
74
+ endif
75
+ endif # BOOST_SOURCE_PATH
76
+ ifneq ($(strip $(FMT_SOURCE_PATH)),)
77
+ FMT_INCLUDE = $(shell (ls -d $(FMT_SOURCE_PATH)/fmt*/include/))
78
+ # AIX: pre-defined system headers are surrounded by an extern "C" block
79
+ ifeq ($(PLATFORM), OS_AIX)
80
+ PLATFORM_CCFLAGS += -I$(FMT_INCLUDE)
81
+ PLATFORM_CXXFLAGS += -I$(FMT_INCLUDE)
82
+ else
83
+ PLATFORM_CCFLAGS += -isystem $(FMT_INCLUDE)
84
+ PLATFORM_CXXFLAGS += -isystem $(FMT_INCLUDE)
85
+ endif
86
+ endif # FMT_SOURCE_PATH
87
+ # AIX: pre-defined system headers are surrounded by an extern "C" block
88
+ ifeq ($(PLATFORM), OS_AIX)
89
+ PLATFORM_CCFLAGS += -I$(FOLLY_DIR)
90
+ PLATFORM_CXXFLAGS += -I$(FOLLY_DIR)
91
+ else
92
+ PLATFORM_CCFLAGS += -isystem $(FOLLY_DIR)
93
+ PLATFORM_CXXFLAGS += -isystem $(FOLLY_DIR)
94
+ endif
95
+ PLATFORM_CCFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
96
+ PLATFORM_CXXFLAGS += -DUSE_FOLLY -DFOLLY_NO_CONFIG
97
+ # TODO: fix linking with fbcode compiler config
98
+ PLATFORM_LDFLAGS += -lglog
99
+ endif
100
+
101
+ FOLLY_COMMIT_HASH = abe68f7e917e8b7a0ee2fe066c972dc98fd35aa1
102
+
103
+ # For public CI runs, checkout folly in a way that can build with RocksDB.
104
+ # This is mostly intended as a test-only simulation of Meta-internal folly
105
+ # integration.
106
+ checkout_folly:
107
+ if [ -e third-party/folly ]; then \
108
+ cd third-party/folly && ${GIT_COMMAND} fetch origin; \
109
+ else \
110
+ cd third-party && ${GIT_COMMAND} clone https://github.com/facebook/folly.git; \
111
+ fi
112
+ @# Pin to a particular version for public CI, so that PR authors don't
113
+ @# need to worry about folly breaking our integration. Update periodically
114
+ cd third-party/folly && git reset --hard $(FOLLY_COMMIT_HASH)
115
+ @# Apparently missing include
116
+ perl -pi -e 's/(#include <atomic>)/$$1\n#include <cstring>/' third-party/folly/folly/lang/Exception.h
117
+ @# const mismatch
118
+ perl -pi -e 's/: environ/: (const char**)(environ)/' third-party/folly/folly/Subprocess.cpp
119
+ @# Use gnu.org mirrors to improve download speed (ftp.gnu.org is often super slow)
120
+ cd third-party/folly && perl -pi -e 's/ftp.gnu.org/ftpmirror.gnu.org/' `git grep -l ftp.gnu.org` README.md
121
+ @# NOTE: boost and fmt source will be needed for any build including `USE_FOLLY_LITE` builds as those depend on those headers
122
+ cd third-party/folly && GETDEPS_USE_WGET=1 $(PYTHON) build/fbcode_builder/getdeps.py fetch boost && GETDEPS_USE_WGET=1 $(PYTHON) build/fbcode_builder/getdeps.py fetch fmt
123
+
124
+ CXX_M_FLAGS = $(filter -m%, $(CXXFLAGS))
125
+
126
+ FOLLY_BUILD_FLAGS = --no-tests
127
+ # NOTE: To avoid ODR violations, we must build folly in debug mode iff
128
+ # building RocksDB in debug mode.
129
+ ifneq ($(DEBUG_LEVEL),0)
130
+ FOLLY_BUILD_FLAGS += --build-type Debug
131
+ endif
132
+
133
+ build_folly:
134
+ FOLLY_INST_PATH=`cd third-party/folly && $(PYTHON) build/fbcode_builder/getdeps.py show-inst-dir`; \
135
+ if [ "$$FOLLY_INST_PATH" ]; then \
136
+ rm -rf $${FOLLY_INST_PATH}/../../*; \
137
+ else \
138
+ echo "Please run checkout_folly first"; \
139
+ false; \
140
+ fi
141
+ cd third-party/folly && \
142
+ CXXFLAGS=" $(CXX_M_FLAGS) -DHAVE_CXX11_ATOMIC " GETDEPS_USE_WGET=1 $(PYTHON) build/fbcode_builder/getdeps.py build $(FOLLY_BUILD_FLAGS)
143
+ @# In the folly build, glog and gflags are only built as dynamic libraries,
144
+ @# not static. This patchelf command is needed to reliably have the glog
145
+ @# library find its dependency gflags, because apparently the rpath of the
146
+ @# final binary is not used in resolving that transitive dependency.
147
+ FOLLY_INST_PATH=`cd third-party/folly && $(PYTHON) build/fbcode_builder/getdeps.py show-inst-dir`; \
148
+ cd "$$FOLLY_INST_PATH" && patchelf --add-rpath $$PWD/../gflags-*/lib ../glog-*/lib*/libglog*.so.*.*.*
@@ -90,6 +90,10 @@ class Compressor {
90
90
  return CompressionType::kDisableCompressionOption;
91
91
  }
92
92
 
93
+ // Return a distinct but functionally equivalent Compressor. This is often
94
+ // needed to implement MaybeCloneSpecialized() in wrapper compressors.
95
+ virtual std::unique_ptr<Compressor> Clone() const = 0;
96
+
93
97
  // Utility struct for providing sample data for the compression dictionary.
94
98
  // Potentially extensible by callers of Compressor (but not recommended)
95
99
  struct DictSampleArgs {
@@ -121,7 +125,7 @@ class Compressor {
121
125
  // dictionary associated with a returned compressor must be read from
122
126
  // GetSerializedDict().
123
127
  virtual std::unique_ptr<Compressor> MaybeCloneSpecialized(
124
- CacheEntryRole block_type, DictSampleArgs&& dict_samples) {
128
+ CacheEntryRole block_type, DictSampleArgs&& dict_samples) const {
125
129
  // Default implementation: no specialization
126
130
  (void)block_type;
127
131
  (void)dict_samples;
@@ -131,6 +135,18 @@ class Compressor {
131
135
  return nullptr;
132
136
  }
133
137
 
138
+ // A convenience function when a clone is needed and may or may not be
139
+ // specialized.
140
+ std::unique_ptr<Compressor> CloneMaybeSpecialized(
141
+ CacheEntryRole block_type, DictSampleArgs&& dict_samples) const {
142
+ auto clone = MaybeCloneSpecialized(block_type, std::move(dict_samples));
143
+ if (clone == nullptr) {
144
+ clone = Clone();
145
+ assert(clone != nullptr);
146
+ }
147
+ return clone;
148
+ }
149
+
134
150
  // A WorkingArea is an optional structure (both for callers and
135
151
  // implementations) that can enable optimizing repeated compressions by
136
152
  // reusing working space or thread-local tracking of statistics or trends.
@@ -473,9 +489,19 @@ class CompressorWrapper : public Compressor {
473
489
  return wrapped_->GetPreferredCompressionType();
474
490
  }
475
491
 
492
+ // NOTE: Clone() not implemented here because it needs to be in the derived
493
+ // class
494
+
495
+ // NOTE: MaybeCloneSpecialized() is only implemented here for convenience
496
+ // when the wrapped Compressor uses the default implementation of
497
+ // MaybeCloneSpecialized(). This needs to be overridden if not.
476
498
  std::unique_ptr<Compressor> MaybeCloneSpecialized(
477
- CacheEntryRole block_type, DictSampleArgs&& dict_samples) override {
478
- return wrapped_->MaybeCloneSpecialized(block_type, std::move(dict_samples));
499
+ CacheEntryRole block_type, DictSampleArgs&& dict_samples) const override {
500
+ auto clone =
501
+ wrapped_->MaybeCloneSpecialized(block_type, std::move(dict_samples));
502
+ // Assert default no-op MaybeCloneSpecialized()
503
+ assert(clone == nullptr);
504
+ return clone;
479
505
  }
480
506
 
481
507
  ManagedWorkingArea ObtainWorkingArea() override {
@@ -156,6 +156,61 @@ enum class PrepopulateBlobCache : uint8_t {
156
156
  kFlushOnly = 0x1, // Prepopulate blobs during flush only
157
157
  };
158
158
 
159
+ // Bitmask enum for verify output flags during compaction.
160
+ // This allows fine-grained control over what verification is performed
161
+ // on compaction output files and when it's enabled.
162
+ enum class VerifyOutputFlags : uint32_t {
163
+ kVerifyNone = 0x0, // No verification
164
+
165
+ // First set of bits: type of verifications
166
+ kVerifyBlockChecksum = 1 << 0, // Verify block checksums
167
+ kVerifyIteration = 1 << 1, // Verify iteration and full key/value hash
168
+ // by comparing the one inserted into a
169
+ // file, and what is read back.
170
+
171
+ // TODO - Implement
172
+ // kVerifyFileChecksum = 1 << 2, // Verify file-level checksum
173
+
174
+ // Second set of bits: when to enable verification
175
+ kEnableForLocalCompaction = 1 << 10, // Enable for local compaction
176
+ kEnableForRemoteCompaction = 1 << 11, // Enable for remote compaction
177
+
178
+ // TODO - Implement
179
+ // kEnableForFlush = 1 << 12, // Enable for flush
180
+
181
+ kVerifyAll = 0xFFFFFFFF,
182
+ };
183
+
184
+ inline VerifyOutputFlags operator|(VerifyOutputFlags lhs,
185
+ VerifyOutputFlags rhs) {
186
+ using T = std::underlying_type_t<VerifyOutputFlags>;
187
+ return static_cast<VerifyOutputFlags>(static_cast<T>(lhs) |
188
+ static_cast<T>(rhs));
189
+ }
190
+
191
+ inline VerifyOutputFlags& operator|=(VerifyOutputFlags& lhs,
192
+ VerifyOutputFlags rhs) {
193
+ lhs = lhs | rhs;
194
+ return lhs;
195
+ }
196
+
197
+ inline VerifyOutputFlags operator&(VerifyOutputFlags lhs,
198
+ VerifyOutputFlags rhs) {
199
+ using T = std::underlying_type_t<VerifyOutputFlags>;
200
+ return static_cast<VerifyOutputFlags>(static_cast<T>(lhs) &
201
+ static_cast<T>(rhs));
202
+ }
203
+
204
+ inline VerifyOutputFlags& operator&=(VerifyOutputFlags& lhs,
205
+ VerifyOutputFlags rhs) {
206
+ lhs = lhs & rhs;
207
+ return lhs;
208
+ }
209
+
210
+ inline bool operator!(VerifyOutputFlags flag) {
211
+ return flag == VerifyOutputFlags::kVerifyNone;
212
+ }
213
+
159
214
  struct AdvancedColumnFamilyOptions {
160
215
  // The maximum number of write buffers that are built up in memory.
161
216
  // The default and the minimum number is 2, so that when 1 write buffer
@@ -473,6 +528,17 @@ struct AdvancedColumnFamilyOptions {
473
528
  // Dynamically changeable through SetOptions() API
474
529
  int target_file_size_multiplier = 1;
475
530
 
531
+ // If true, RocksDB will consider the estimated tail size (filter + index +
532
+ // meta blocks) when deciding whether to cut a compaction output file. This
533
+ // helps prevent output files from exceeding the target_file_size_base due to
534
+ // large tail blocks. When disabled, only the data block size is considered,
535
+ // which may result in SST files exceeding the target_file_size_base.
536
+ //
537
+ // Default: false
538
+ //
539
+ // Dynamically changeable through SetOptions() API
540
+ bool target_file_size_is_upper_bound = false;
541
+
476
542
  // If true, RocksDB will pick target size of each level dynamically.
477
543
  // We will pick a base level b >= 1. L0 will be directly merged into level b,
478
544
  // instead of always into level 1. Level 1 to b-1 need to be empty.
@@ -704,6 +770,13 @@ struct AdvancedColumnFamilyOptions {
704
770
  // Dynamically changeable through SetOptions() API
705
771
  bool paranoid_file_checks = false;
706
772
 
773
+ // Bitmask enum for output verification option.
774
+ //
775
+ // Default: 0 (kVerifyNone)
776
+ //
777
+ // Dynamically changeable (as a uint32_t) through SetOptions() API.
778
+ VerifyOutputFlags verify_output_flags = VerifyOutputFlags::kVerifyNone;
779
+
707
780
  // In debug mode, RocksDB runs consistency checks on the LSM every time the
708
781
  // LSM changes (Flush, Compaction, AddFile). When this option is true, these
709
782
  // checks are also enabled in release mode. These checks were historically
@@ -148,6 +148,14 @@ typedef struct rocksdb_statistics_histogram_data_t
148
148
  rocksdb_statistics_histogram_data_t;
149
149
  typedef struct rocksdb_wait_for_compact_options_t
150
150
  rocksdb_wait_for_compact_options_t;
151
+
152
+ /* rocksdb_slice_t: Optimized slice type for high-performance C API operations
153
+ * This struct is ABI-compatible with rocksdb::Slice for zero-copy interop.
154
+ * Used by slice iterator functions and batched operations. */
155
+ typedef struct rocksdb_slice_t {
156
+ const char* data;
157
+ size_t size;
158
+ } rocksdb_slice_t;
151
159
  typedef struct rocksdb_flushjobinfo_t rocksdb_flushjobinfo_t;
152
160
  typedef struct rocksdb_compactionjobinfo_t rocksdb_compactionjobinfo_t;
153
161
  typedef struct rocksdb_subcompactionjobinfo_t rocksdb_subcompactionjobinfo_t;
@@ -158,6 +166,31 @@ typedef struct rocksdb_writestallinfo_t rocksdb_writestallinfo_t;
158
166
  typedef struct rocksdb_writestallcondition_t rocksdb_writestallcondition_t;
159
167
  typedef struct rocksdb_memtableinfo_t rocksdb_memtableinfo_t;
160
168
 
169
+ // Remote Compaction typedef
170
+ typedef struct rocksdb_compactionservice_scheduleresponse_t
171
+ rocksdb_compactionservice_scheduleresponse_t;
172
+ typedef struct rocksdb_compactionservice_jobinfo_t
173
+ rocksdb_compactionservice_jobinfo_t;
174
+ typedef struct rocksdb_compactionservice_t rocksdb_compactionservice_t;
175
+ typedef struct rocksdb_compaction_service_options_override_t
176
+ rocksdb_compaction_service_options_override_t;
177
+ typedef struct rocksdb_open_and_compact_options_t
178
+ rocksdb_open_and_compact_options_t;
179
+ typedef rocksdb_compactionservice_scheduleresponse_t* (
180
+ *rocksdb_compaction_service_schedule_cb)(
181
+ void* state, const rocksdb_compactionservice_jobinfo_t* info,
182
+ const char* compaction_service_input, size_t input_len);
183
+
184
+ typedef int (*rocksdb_compaction_service_wait_cb)(void* state,
185
+ const char* scheduled_job_id,
186
+ char** result,
187
+ size_t* result_len);
188
+
189
+ typedef void (*rocksdb_compaction_service_cancel_awaiting_jobs_cb)(void* state);
190
+
191
+ typedef void (*rocksdb_compaction_service_on_installation_cb)(
192
+ void* state, const char* scheduled_job_id, int status);
193
+
161
194
  /* DB operations */
162
195
 
163
196
  extern ROCKSDB_LIBRARY_API rocksdb_t* rocksdb_open(
@@ -610,6 +643,16 @@ extern ROCKSDB_LIBRARY_API void rocksdb_batched_multi_get_cf(
610
643
  const char* const* keys_list, const size_t* keys_list_sizes,
611
644
  rocksdb_pinnableslice_t** values, char** errs, const bool sorted_input);
612
645
 
646
+ /* Batched MultiGet with slice array: Takes rocksdb_slice_t array directly,
647
+ * avoiding key conversion. faster than rocksdb_batched_multi_get_cf for
648
+ * operations with many keys. Eliminates overhead of converting keys from
649
+ * separate pointer+size arrays to Slice objects. */
650
+ extern ROCKSDB_LIBRARY_API void rocksdb_batched_multi_get_cf_slice(
651
+ rocksdb_t* db, const rocksdb_readoptions_t* options,
652
+ rocksdb_column_family_handle_t* column_family, size_t num_keys,
653
+ const rocksdb_slice_t* keys_list, rocksdb_pinnableslice_t** values,
654
+ char** errs, const bool sorted_input);
655
+
613
656
  // The value is only allocated (using malloc) and returned if it is found and
614
657
  // value_found isn't NULL. In that case the user is responsible for freeing it.
615
658
  extern ROCKSDB_LIBRARY_API unsigned char rocksdb_key_may_exist(
@@ -776,6 +819,18 @@ extern ROCKSDB_LIBRARY_API const char* rocksdb_iter_timestamp(
776
819
  const rocksdb_iterator_t*, size_t* tslen);
777
820
  extern ROCKSDB_LIBRARY_API void rocksdb_iter_get_error(
778
821
  const rocksdb_iterator_t*, char** errptr);
822
+
823
+ /* Slice iterator functions: Return rocksdb_slice_t directly for better
824
+ * performance. These functions avoid the overhead of passing output parameters
825
+ * and provide zero-copy access to key/value/timestamp data. faster than
826
+ * traditional rocksdb_iter_key/value/timestamp functions. */
827
+ extern ROCKSDB_LIBRARY_API rocksdb_slice_t
828
+ rocksdb_iter_key_slice(const rocksdb_iterator_t* iter);
829
+ extern ROCKSDB_LIBRARY_API rocksdb_slice_t
830
+ rocksdb_iter_value_slice(const rocksdb_iterator_t* iter);
831
+ extern ROCKSDB_LIBRARY_API rocksdb_slice_t
832
+ rocksdb_iter_timestamp_slice(const rocksdb_iterator_t* iter);
833
+
779
834
  extern ROCKSDB_LIBRARY_API void rocksdb_iter_refresh(
780
835
  const rocksdb_iterator_t* iter, char** errptr);
781
836
 
@@ -3440,6 +3495,197 @@ extern ROCKSDB_LIBRARY_API uint64_t
3440
3495
  rocksdb_wait_for_compact_options_get_timeout(
3441
3496
  rocksdb_wait_for_compact_options_t* opt);
3442
3497
 
3498
+ /* High-performance zero-copy Get variants
3499
+ These functions avoid unnecessary memory allocations and copies.
3500
+ The returned buffer is valid until the handle is destroyed.
3501
+ Bindings should migrate to these for better performance. */
3502
+
3503
+ /* Zero-copy get that returns a handle to pinned data.
3504
+ The data remains valid until rocksdb_pinnable_handle_destroy is called.
3505
+ Returns NULL on error or not found. Check errptr to distinguish. */
3506
+ typedef struct rocksdb_pinnable_handle_t rocksdb_pinnable_handle_t;
3507
+
3508
+ extern ROCKSDB_LIBRARY_API rocksdb_pinnable_handle_t* rocksdb_get_pinned_v2(
3509
+ rocksdb_t* db, const rocksdb_readoptions_t* options, const char* key,
3510
+ size_t keylen, char** errptr);
3511
+
3512
+ extern ROCKSDB_LIBRARY_API rocksdb_pinnable_handle_t* rocksdb_get_pinned_cf_v2(
3513
+ rocksdb_t* db, const rocksdb_readoptions_t* options,
3514
+ rocksdb_column_family_handle_t* column_family, const char* key,
3515
+ size_t keylen, char** errptr);
3516
+
3517
+ /* Get the data pointer and size from a pinnable handle.
3518
+ The data pointer is valid until the handle is destroyed. */
3519
+ extern ROCKSDB_LIBRARY_API const char* rocksdb_pinnable_handle_get_value(
3520
+ const rocksdb_pinnable_handle_t* handle, size_t* vallen);
3521
+
3522
+ extern ROCKSDB_LIBRARY_API void rocksdb_pinnable_handle_destroy(
3523
+ rocksdb_pinnable_handle_t* handle);
3524
+
3525
+ /* Direct get into caller-provided buffer.
3526
+ Returns 1 if value fits in buffer, 0 if buffer too small.
3527
+ Sets *vallen to actual value size.
3528
+ If buffer is too small, no data is copied but *vallen is set. */
3529
+ extern ROCKSDB_LIBRARY_API unsigned char rocksdb_get_into_buffer(
3530
+ rocksdb_t* db, const rocksdb_readoptions_t* options, const char* key,
3531
+ size_t keylen, char* buffer, size_t buffer_size, size_t* vallen,
3532
+ unsigned char* found, char** errptr);
3533
+
3534
+ extern ROCKSDB_LIBRARY_API unsigned char rocksdb_get_into_buffer_cf(
3535
+ rocksdb_t* db, const rocksdb_readoptions_t* options,
3536
+ rocksdb_column_family_handle_t* column_family, const char* key,
3537
+ size_t keylen, char* buffer, size_t buffer_size, size_t* vallen,
3538
+ unsigned char* found, char** errptr);
3539
+
3540
+ // Remote compaction
3541
+ enum {
3542
+ rocksdb_compactionservice_jobstatus_success = 0,
3543
+ rocksdb_compactionservice_jobstatus_failure = 1,
3544
+ rocksdb_compactionservice_jobstatus_aborted = 2,
3545
+ rocksdb_compactionservice_jobstatus_use_local = 3,
3546
+ };
3547
+
3548
+ extern ROCKSDB_LIBRARY_API rocksdb_compactionservice_scheduleresponse_t*
3549
+ rocksdb_compactionservice_scheduleresponse_create(const char* scheduled_job_id,
3550
+ int status, char** errptr);
3551
+
3552
+ extern ROCKSDB_LIBRARY_API rocksdb_compactionservice_scheduleresponse_t*
3553
+ rocksdb_compactionservice_scheduleresponse_create_with_status(int status,
3554
+ char** errptr);
3555
+
3556
+ extern ROCKSDB_LIBRARY_API int
3557
+ rocksdb_compactionservice_scheduleresponse_getstatus(
3558
+ const rocksdb_compactionservice_scheduleresponse_t* response);
3559
+
3560
+ extern ROCKSDB_LIBRARY_API const char*
3561
+ rocksdb_compactionservice_scheduleresponse_get_scheduled_job_id(
3562
+ const rocksdb_compactionservice_scheduleresponse_t* response, size_t* len);
3563
+
3564
+ extern ROCKSDB_LIBRARY_API void
3565
+ rocksdb_compactionservice_scheduleresponse_t_destroy(
3566
+ rocksdb_compactionservice_scheduleresponse_t* response);
3567
+
3568
+ extern ROCKSDB_LIBRARY_API const char*
3569
+ rocksdb_compactionservice_jobinfo_t_get_db_name(
3570
+ const rocksdb_compactionservice_jobinfo_t* info, size_t* len);
3571
+
3572
+ extern ROCKSDB_LIBRARY_API const char*
3573
+ rocksdb_compactionservice_jobinfo_t_get_db_id(
3574
+ const rocksdb_compactionservice_jobinfo_t* info, size_t* len);
3575
+
3576
+ extern ROCKSDB_LIBRARY_API const char*
3577
+ rocksdb_compactionservice_jobinfo_t_get_db_session_id(
3578
+ const rocksdb_compactionservice_jobinfo_t* info, size_t* len);
3579
+
3580
+ extern ROCKSDB_LIBRARY_API const char*
3581
+ rocksdb_compactionservice_jobinfo_t_get_cf_name(
3582
+ const rocksdb_compactionservice_jobinfo_t* info, size_t* len);
3583
+
3584
+ extern ROCKSDB_LIBRARY_API uint32_t
3585
+ rocksdb_compactionservice_jobinfo_t_get_cf_id(
3586
+ const rocksdb_compactionservice_jobinfo_t* info);
3587
+
3588
+ extern ROCKSDB_LIBRARY_API uint64_t
3589
+ rocksdb_compactionservice_jobinfo_t_get_job_id(
3590
+ const rocksdb_compactionservice_jobinfo_t* info);
3591
+
3592
+ extern ROCKSDB_LIBRARY_API int rocksdb_compactionservice_jobinfo_t_get_priority(
3593
+ const rocksdb_compactionservice_jobinfo_t* info);
3594
+
3595
+ extern ROCKSDB_LIBRARY_API int
3596
+ rocksdb_compactionservice_jobinfo_t_get_compaction_reason(
3597
+ const rocksdb_compactionservice_jobinfo_t* info);
3598
+
3599
+ extern ROCKSDB_LIBRARY_API int
3600
+ rocksdb_compactionservice_jobinfo_t_get_base_input_level(
3601
+ const rocksdb_compactionservice_jobinfo_t* info);
3602
+
3603
+ extern ROCKSDB_LIBRARY_API int
3604
+ rocksdb_compactionservice_jobinfo_t_get_output_level(
3605
+ const rocksdb_compactionservice_jobinfo_t* info);
3606
+
3607
+ extern ROCKSDB_LIBRARY_API unsigned char
3608
+ rocksdb_compactionservice_jobinfo_t_is_full_compaction(
3609
+ const rocksdb_compactionservice_jobinfo_t* info);
3610
+
3611
+ extern ROCKSDB_LIBRARY_API unsigned char
3612
+ rocksdb_compactionservice_jobinfo_t_is_manual_compaction(
3613
+ const rocksdb_compactionservice_jobinfo_t* info);
3614
+
3615
+ extern ROCKSDB_LIBRARY_API unsigned char
3616
+ rocksdb_compactionservice_jobinfo_t_is_bottommost_level(
3617
+ const rocksdb_compactionservice_jobinfo_t* info);
3618
+
3619
+ extern ROCKSDB_LIBRARY_API rocksdb_compactionservice_t*
3620
+ rocksdb_compactionservice_create(
3621
+ void* state, void (*destructor)(void*),
3622
+ rocksdb_compaction_service_schedule_cb schedule, const char* name,
3623
+ rocksdb_compaction_service_wait_cb wait,
3624
+ rocksdb_compaction_service_cancel_awaiting_jobs_cb cancel_awaiting_jobs,
3625
+ rocksdb_compaction_service_on_installation_cb on_installation);
3626
+
3627
+ extern ROCKSDB_LIBRARY_API void rocksdb_options_set_compaction_service(
3628
+ rocksdb_options_t* options, rocksdb_compactionservice_t* service);
3629
+
3630
+ // CompactionServiceOptionsOverride
3631
+ extern ROCKSDB_LIBRARY_API rocksdb_compaction_service_options_override_t*
3632
+ rocksdb_compaction_service_options_override_create(void);
3633
+
3634
+ extern ROCKSDB_LIBRARY_API void
3635
+ rocksdb_compaction_service_options_override_destroy(
3636
+ rocksdb_compaction_service_options_override_t* override_options);
3637
+
3638
+ extern ROCKSDB_LIBRARY_API void
3639
+ rocksdb_compaction_service_options_override_set_env(
3640
+ rocksdb_compaction_service_options_override_t* override_options,
3641
+ rocksdb_env_t* env);
3642
+
3643
+ extern ROCKSDB_LIBRARY_API void
3644
+ rocksdb_compaction_service_options_override_set_comparator(
3645
+ rocksdb_compaction_service_options_override_t* override_options,
3646
+ rocksdb_comparator_t* comparator);
3647
+
3648
+ // Atomic bool management for cancellation
3649
+ // Creates an atomic bool that can be used for cancellation.
3650
+ // User must call rocksdb_open_and_compact_canceled_destroy() to free it.
3651
+ extern ROCKSDB_LIBRARY_API unsigned char*
3652
+ rocksdb_open_and_compact_canceled_create(void);
3653
+
3654
+ extern ROCKSDB_LIBRARY_API void rocksdb_open_and_compact_canceled_destroy(
3655
+ unsigned char* canceled);
3656
+
3657
+ extern ROCKSDB_LIBRARY_API void rocksdb_open_and_compact_canceled_set(
3658
+ unsigned char* canceled, unsigned char value);
3659
+
3660
+ // OpenAndCompactOptions
3661
+ extern ROCKSDB_LIBRARY_API rocksdb_open_and_compact_options_t*
3662
+ rocksdb_open_and_compact_options_create(void);
3663
+
3664
+ extern ROCKSDB_LIBRARY_API void rocksdb_open_and_compact_options_destroy(
3665
+ rocksdb_open_and_compact_options_t* options);
3666
+
3667
+ extern ROCKSDB_LIBRARY_API void rocksdb_open_and_compact_options_set_canceled(
3668
+ rocksdb_open_and_compact_options_t* options, unsigned char* canceled);
3669
+
3670
+ extern ROCKSDB_LIBRARY_API void
3671
+ rocksdb_open_and_compact_options_set_allow_resumption(
3672
+ rocksdb_open_and_compact_options_t* options,
3673
+ unsigned char allow_resumption);
3674
+
3675
+ // OpenAndCompact - main functions
3676
+ extern ROCKSDB_LIBRARY_API char* rocksdb_open_and_compact(
3677
+ const char* db_path, const char* output_directory, const char* input,
3678
+ size_t input_len, size_t* output_len,
3679
+ const rocksdb_compaction_service_options_override_t* override_options,
3680
+ char** errptr);
3681
+
3682
+ extern ROCKSDB_LIBRARY_API char* rocksdb_open_and_compact_with_options(
3683
+ const rocksdb_open_and_compact_options_t* options, const char* db_path,
3684
+ const char* output_directory, const char* input, size_t input_len,
3685
+ size_t* output_len,
3686
+ const rocksdb_compaction_service_options_override_t* override_options,
3687
+ char** errptr);
3688
+
3443
3689
  #ifdef __cplusplus
3444
3690
  } /* end extern "C" */
3445
3691
  #endif
@@ -284,9 +284,7 @@ class CompactionFilter : public Customizable {
284
284
  std::string* new_value,
285
285
  std::vector<std::pair<std::string, std::string>>* /* new_columns */,
286
286
  std::string* skip_until) const {
287
- #ifdef NDEBUG
288
287
  (void)existing_columns;
289
- #endif
290
288
 
291
289
  assert(!existing_value || !existing_columns);
292
290
  assert(value_type == ValueType::kWideColumnEntity || existing_value);
@@ -247,15 +247,7 @@ class ManagedPtr {
247
247
  public:
248
248
  ManagedPtr() = default;
249
249
  ManagedPtr(T* ptr, Owner* owner) : ptr_(ptr), owner_(owner) {}
250
- ~ManagedPtr() {
251
- if (ptr_ && owner_) {
252
- if constexpr (std::is_member_function_pointer_v<decltype(Fn)>) {
253
- (owner_->*Fn)(ptr_);
254
- } else {
255
- Fn(owner_, ptr_);
256
- }
257
- }
258
- }
250
+ ~ManagedPtr() { Free(); }
259
251
  // No copies
260
252
  ManagedPtr(const ManagedPtr&) = delete;
261
253
  ManagedPtr& operator=(const ManagedPtr&) = delete;
@@ -267,6 +259,10 @@ class ManagedPtr {
267
259
  other.owner_ = nullptr;
268
260
  }
269
261
  ManagedPtr& operator=(ManagedPtr&& other) noexcept {
262
+ if (this == &other) {
263
+ return *this;
264
+ }
265
+ Free();
270
266
  ptr_ = other.ptr_;
271
267
  owner_ = other.owner_;
272
268
  other.ptr_ = nullptr;
@@ -284,6 +280,16 @@ class ManagedPtr {
284
280
  private:
285
281
  T* ptr_ = nullptr;
286
282
  Owner* owner_ = nullptr;
283
+
284
+ void Free() {
285
+ if (ptr_ && owner_) {
286
+ if constexpr (std::is_member_function_pointer_v<decltype(Fn)>) {
287
+ (owner_->*Fn)(ptr_);
288
+ } else {
289
+ Fn(owner_, ptr_);
290
+ }
291
+ }
292
+ }
287
293
  };
288
294
 
289
295
  template <typename T, typename comp>