@nxtedition/rocksdb 14.0.0 → 15.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/binding.cc +52 -179
  2. package/deps/rocksdb/rocksdb/BUCK +7 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +29 -14
  4. package/deps/rocksdb/rocksdb/Directory.Build.props +9 -0
  5. package/deps/rocksdb/rocksdb/Makefile +6 -1
  6. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/ccache_msvc_compiler.bat +1 -0
  8. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +17 -3
  9. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +8 -3
  10. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +10 -0
  11. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +522 -60
  12. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +69 -10
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +443 -0
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -3
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +5 -5
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -6
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +28 -5
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +4 -4
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +6 -3
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +455 -98
  23. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +4 -2
  24. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +13 -1
  25. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +146 -0
  26. package/deps/rocksdb/rocksdb/db/db_follower_test.cc +2 -2
  27. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +6 -0
  28. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -2
  29. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +18 -19
  30. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +665 -14
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +83 -0
  33. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +68 -0
  34. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +101 -0
  35. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +44 -0
  36. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
  37. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +22 -5
  38. package/deps/rocksdb/rocksdb/db/log_reader.h +4 -4
  39. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  40. package/deps/rocksdb/rocksdb/db/merge_helper.h +1 -1
  41. package/deps/rocksdb/rocksdb/db/version_edit.cc +477 -139
  42. package/deps/rocksdb/rocksdb/db/version_edit.h +228 -8
  43. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +333 -0
  44. package/deps/rocksdb/rocksdb/db/write_thread.h +1 -1
  45. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  46. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +247 -32
  47. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -0
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.cc +61 -0
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +17 -28
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +16 -0
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +6 -1
  52. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +46 -18
  53. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +18 -1
  54. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +8 -7
  55. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +4 -4
  56. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1 -0
  57. package/deps/rocksdb/rocksdb/file/filename.cc +40 -0
  58. package/deps/rocksdb/rocksdb/file/filename.h +14 -1
  59. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +4 -3
  60. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +2 -1
  61. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -7
  62. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -3
  63. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +59 -0
  64. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  65. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +24 -0
  66. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +2 -1
  67. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -0
  68. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +13 -8
  69. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  70. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -0
  71. package/deps/rocksdb/rocksdb/options/options_test.cc +5 -0
  72. package/deps/rocksdb/rocksdb/src.mk +2 -0
  73. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +73 -16
  74. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +10 -5
  75. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +32 -0
  76. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +18 -27
  77. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -3
  78. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -1
  79. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +708 -217
  80. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +11 -6
  81. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +5 -3
  82. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +27 -19
  83. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +24 -6
  84. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +51 -18
  85. package/deps/rocksdb/rocksdb/table/block_based/index_builder_test.cc +183 -0
  86. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +4 -2
  87. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -2
  88. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +8 -3
  89. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -1
  90. package/deps/rocksdb/rocksdb/table/table_test.cc +222 -36
  91. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +246 -6
  92. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +86 -0
  93. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +21 -0
  94. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  95. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -1
  96. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +0 -2
  98. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +12 -12
  99. package/index.js +27 -37
  100. package/package.json +1 -1
  101. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  102. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
package/binding.cc CHANGED
@@ -1178,6 +1178,12 @@ NAPI_METHOD(db_open) {
1178
1178
 
1179
1179
  NAPI_STATUS_THROWS(GetProperty(env, options, "compactionReadaheadSize", dbOptions.compaction_readahead_size));
1180
1180
 
1181
+ NAPI_STATUS_THROWS(GetProperty(env, options, "useAdaptiveMutex", dbOptions.use_adaptive_mutex));
1182
+
1183
+ NAPI_STATUS_THROWS(GetProperty(env, options, "writeBufferSize", dbOptions.db_write_buffer_size));
1184
+
1185
+ NAPI_STATUS_THROWS(GetProperty(env, options, "manualWALFlush", dbOptions.manual_wal_flush));
1186
+
1181
1187
  // TODO (feat): dbOptions.listeners
1182
1188
 
1183
1189
  std::string infoLogLevel;
@@ -1600,6 +1606,28 @@ NAPI_METHOD(db_get_latest_sequence) {
1600
1606
  return result;
1601
1607
  }
1602
1608
 
1609
+ NAPI_METHOD(db_flush_wal) {
1610
+ NAPI_ARGV(3);
1611
+
1612
+ Database* database;
1613
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1614
+
1615
+ bool sync;
1616
+ NAPI_STATUS_THROWS(GetValue(env, argv[1], sync));
1617
+
1618
+ auto callback = argv[2];
1619
+
1620
+ struct State {};
1621
+ runAsync<State>(
1622
+ "leveldown.flush_wal", env, callback,
1623
+ [=](auto& state) {
1624
+ return database->db->FlushWAL(sync);
1625
+ },
1626
+ [](auto& state, auto env, auto& argv) { return napi_ok; });
1627
+
1628
+ return 0;
1629
+ }
1630
+
1603
1631
  NAPI_METHOD(iterator_init) {
1604
1632
  NAPI_ARGV(2);
1605
1633
 
@@ -2034,193 +2062,30 @@ NAPI_METHOD(updates_close) {
2034
2062
  }
2035
2063
  }
2036
2064
 
2037
- NAPI_METHOD(db_open_for_read_only) {
2038
- NAPI_ARGV(3);
2065
+ NAPI_METHOD(db_compact_range_sync) {
2066
+ NAPI_ARGV(2);
2039
2067
 
2040
2068
  Database* database;
2041
2069
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
2042
2070
 
2043
- if (database->db) {
2044
- napi_value columns;
2045
- NAPI_STATUS_THROWS(napi_create_object(env, &columns));
2046
- for (auto& [id, column] : database->columns) {
2047
- napi_value val;
2048
- NAPI_STATUS_THROWS(napi_create_external(env, column.handle, nullptr, nullptr, &val));
2049
- NAPI_STATUS_THROWS(napi_set_named_property(env, columns, column.descriptor.name.c_str(), val));
2050
- }
2051
- return columns;
2052
- } else {
2053
- rocksdb::Options dbOptions;
2054
-
2055
- const auto options = argv[1];
2056
-
2057
- int parallelism = std::max<int>(1, std::thread::hardware_concurrency() / 2);
2058
- NAPI_STATUS_THROWS(GetProperty(env, options, "parallelism", parallelism));
2059
- dbOptions.IncreaseParallelism(parallelism);
2060
-
2061
- NAPI_STATUS_THROWS(GetProperty(env, options, "walDir", dbOptions.wal_dir));
2062
-
2063
- uint32_t walTTL = 0;
2064
- NAPI_STATUS_THROWS(GetProperty(env, options, "walTTL", walTTL));
2065
- dbOptions.WAL_ttl_seconds = walTTL / 1e3;
2066
-
2067
- uint32_t walSizeLimit = 0;
2068
- NAPI_STATUS_THROWS(GetProperty(env, options, "walSizeLimit", walSizeLimit));
2069
- dbOptions.WAL_size_limit_MB = walSizeLimit / 1e6;
2070
-
2071
- NAPI_STATUS_THROWS(GetProperty(env, options, "maxTotalWalSize", dbOptions.max_total_wal_size));
2072
-
2073
- bool walCompression = true;
2074
- NAPI_STATUS_THROWS(GetProperty(env, options, "walCompression", walCompression));
2075
- dbOptions.wal_compression =
2076
- walCompression ? rocksdb::CompressionType::kZSTD : rocksdb::CompressionType::kNoCompression;
2077
-
2078
- dbOptions.avoid_unnecessary_blocking_io = true;
2079
- NAPI_STATUS_THROWS(GetProperty(env, options, "avoidUnnecessaryBlockingIO", dbOptions.avoid_unnecessary_blocking_io));
2080
-
2081
- dbOptions.create_missing_column_families = true;
2082
- NAPI_STATUS_THROWS(GetProperty(env, options, "createMissingColumnFamilies", dbOptions.create_missing_column_families));
2083
-
2084
- NAPI_STATUS_THROWS(GetProperty(env, options, "writeDbIdToManifest", dbOptions.write_dbid_to_manifest));
2085
-
2086
- NAPI_STATUS_THROWS(GetProperty(env, options, "adviseRandomOnOpen", dbOptions.advise_random_on_open));
2087
-
2088
- NAPI_STATUS_THROWS(GetProperty(env, options, "bytesPerSync", dbOptions.bytes_per_sync));
2089
-
2090
- NAPI_STATUS_THROWS(GetProperty(env, options, "walBytesPerSync", dbOptions.wal_bytes_per_sync));
2091
-
2092
- NAPI_STATUS_THROWS(GetProperty(env, options, "strictBytesPerSync", dbOptions.strict_bytes_per_sync));
2093
-
2094
- NAPI_STATUS_THROWS(GetProperty(env, options, "delayedWriteRate", dbOptions.delayed_write_rate));
2095
-
2096
- NAPI_STATUS_THROWS(GetProperty(env, options, "createIfMissing", dbOptions.create_if_missing));
2097
-
2098
- NAPI_STATUS_THROWS(GetProperty(env, options, "errorIfExists", dbOptions.error_if_exists));
2099
-
2100
- NAPI_STATUS_THROWS(GetProperty(env, options, "pipelinedWrite", dbOptions.enable_pipelined_write));
2101
-
2102
- NAPI_STATUS_THROWS(GetProperty(env, options, "dailyOffpeakTime", dbOptions.daily_offpeak_time_utc));
2103
-
2104
- NAPI_STATUS_THROWS(GetProperty(env, options, "unorderedWrite", dbOptions.unordered_write));
2105
-
2106
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapReads", dbOptions.allow_mmap_reads));
2107
-
2108
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapWrites", dbOptions.allow_mmap_writes));
2109
-
2110
- NAPI_STATUS_THROWS(GetProperty(env, options, "memTableHugePageSize", dbOptions.memtable_huge_page_size));
2111
-
2112
- NAPI_STATUS_THROWS(GetProperty(env, options, "useDirectIOReads", dbOptions.use_direct_reads));
2113
-
2114
- NAPI_STATUS_THROWS(GetProperty(env, options, "useDirectIOForFlushAndCompaction", dbOptions.use_direct_io_for_flush_and_compaction));
2115
-
2116
- NAPI_STATUS_THROWS(GetProperty(env, options, "compactionReadaheadSize", dbOptions.compaction_readahead_size));
2117
-
2118
- // TODO (feat): dbOptions.listeners
2119
-
2120
- std::string infoLogLevel;
2121
- NAPI_STATUS_THROWS(GetProperty(env, options, "infoLogLevel", infoLogLevel));
2122
- if (infoLogLevel.size() > 0) {
2123
- rocksdb::InfoLogLevel lvl = {};
2124
-
2125
- if (infoLogLevel == "debug")
2126
- lvl = rocksdb::InfoLogLevel::DEBUG_LEVEL;
2127
- else if (infoLogLevel == "info")
2128
- lvl = rocksdb::InfoLogLevel::INFO_LEVEL;
2129
- else if (infoLogLevel == "warn")
2130
- lvl = rocksdb::InfoLogLevel::WARN_LEVEL;
2131
- else if (infoLogLevel == "error")
2132
- lvl = rocksdb::InfoLogLevel::ERROR_LEVEL;
2133
- else if (infoLogLevel == "fatal")
2134
- lvl = rocksdb::InfoLogLevel::FATAL_LEVEL;
2135
- else if (infoLogLevel == "header")
2136
- lvl = rocksdb::InfoLogLevel::HEADER_LEVEL;
2137
- else
2138
- napi_throw_error(env, nullptr, "invalid log level");
2139
-
2140
- dbOptions.info_log_level = lvl;
2141
- } else {
2142
- // In some places RocksDB checks this option to see if it should prepare
2143
- // debug information (ahead of logging), so set it to the highest level.
2144
- dbOptions.info_log_level = rocksdb::InfoLogLevel::HEADER_LEVEL;
2145
- dbOptions.info_log.reset(new NullLogger());
2146
- }
2147
-
2148
- NAPI_STATUS_THROWS(InitOptions(env, dbOptions, options));
2149
-
2150
- std::vector<rocksdb::ColumnFamilyDescriptor> descriptors;
2151
-
2152
- bool hasColumns;
2153
- NAPI_STATUS_THROWS(napi_has_named_property(env, options, "columns", &hasColumns));
2154
-
2155
- if (hasColumns) {
2156
- napi_value columns;
2157
- NAPI_STATUS_THROWS(napi_get_named_property(env, options, "columns", &columns));
2158
-
2159
- napi_value keys;
2160
- NAPI_STATUS_THROWS(napi_get_property_names(env, columns, &keys));
2161
-
2162
- uint32_t len;
2163
- NAPI_STATUS_THROWS(napi_get_array_length(env, keys, &len));
2164
-
2165
- descriptors.resize(len);
2166
- for (uint32_t n = 0; n < len; ++n) {
2167
- napi_value key;
2168
- NAPI_STATUS_THROWS(napi_get_element(env, keys, n, &key));
2169
-
2170
- napi_value column;
2171
- NAPI_STATUS_THROWS(napi_get_property(env, columns, key, &column));
2172
-
2173
- NAPI_STATUS_THROWS(InitOptions(env, descriptors[n].options, column));
2174
-
2175
- NAPI_STATUS_THROWS(GetValue(env, key, descriptors[n].name));
2176
- }
2177
- }
2178
-
2179
- auto callback = argv[2];
2180
-
2181
- runAsync<std::vector<rocksdb::ColumnFamilyHandle*>>(
2182
- "leveldown.open_for_read_only", env, callback,
2183
- [=](auto& handles) {
2184
- assert(!database->db);
2185
-
2186
- rocksdb::DB* db = nullptr;
2187
-
2188
- const auto status = descriptors.empty()
2189
- ? rocksdb::DB::OpenForReadOnly(dbOptions, database->location, &db)
2190
- : rocksdb::DB::OpenForReadOnly(dbOptions, database->location, descriptors, &handles, &db);
2191
-
2192
- database->db.reset(db);
2193
-
2194
- return status;
2195
- },
2196
- [=](auto& handles, auto env, auto& argv) {
2197
- argv.resize(2);
2071
+ std::optional<std::string> start;
2072
+ std::optional<std::string> end;
2198
2073
 
2199
- NAPI_STATUS_RETURN(napi_create_object(env, &argv[1]));
2074
+ NAPI_STATUS_THROWS(GetProperty(env, argv[1], "start", start));
2075
+ NAPI_STATUS_THROWS(GetProperty(env, argv[1], "end", end));
2200
2076
 
2201
- for (size_t n = 0; n < handles.size(); ++n) {
2202
- ColumnFamily column;
2203
- column.handle = handles[n];
2204
- column.descriptor = descriptors[n];
2205
- database->columns[column.handle->GetID()] = column;
2206
- }
2077
+ rocksdb::CompactRangeOptions options;
2207
2078
 
2208
- napi_value columns = argv[1];
2209
- for (auto& [id, column] : database->columns) {
2210
- napi_value val;
2211
- NAPI_STATUS_RETURN(napi_create_external(env, column.handle, nullptr, nullptr, &val));
2212
- NAPI_STATUS_RETURN(napi_set_named_property(env, columns, column.descriptor.name.c_str(), val));
2213
- }
2079
+ auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2080
+ auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2214
2081
 
2215
- return napi_ok;
2216
- });
2217
- }
2082
+ ROCKS_STATUS_THROWS_NAPI(database->db->CompactRange(options, begin.get(), finish.get()));
2218
2083
 
2219
2084
  return 0;
2220
2085
  }
2221
2086
 
2222
2087
  NAPI_METHOD(db_compact_range) {
2223
- NAPI_ARGV(2);
2088
+ NAPI_ARGV(3);
2224
2089
 
2225
2090
  Database* database;
2226
2091
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
@@ -2231,12 +2096,19 @@ NAPI_METHOD(db_compact_range) {
2231
2096
  NAPI_STATUS_THROWS(GetProperty(env, argv[1], "start", start));
2232
2097
  NAPI_STATUS_THROWS(GetProperty(env, argv[1], "end", end));
2233
2098
 
2234
- rocksdb::CompactRangeOptions options;
2099
+ auto callback = argv[2];
2235
2100
 
2236
- auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2237
- auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2101
+ runAsync<std::nullptr_t>(
2102
+ "leveldown.compact_range", env, callback,
2103
+ [=](auto& state) {
2104
+ rocksdb::CompactRangeOptions options;
2238
2105
 
2239
- ROCKS_STATUS_THROWS_NAPI(database->db->CompactRange(options, begin.get(), finish.get()));
2106
+ auto begin = start ? std::make_unique<rocksdb::Slice>(*start) : nullptr;
2107
+ auto finish = end ? std::make_unique<rocksdb::Slice>(*end) : nullptr;
2108
+
2109
+ return database->db->CompactRange(options, begin.get(), finish.get());
2110
+ },
2111
+ [](auto& state, auto env, auto& argv) { return napi_ok; });
2240
2112
 
2241
2113
  return 0;
2242
2114
  }
@@ -2254,8 +2126,9 @@ NAPI_INIT() {
2254
2126
  NAPI_EXPORT_FUNCTION(db_get_property);
2255
2127
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
2256
2128
  NAPI_EXPORT_FUNCTION(db_query);
2257
- NAPI_EXPORT_FUNCTION(db_open_for_read_only);
2129
+ NAPI_EXPORT_FUNCTION(db_compact_range_sync);
2258
2130
  NAPI_EXPORT_FUNCTION(db_compact_range);
2131
+ NAPI_EXPORT_FUNCTION(db_flush_wal);
2259
2132
 
2260
2133
  NAPI_EXPORT_FUNCTION(iterator_init);
2261
2134
  NAPI_EXPORT_FUNCTION(iterator_seek);
@@ -425,6 +425,7 @@ rocks_cpp_library_wrapper(name="rocksdb_stress_lib", srcs=[
425
425
  "db_stress_tool/batched_ops_stress.cc",
426
426
  "db_stress_tool/cf_consistency_stress.cc",
427
427
  "db_stress_tool/db_stress_common.cc",
428
+ "db_stress_tool/db_stress_compaction_service.cc",
428
429
  "db_stress_tool/db_stress_compression_manager.cc",
429
430
  "db_stress_tool/db_stress_driver.cc",
430
431
  "db_stress_tool/db_stress_filters.cc",
@@ -5193,6 +5194,12 @@ cpp_unittest_wrapper(name="import_column_family_test",
5193
5194
  extra_compiler_flags=[])
5194
5195
 
5195
5196
 
5197
+ cpp_unittest_wrapper(name="index_builder_test",
5198
+ srcs=["table/block_based/index_builder_test.cc"],
5199
+ deps=[":rocksdb_test_lib"],
5200
+ extra_compiler_flags=[])
5201
+
5202
+
5196
5203
  cpp_unittest_wrapper(name="inlineskiplist_test",
5197
5204
  srcs=["memtable/inlineskiplist_test.cc"],
5198
5205
  deps=[":rocksdb_test_lib"],
@@ -203,9 +203,16 @@ if(WIN32 AND MSVC)
203
203
  endif()
204
204
  endif()
205
205
 
206
+ option(WIN_CI "Accelerate build speed and reduce build artifect size for github CI with MSVC" OFF)
207
+
206
208
  if(MSVC)
207
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
208
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4996 /wd4100 /wd4324")
209
+ if(WIN_CI)
210
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /nologo /EHsc /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
211
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /W4 /wd4127 /wd4996 /wd4100 /wd4324 /wd4702")
212
+ else()
213
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi /nologo /EHsc /GS /Gd /GR /GF /fp:precise /Zc:wchar_t /Zc:forScope /errorReport:queue")
214
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FC /d2Zi+ /W4 /wd4127 /wd4996 /wd4100 /wd4324")
215
+ endif()
209
216
  else()
210
217
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wextra -Wall -pthread")
211
218
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter -Wno-unused-variable -Woverloaded-virtual -Wnon-virtual-dtor -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-invalid-offsetof")
@@ -313,7 +320,7 @@ if(NOT MSVC)
313
320
  endif()
314
321
 
315
322
  # Check if -latomic is required or not
316
- if (NOT MSVC)
323
+ if (NOT MSVC AND NOT APPLE)
317
324
  CHECK_CXX_SOURCE_COMPILES("
318
325
  #include <atomic>
319
326
  std::atomic<uint64_t> x(0);
@@ -450,24 +457,33 @@ else()
450
457
  endif()
451
458
  endif()
452
459
 
453
- # Used to run CI build and tests so we can run faster
460
+ # Used to run optimized debug build and tests so we can run faster
454
461
  option(OPTDBG "Build optimized debug build with MSVC" OFF)
455
462
  option(WITH_RUNTIME_DEBUG "build with debug version of runtime library" ON)
456
463
  if(MSVC)
457
- if(OPTDBG)
464
+ if (WIN_CI)
458
465
  message(STATUS "Debug optimization is enabled")
459
466
  set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
467
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG:FASTLINK")
468
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG:FASTLINK")
460
469
  else()
461
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1")
462
-
463
- # Minimal Build is deprecated after MSVC 2015
464
- if( MSVC_VERSION GREATER 1900 )
465
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm-")
470
+ if(OPTDBG)
471
+ message(STATUS "Debug optimization is enabled")
472
+ set(CMAKE_CXX_FLAGS_DEBUG "/Oxt")
466
473
  else()
467
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm")
468
- endif()
474
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /RTC1")
469
475
 
476
+ # Minimal Build is deprecated after MSVC 2015
477
+ if( MSVC_VERSION GREATER 1900 )
478
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm-")
479
+ else()
480
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Gm")
481
+ endif()
482
+ endif()
483
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
484
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
470
485
  endif()
486
+
471
487
  if(WITH_RUNTIME_DEBUG)
472
488
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /${RUNTIME_LIBRARY}d")
473
489
  else()
@@ -475,8 +491,6 @@ if(MSVC)
475
491
  endif()
476
492
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Oxt /Zp8 /Gm- /Gy /${RUNTIME_LIBRARY}")
477
493
 
478
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
479
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
480
494
  endif()
481
495
 
482
496
  if(CMAKE_COMPILER_IS_GNUCXX)
@@ -1438,6 +1452,7 @@ if(WITH_TESTS)
1438
1452
  table/block_based/block_based_table_reader_test.cc
1439
1453
  table/block_based/block_test.cc
1440
1454
  table/block_based/data_block_hash_index_test.cc
1455
+ table/block_based/index_builder_test.cc
1441
1456
  table/block_based/full_filter_block_test.cc
1442
1457
  table/block_based/partitioned_filter_block_test.cc
1443
1458
  table/cleanable_test.cc
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Project>
3
+ <PropertyGroup>
4
+ <CLToolExe>ccache_msvc_compiler.bat</CLToolExe>
5
+ <CLToolPath>$(MSBuildThisFileDirectory)</CLToolPath>
6
+ <UseMultiToolTask>true</UseMultiToolTask>
7
+ <EnforceProcessCountAcrossBuilds>true</EnforceProcessCountAcrossBuilds>
8
+ </PropertyGroup>
9
+ </Project>
@@ -1739,6 +1739,9 @@ block_test: $(OBJ_DIR)/table/block_based/block_test.o $(TEST_LIBRARY) $(LIBRARY)
1739
1739
  data_block_hash_index_test: $(OBJ_DIR)/table/block_based/data_block_hash_index_test.o $(TEST_LIBRARY) $(LIBRARY)
1740
1740
  $(AM_LINK)
1741
1741
 
1742
+ index_builder_test: $(OBJ_DIR)/table/block_based/index_builder_test.o $(TEST_LIBRARY) $(LIBRARY)
1743
+ $(AM_LINK)
1744
+
1742
1745
  inlineskiplist_test: $(OBJ_DIR)/memtable/inlineskiplist_test.o $(TEST_LIBRARY) $(LIBRARY)
1743
1746
  $(AM_LINK)
1744
1747
 
@@ -2492,6 +2495,8 @@ commit_prereq:
2492
2495
  false # J=$(J) build_tools/precommit_checker.py unit clang_unit release clang_release tsan asan ubsan lite unit_non_shm
2493
2496
  # $(MAKE) clean && $(MAKE) jclean && $(MAKE) rocksdbjava;
2494
2497
 
2498
+ FOLLY_COMMIT_HASH = e95383b7c8b5b1e46cf47acf2f317d54f93c8268
2499
+
2495
2500
  # For public CI runs, checkout folly in a way that can build with RocksDB.
2496
2501
  # This is mostly intended as a test-only simulation of Meta-internal folly
2497
2502
  # integration.
@@ -2503,7 +2508,7 @@ checkout_folly:
2503
2508
  fi
2504
2509
  @# Pin to a particular version for public CI, so that PR authors don't
2505
2510
  @# need to worry about folly breaking our integration. Update periodically
2506
- cd third-party/folly && git reset --hard e95383b7c8b5b1e46cf47acf2f317d54f93c8268
2511
+ cd third-party/folly && git reset --hard $(FOLLY_COMMIT_HASH)
2507
2512
  @# Apparently missing include
2508
2513
  perl -pi -e 's/(#include <atomic>)/$$1\n#include <cstring>/' third-party/folly/folly/lang/Exception.h
2509
2514
  @# Warning-as-error on memcpy
@@ -33,7 +33,7 @@ const char* kTieredCacheName = "TieredCache";
33
33
  // proportionally across the primary/secondary caches.
34
34
  //
35
35
  // The primary block cache is initially sized to the sum of the primary cache
36
- // budget + teh secondary cache budget, as follows -
36
+ // budget + the secondary cache budget, as follows -
37
37
  // |--------- Primary Cache Configured Capacity -----------|
38
38
  // |---Secondary Cache Budget----|----Primary Cache Budget-----|
39
39
  //
@@ -51,7 +51,7 @@ const char* kTieredCacheName = "TieredCache";
51
51
  // placeholder is counted against the primary cache. To compensate and count
52
52
  // a portion of it against the secondary cache, the secondary cache Deflate()
53
53
  // method is called to shrink it. Since the Deflate() causes the secondary
54
- // actual usage to shrink, it is refelcted here by releasing an equal amount
54
+ // actual usage to shrink, it is reflected here by releasing an equal amount
55
55
  // from the pri_cache_res_ reservation. The Deflate() in the secondary cache
56
56
  // can be, but is not required to be, implemented using its own cache
57
57
  // reservation manager.
@@ -72,7 +72,7 @@ const char* kTieredCacheName = "TieredCache";
72
72
  // reservation is increased by an equal amount.
73
73
  //
74
74
  // Another way of implementing this would have been to simply split the user
75
- // reservation into primary and seconary components. However, this would
75
+ // reservation into primary and secondary components. However, this would
76
76
  // require allocating a structure to track the associated secondary cache
77
77
  // reservation, which adds some complexity and overhead.
78
78
  //
@@ -621,7 +621,7 @@ Status CacheWithSecondaryAdapter::UpdateCacheReservationRatio(
621
621
  } else {
622
622
  // We're shrinking the ratio. Try to avoid unnecessary evictions -
623
623
  // 1. Lower the secondary cache capacity
624
- // 2. Decrease pri_cache_res_ reservation to relect lower secondary
624
+ // 2. Decrease pri_cache_res_ reservation to reflect lower secondary
625
625
  // cache utilization (decrease in capacity - decrease in share of cache
626
626
  // reservations)
627
627
  // 3. Inflate the secondary cache to give it back the reduction in its
@@ -0,0 +1 @@
1
+ ccache.exe cl.exe %*
@@ -281,8 +281,9 @@ Compaction::Compaction(
281
281
  std::vector<CompactionInputFiles> _inputs, int _output_level,
282
282
  uint64_t _target_file_size, uint64_t _max_compaction_bytes,
283
283
  uint32_t _output_path_id, CompressionType _compression,
284
- CompressionOptions _compression_opts, Temperature _output_temperature,
285
- uint32_t _max_subcompactions, std::vector<FileMetaData*> _grandparents,
284
+ CompressionOptions _compression_opts,
285
+ Temperature _output_temperature_override, uint32_t _max_subcompactions,
286
+ std::vector<FileMetaData*> _grandparents,
286
287
  std::optional<SequenceNumber> _earliest_snapshot,
287
288
  const SnapshotChecker* _snapshot_checker,
288
289
  CompactionReason _compaction_reason, const std::string& _trim_ts,
@@ -303,7 +304,7 @@ Compaction::Compaction(
303
304
  output_path_id_(_output_path_id),
304
305
  output_compression_(_compression),
305
306
  output_compression_opts_(_compression_opts),
306
- output_temperature_(_output_temperature),
307
+ output_temperature_override_(_output_temperature_override),
307
308
  deletion_compaction_(_compaction_reason == CompactionReason::kFIFOTtl ||
308
309
  _compaction_reason ==
309
310
  CompactionReason::kFIFOMaxSize),
@@ -1128,4 +1129,17 @@ void Compaction::FilterInputsForCompactionIterator() {
1128
1129
  }
1129
1130
  }
1130
1131
 
1132
+ Temperature Compaction::GetOutputTemperature(bool is_proximal_level) const {
1133
+ if (output_temperature_override_ != Temperature::kUnknown) {
1134
+ return output_temperature_override_;
1135
+ }
1136
+
1137
+ if (is_last_level() && !is_proximal_level &&
1138
+ mutable_cf_options_.last_level_temperature != Temperature::kUnknown) {
1139
+ return mutable_cf_options_.last_level_temperature;
1140
+ }
1141
+
1142
+ return mutable_cf_options_.default_write_temperature;
1143
+ }
1144
+
1131
1145
  } // namespace ROCKSDB_NAMESPACE
@@ -90,7 +90,8 @@ class Compaction {
90
90
  uint64_t target_file_size, uint64_t max_compaction_bytes,
91
91
  uint32_t output_path_id, CompressionType compression,
92
92
  CompressionOptions compression_opts,
93
- Temperature output_temperature, uint32_t max_subcompactions,
93
+ Temperature output_temperature_override,
94
+ uint32_t max_subcompactions,
94
95
  std::vector<FileMetaData*> grandparents,
95
96
  std::optional<SequenceNumber> earliest_snapshot,
96
97
  const SnapshotChecker* snapshot_checker,
@@ -409,7 +410,11 @@ class Compaction {
409
410
 
410
411
  uint64_t max_compaction_bytes() const { return max_compaction_bytes_; }
411
412
 
412
- Temperature output_temperature() const { return output_temperature_; }
413
+ // Order of precedence for temperature:
414
+ // 1. Override temp if not kUnknown
415
+ // 2. Temperature of the last level files if applicable
416
+ // 3. Default write temperature
417
+ Temperature GetOutputTemperature(bool is_proximal_level = false) const;
413
418
 
414
419
  uint32_t max_subcompactions() const { return max_subcompactions_; }
415
420
 
@@ -541,7 +546,7 @@ class Compaction {
541
546
  const uint32_t output_path_id_;
542
547
  CompressionType output_compression_;
543
548
  CompressionOptions output_compression_opts_;
544
- Temperature output_temperature_;
549
+ Temperature output_temperature_override_;
545
550
  // If true, then the compaction can be done by simply deleting input files.
546
551
  const bool deletion_compaction_;
547
552
  // should it split the output file using the compact cursor?
@@ -270,6 +270,16 @@ class CompactionIterator {
270
270
  // true, unless `must_count_input_entries=true` was specified during iterator
271
271
  // creation (which ensures the count is always accurate).
272
272
  uint64_t NumInputEntryScanned() const { return input_.NumItered(); }
273
+
274
+ // Returns true if the current valid key was already scanned/counted during
275
+ // a lookahead operation in a previous iteration.
276
+ //
277
+ // REQUIRED: Valid() must be true
278
+ bool IsCurrentKeyAlreadyScanned() const {
279
+ assert(Valid());
280
+ return at_next_ || merge_out_iter_.Valid();
281
+ }
282
+
273
283
  Status InputStatus() const { return input_.status(); }
274
284
 
275
285
  bool IsDeleteRangeSentinelKey() const { return is_range_del_; }