@nxtedition/rocksdb 7.0.25 → 7.0.28

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 (120) hide show
  1. package/binding.cc +9 -2
  2. package/chained-batch.js +1 -1
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -0
  4. package/deps/rocksdb/rocksdb/Makefile +3 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +17 -7
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +1 -0
  9. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +117 -0
  10. package/deps/rocksdb/rocksdb/cache/charged_cache.h +121 -0
  11. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +270 -180
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.h +412 -124
  13. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +1 -0
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +1 -1
  15. package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -2
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +71 -9
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +11 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +21 -14
  21. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +68 -7
  22. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +16 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +519 -12
  24. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +120 -0
  25. package/deps/rocksdb/rocksdb/db/builder.cc +15 -5
  26. package/deps/rocksdb/rocksdb/db/builder.h +3 -0
  27. package/deps/rocksdb/rocksdb/db/c.cc +18 -0
  28. package/deps/rocksdb/rocksdb/db/c_test.c +18 -0
  29. package/deps/rocksdb/rocksdb/db/column_family.h +2 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +3 -2
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +9 -4
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +15 -10
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +36 -34
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +50 -13
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +12 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +2 -1
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -17
  39. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +26 -9
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +0 -11
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +93 -0
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +16 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3 -8
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -1
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +17 -5
  46. package/deps/rocksdb/rocksdb/db/db_test.cc +0 -3
  47. package/deps/rocksdb/rocksdb/db/db_test2.cc +39 -12
  48. package/deps/rocksdb/rocksdb/db/db_test_util.cc +9 -0
  49. package/deps/rocksdb/rocksdb/db/db_test_util.h +2 -0
  50. package/deps/rocksdb/rocksdb/db/dbformat.cc +0 -38
  51. package/deps/rocksdb/rocksdb/db/dbformat.h +14 -13
  52. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +5 -2
  53. package/deps/rocksdb/rocksdb/db/event_helpers.cc +13 -1
  54. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +0 -10
  55. package/deps/rocksdb/rocksdb/db/flush_job.cc +19 -15
  56. package/deps/rocksdb/rocksdb/db/flush_job.h +7 -0
  57. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +21 -15
  58. package/deps/rocksdb/rocksdb/db/forward_iterator.h +4 -3
  59. package/deps/rocksdb/rocksdb/db/memtable_list.cc +9 -0
  60. package/deps/rocksdb/rocksdb/db/memtable_list.h +5 -0
  61. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +53 -12
  62. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +14 -2
  63. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +10 -10
  64. package/deps/rocksdb/rocksdb/db/repair.cc +8 -6
  65. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +890 -0
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +324 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +186 -0
  68. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -0
  69. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -4
  70. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +23 -2
  71. package/deps/rocksdb/rocksdb/env/env_test.cc +74 -1
  72. package/deps/rocksdb/rocksdb/env/io_posix.cc +11 -8
  73. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +28 -0
  74. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +14 -1
  75. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
  76. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +30 -23
  77. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1 -1
  78. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +3 -13
  79. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
  80. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +1 -2
  81. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
  82. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  83. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  84. package/deps/rocksdb/rocksdb/options/cf_options.cc +14 -1
  85. package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
  86. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -56
  87. package/deps/rocksdb/rocksdb/options/db_options.cc +4 -5
  88. package/deps/rocksdb/rocksdb/options/options.cc +11 -1
  89. package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -0
  90. package/deps/rocksdb/rocksdb/options/options_helper.h +4 -0
  91. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +4 -0
  92. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -0
  93. package/deps/rocksdb/rocksdb/src.mk +3 -0
  94. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +6 -1
  95. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +4 -0
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +36 -3
  97. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +36 -1
  98. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +14 -3
  99. package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
  100. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -0
  101. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +5 -0
  102. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -0
  103. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -7
  104. package/deps/rocksdb/rocksdb/table/table_builder.h +7 -3
  105. package/deps/rocksdb/rocksdb/table/table_properties.cc +9 -0
  106. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +3 -2
  107. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +58 -30
  108. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  109. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +20 -0
  110. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +29 -154
  111. package/deps/rocksdb/rocksdb/util/rate_limiter.h +16 -34
  112. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +0 -92
  113. package/deps/rocksdb/rocksdb/util/timer.h +6 -0
  114. package/deps/rocksdb/rocksdb/util/vector_iterator.h +4 -3
  115. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -45
  116. package/deps/rocksdb/rocksdb/utilities/debug.cc +40 -0
  117. package/deps/rocksdb/rocksdb.gyp +2 -0
  118. package/package.json +1 -1
  119. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  120. package/{deps/rocksdb/rocksdb/prebuilds → prebuilds}/linux-x64/node.napi.node +0 -0
@@ -70,6 +70,8 @@ struct ImmutableCFOptions {
70
70
 
71
71
  bool force_consistency_checks;
72
72
 
73
+ uint64_t preclude_last_level_data_seconds;
74
+
73
75
  std::shared_ptr<const SliceTransform>
74
76
  memtable_insert_with_hint_prefix_extractor;
75
77
 
@@ -145,6 +147,7 @@ struct MutableCFOptions {
145
147
  options.blob_garbage_collection_force_threshold),
146
148
  blob_compaction_readahead_size(options.blob_compaction_readahead_size),
147
149
  blob_file_starting_level(options.blob_file_starting_level),
150
+ prepopulate_blob_cache(options.prepopulate_blob_cache),
148
151
  max_sequential_skip_in_iterations(
149
152
  options.max_sequential_skip_in_iterations),
150
153
  check_flush_compaction_key_order(
@@ -196,6 +199,7 @@ struct MutableCFOptions {
196
199
  blob_garbage_collection_force_threshold(0.0),
197
200
  blob_compaction_readahead_size(0),
198
201
  blob_file_starting_level(0),
202
+ prepopulate_blob_cache(PrepopulateBlobCache::kDisable),
199
203
  max_sequential_skip_in_iterations(0),
200
204
  check_flush_compaction_key_order(true),
201
205
  paranoid_file_checks(false),
@@ -279,6 +283,7 @@ struct MutableCFOptions {
279
283
  double blob_garbage_collection_force_threshold;
280
284
  uint64_t blob_compaction_readahead_size;
281
285
  int blob_file_starting_level;
286
+ PrepopulateBlobCache prepopulate_blob_cache;
282
287
 
283
288
  // Misc options
284
289
  uint64_t max_sequential_skip_in_iterations;
@@ -27,7 +27,6 @@
27
27
  #include "rocksdb/filter_policy.h"
28
28
  #include "rocksdb/flush_block_policy.h"
29
29
  #include "rocksdb/memory_allocator.h"
30
- #include "rocksdb/rate_limiter.h"
31
30
  #include "rocksdb/secondary_cache.h"
32
31
  #include "rocksdb/slice_transform.h"
33
32
  #include "rocksdb/sst_partitioner.h"
@@ -42,7 +41,6 @@
42
41
  #include "test_util/testharness.h"
43
42
  #include "test_util/testutil.h"
44
43
  #include "util/file_checksum_helper.h"
45
- #include "util/rate_limiter.h"
46
44
  #include "util/string_util.h"
47
45
  #include "utilities/compaction_filters/remove_emptyvalue_compactionfilter.h"
48
46
  #include "utilities/memory_allocators.h"
@@ -1472,21 +1470,6 @@ class MockFileChecksumGenFactory : public FileChecksumGenFactory {
1472
1470
  }
1473
1471
  };
1474
1472
 
1475
- class MockRateLimiter : public RateLimiter {
1476
- public:
1477
- static const char* kClassName() { return "MockRateLimiter"; }
1478
- const char* Name() const override { return kClassName(); }
1479
- void SetBytesPerSecond(int64_t /*bytes_per_second*/) override {}
1480
- int64_t GetBytesPerSecond() const override { return 0; }
1481
- int64_t GetSingleBurstBytes() const override { return 0; }
1482
- int64_t GetTotalBytesThrough(const Env::IOPriority /*pri*/) const override {
1483
- return 0;
1484
- }
1485
- int64_t GetTotalRequests(const Env::IOPriority /*pri*/) const override {
1486
- return 0;
1487
- }
1488
- };
1489
-
1490
1473
  class MockFilterPolicy : public FilterPolicy {
1491
1474
  public:
1492
1475
  static const char* kClassName() { return "MockFilterPolicy"; }
@@ -1618,14 +1601,6 @@ static int RegisterLocalObjects(ObjectLibrary& library,
1618
1601
  return guard->get();
1619
1602
  });
1620
1603
 
1621
- library.AddFactory<RateLimiter>(
1622
- MockRateLimiter::kClassName(),
1623
- [](const std::string& /*uri*/, std::unique_ptr<RateLimiter>* guard,
1624
- std::string* /* errmsg */) {
1625
- guard->reset(new MockRateLimiter());
1626
- return guard->get();
1627
- });
1628
-
1629
1604
  library.AddFactory<const FilterPolicy>(
1630
1605
  MockFilterPolicy::kClassName(),
1631
1606
  [](const std::string& /*uri*/, std::unique_ptr<const FilterPolicy>* guard,
@@ -2149,37 +2124,6 @@ TEST_F(LoadCustomizableTest, LoadMemoryAllocatorTest) {
2149
2124
  }
2150
2125
  }
2151
2126
 
2152
- TEST_F(LoadCustomizableTest, LoadRateLimiterTest) {
2153
- #ifndef ROCKSDB_LITE
2154
- ASSERT_OK(TestSharedBuiltins<RateLimiter>(MockRateLimiter::kClassName(),
2155
- GenericRateLimiter::kClassName()));
2156
- #else
2157
- ASSERT_OK(TestSharedBuiltins<RateLimiter>(MockRateLimiter::kClassName(), ""));
2158
- #endif // ROCKSDB_LITE
2159
-
2160
- std::shared_ptr<RateLimiter> result;
2161
- ASSERT_OK(RateLimiter::CreateFromString(
2162
- config_options_, std::string(GenericRateLimiter::kClassName()) + ":1234",
2163
- &result));
2164
- ASSERT_NE(result, nullptr);
2165
- ASSERT_TRUE(result->IsInstanceOf(GenericRateLimiter::kClassName()));
2166
- #ifndef ROCKSDB_LITE
2167
- ASSERT_OK(GetDBOptionsFromString(
2168
- config_options_, db_opts_,
2169
- std::string("rate_limiter=") + GenericRateLimiter::kClassName(),
2170
- &db_opts_));
2171
- ASSERT_NE(db_opts_.rate_limiter, nullptr);
2172
- if (RegisterTests("Test")) {
2173
- ExpectCreateShared<RateLimiter>(MockRateLimiter::kClassName());
2174
- ASSERT_OK(GetDBOptionsFromString(
2175
- config_options_, db_opts_,
2176
- std::string("rate_limiter=") + MockRateLimiter::kClassName(),
2177
- &db_opts_));
2178
- ASSERT_NE(db_opts_.rate_limiter, nullptr);
2179
- }
2180
- #endif // ROCKSDB_LITE
2181
- }
2182
-
2183
2127
  TEST_F(LoadCustomizableTest, LoadFilterPolicyTest) {
2184
2128
  const std::string kAutoBloom = BloomFilterPolicy::kClassName();
2185
2129
  const std::string kAutoRibbon = RibbonFilterPolicy::kClassName();
@@ -421,12 +421,11 @@ static std::unordered_map<std::string, OptionTypeInfo>
421
421
  {"db_host_id",
422
422
  {offsetof(struct ImmutableDBOptions, db_host_id), OptionType::kString,
423
423
  OptionVerificationType::kNormal, OptionTypeFlags::kCompareNever}},
424
+ // Temporarily deprecated due to race conditions (examples in PR 10375).
424
425
  {"rate_limiter",
425
- OptionTypeInfo::AsCustomSharedPtr<RateLimiter>(
426
- offsetof(struct ImmutableDBOptions, rate_limiter),
427
- OptionVerificationType::kNormal,
428
- OptionTypeFlags::kCompareNever | OptionTypeFlags::kAllowNull)},
429
-
426
+ {offsetof(struct ImmutableDBOptions, rate_limiter),
427
+ OptionType::kUnknown, OptionVerificationType::kDeprecated,
428
+ OptionTypeFlags::kDontSerialize | OptionTypeFlags::kCompareNever}},
430
429
  // The following properties were handled as special cases in ParseOption
431
430
  // This means that the properties could be read from the options file
432
431
  // but never written to the file or compared to each other.
@@ -92,6 +92,8 @@ AdvancedColumnFamilyOptions::AdvancedColumnFamilyOptions(const Options& options)
92
92
  ttl(options.ttl),
93
93
  periodic_compaction_seconds(options.periodic_compaction_seconds),
94
94
  sample_for_compression(options.sample_for_compression),
95
+ preclude_last_level_data_seconds(
96
+ options.preclude_last_level_data_seconds),
95
97
  enable_blob_files(options.enable_blob_files),
96
98
  min_blob_size(options.min_blob_size),
97
99
  blob_file_size(options.blob_file_size),
@@ -103,7 +105,8 @@ AdvancedColumnFamilyOptions::AdvancedColumnFamilyOptions(const Options& options)
103
105
  options.blob_garbage_collection_force_threshold),
104
106
  blob_compaction_readahead_size(options.blob_compaction_readahead_size),
105
107
  blob_file_starting_level(options.blob_file_starting_level),
106
- blob_cache(options.blob_cache) {
108
+ blob_cache(options.blob_cache),
109
+ prepopulate_blob_cache(options.prepopulate_blob_cache) {
107
110
  assert(memtable_factory.get() != nullptr);
108
111
  if (max_bytes_for_level_multiplier_additional.size() <
109
112
  static_cast<unsigned int>(num_levels)) {
@@ -398,6 +401,8 @@ void ColumnFamilyOptions::Dump(Logger* log) const {
398
401
  ROCKS_LOG_HEADER(log,
399
402
  " Options.periodic_compaction_seconds: %" PRIu64,
400
403
  periodic_compaction_seconds);
404
+ ROCKS_LOG_HEADER(log, " Options.preclude_last_level_data_seconds: %" PRIu64,
405
+ preclude_last_level_data_seconds);
401
406
  ROCKS_LOG_HEADER(log, " Options.enable_blob_files: %s",
402
407
  enable_blob_files ? "true" : "false");
403
408
  ROCKS_LOG_HEADER(
@@ -424,6 +429,11 @@ void ColumnFamilyOptions::Dump(Logger* log) const {
424
429
  blob_cache->Name());
425
430
  ROCKS_LOG_HEADER(log, " blob_cache options: %s",
426
431
  blob_cache->GetPrintableOptions().c_str());
432
+ ROCKS_LOG_HEADER(
433
+ log, " blob_cache prepopulated: %s",
434
+ prepopulate_blob_cache == PrepopulateBlobCache::kFlushOnly
435
+ ? "flush only"
436
+ : "disabled");
427
437
  }
428
438
  ROCKS_LOG_HEADER(log, "Options.experimental_mempurge_threshold: %f",
429
439
  experimental_mempurge_threshold);
@@ -257,6 +257,7 @@ void UpdateColumnFamilyOptions(const MutableCFOptions& moptions,
257
257
  cf_opts->blob_compaction_readahead_size =
258
258
  moptions.blob_compaction_readahead_size;
259
259
  cf_opts->blob_file_starting_level = moptions.blob_file_starting_level;
260
+ cf_opts->prepopulate_blob_cache = moptions.prepopulate_blob_cache;
260
261
 
261
262
  // Misc options
262
263
  cf_opts->max_sequential_skip_in_iterations =
@@ -306,6 +307,8 @@ void UpdateColumnFamilyOptions(const ImmutableCFOptions& ioptions,
306
307
  cf_opts->compaction_thread_limiter = ioptions.compaction_thread_limiter;
307
308
  cf_opts->sst_partitioner_factory = ioptions.sst_partitioner_factory;
308
309
  cf_opts->blob_cache = ioptions.blob_cache;
310
+ cf_opts->preclude_last_level_data_seconds =
311
+ ioptions.preclude_last_level_data_seconds;
309
312
 
310
313
  // TODO(yhchiang): find some way to handle the following derived options
311
314
  // * max_file_size
@@ -848,6 +851,11 @@ std::unordered_map<std::string, Temperature>
848
851
  {"kWarm", Temperature::kWarm},
849
852
  {"kCold", Temperature::kCold}};
850
853
 
854
+ std::unordered_map<std::string, PrepopulateBlobCache>
855
+ OptionsHelper::prepopulate_blob_cache_string_map = {
856
+ {"kDisable", PrepopulateBlobCache::kDisable},
857
+ {"kFlushOnly", PrepopulateBlobCache::kFlushOnly}};
858
+
851
859
  Status OptionTypeInfo::NextToken(const std::string& opts, char delimiter,
852
860
  size_t pos, size_t* end, std::string* token) {
853
861
  while (pos < opts.size() && isspace(opts[pos])) {
@@ -82,6 +82,8 @@ struct OptionsHelper {
82
82
  static std::unordered_map<std::string, ChecksumType> checksum_type_string_map;
83
83
  static std::unordered_map<std::string, CompressionType>
84
84
  compression_type_string_map;
85
+ static std::unordered_map<std::string, PrepopulateBlobCache>
86
+ prepopulate_blob_cache_string_map;
85
87
  #ifndef ROCKSDB_LITE
86
88
  static std::unordered_map<std::string, CompactionStopStyle>
87
89
  compaction_stop_style_string_map;
@@ -113,6 +115,8 @@ static auto& compaction_style_string_map =
113
115
  static auto& compaction_pri_string_map =
114
116
  OptionsHelper::compaction_pri_string_map;
115
117
  static auto& temperature_string_map = OptionsHelper::temperature_string_map;
118
+ static auto& prepopulate_blob_cache_string_map =
119
+ OptionsHelper::prepopulate_blob_cache_string_map;
116
120
  #endif // !ROCKSDB_LITE
117
121
 
118
122
  } // namespace ROCKSDB_NAMESPACE
@@ -400,6 +400,8 @@ TEST_F(OptionsSettableTest, ColumnFamilyOptionsAllFieldsSettable) {
400
400
  {offsetof(struct ColumnFamilyOptions,
401
401
  table_properties_collector_factories),
402
402
  sizeof(ColumnFamilyOptions::TablePropertiesCollectorFactories)},
403
+ {offsetof(struct ColumnFamilyOptions, preclude_last_level_data_seconds),
404
+ sizeof(uint64_t)},
403
405
  {offsetof(struct ColumnFamilyOptions, blob_cache),
404
406
  sizeof(std::shared_ptr<Cache>)},
405
407
  {offsetof(struct ColumnFamilyOptions, comparator), sizeof(Comparator*)},
@@ -524,7 +526,9 @@ TEST_F(OptionsSettableTest, ColumnFamilyOptionsAllFieldsSettable) {
524
526
  "blob_garbage_collection_force_threshold=0.75;"
525
527
  "blob_compaction_readahead_size=262144;"
526
528
  "blob_file_starting_level=1;"
529
+ "prepopulate_blob_cache=kDisable;"
527
530
  "bottommost_temperature=kWarm;"
531
+ "preclude_last_level_data_seconds=86400;"
528
532
  "compaction_options_fifo={max_table_files_size=3;allow_"
529
533
  "compaction=false;age_for_warm=1;};"
530
534
  "blob_cache=1M;",
@@ -127,6 +127,7 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
127
127
  {"blob_garbage_collection_force_threshold", "0.75"},
128
128
  {"blob_compaction_readahead_size", "256K"},
129
129
  {"blob_file_starting_level", "1"},
130
+ {"prepopulate_blob_cache", "kDisable"},
130
131
  {"bottommost_temperature", "kWarm"},
131
132
  };
132
133
 
@@ -266,6 +267,7 @@ TEST_F(OptionsTest, GetOptionsFromMapTest) {
266
267
  ASSERT_EQ(new_cf_opt.blob_garbage_collection_force_threshold, 0.75);
267
268
  ASSERT_EQ(new_cf_opt.blob_compaction_readahead_size, 262144);
268
269
  ASSERT_EQ(new_cf_opt.blob_file_starting_level, 1);
270
+ ASSERT_EQ(new_cf_opt.prepopulate_blob_cache, PrepopulateBlobCache::kDisable);
269
271
  ASSERT_EQ(new_cf_opt.bottommost_temperature, Temperature::kWarm);
270
272
 
271
273
  cf_options_map["write_buffer_size"] = "hello";
@@ -2356,6 +2358,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
2356
2358
  {"blob_garbage_collection_force_threshold", "0.75"},
2357
2359
  {"blob_compaction_readahead_size", "256K"},
2358
2360
  {"blob_file_starting_level", "1"},
2361
+ {"prepopulate_blob_cache", "kDisable"},
2359
2362
  {"bottommost_temperature", "kWarm"},
2360
2363
  };
2361
2364
 
@@ -2489,6 +2492,7 @@ TEST_F(OptionsOldApiTest, GetOptionsFromMapTest) {
2489
2492
  ASSERT_EQ(new_cf_opt.blob_garbage_collection_force_threshold, 0.75);
2490
2493
  ASSERT_EQ(new_cf_opt.blob_compaction_readahead_size, 262144);
2491
2494
  ASSERT_EQ(new_cf_opt.blob_file_starting_level, 1);
2495
+ ASSERT_EQ(new_cf_opt.prepopulate_blob_cache, PrepopulateBlobCache::kDisable);
2492
2496
  ASSERT_EQ(new_cf_opt.bottommost_temperature, Temperature::kWarm);
2493
2497
 
2494
2498
  cf_options_map["write_buffer_size"] = "hello";
@@ -4,6 +4,7 @@ LIB_SOURCES = \
4
4
  cache/cache_entry_roles.cc \
5
5
  cache/cache_key.cc \
6
6
  cache/cache_reservation_manager.cc \
7
+ cache/charged_cache.cc \
7
8
  cache/clock_cache.cc \
8
9
  cache/fast_lru_cache.cc \
9
10
  cache/lru_cache.cc \
@@ -76,6 +77,7 @@ LIB_SOURCES = \
76
77
  db/range_del_aggregator.cc \
77
78
  db/range_tombstone_fragmenter.cc \
78
79
  db/repair.cc \
80
+ db/seqno_to_time_mapping.cc \
79
81
  db/snapshot_impl.cc \
80
82
  db/table_cache.cc \
81
83
  db/table_properties_collector.cc \
@@ -503,6 +505,7 @@ TEST_MAIN_SOURCES = \
503
505
  db/repair_test.cc \
504
506
  db/range_del_aggregator_test.cc \
505
507
  db/range_tombstone_fragmenter_test.cc \
508
+ db/seqno_time_test.cc \
506
509
  db/table_properties_collector_test.cc \
507
510
  db/version_builder_test.cc \
508
511
  db/version_edit_test.cc \
@@ -541,7 +541,6 @@ struct BlockBasedTableBuilder::Rep {
541
541
  // These are only needed for populating table properties
542
542
  props.column_family_id = tbo.column_family_id;
543
543
  props.column_family_name = tbo.column_family_name;
544
- props.creation_time = tbo.creation_time;
545
544
  props.oldest_key_time = tbo.oldest_key_time;
546
545
  props.file_creation_time = tbo.file_creation_time;
547
546
  props.orig_file_number = tbo.cur_file_num;
@@ -2084,6 +2083,12 @@ const char* BlockBasedTableBuilder::GetFileChecksumFuncName() const {
2084
2083
  return kUnknownFileChecksumFuncName;
2085
2084
  }
2086
2085
  }
2086
+ void BlockBasedTableBuilder::SetSeqnoTimeTableProperties(
2087
+ const std::string& encoded_seqno_to_time_mapping,
2088
+ uint64_t oldest_ancestor_time) {
2089
+ rep_->props.seqno_to_time_mapping = encoded_seqno_to_time_mapping;
2090
+ rep_->props.creation_time = oldest_ancestor_time;
2091
+ }
2087
2092
 
2088
2093
  const std::string BlockBasedTable::kObsoleteFilterBlockPrefix = "filter.";
2089
2094
  const std::string BlockBasedTable::kFullFilterBlockPrefix = "fullfilter.";
@@ -100,6 +100,10 @@ class BlockBasedTableBuilder : public TableBuilder {
100
100
  // Get file checksum function name
101
101
  const char* GetFileChecksumFuncName() const override;
102
102
 
103
+ void SetSeqnoTimeTableProperties(
104
+ const std::string& encoded_seqno_to_time_mapping,
105
+ uint64_t oldest_ancestor_time) override;
106
+
103
107
  private:
104
108
  bool ok() const { return status().ok(); }
105
109
 
@@ -695,12 +695,13 @@ Status BlockBasedTableFactory::ValidateOptions(
695
695
  static const std::set<CacheEntryRole> kMemoryChargingSupported = {
696
696
  CacheEntryRole::kCompressionDictionaryBuildingBuffer,
697
697
  CacheEntryRole::kFilterConstruction,
698
- CacheEntryRole::kBlockBasedTableReader, CacheEntryRole::kFileMetadata};
698
+ CacheEntryRole::kBlockBasedTableReader, CacheEntryRole::kFileMetadata,
699
+ CacheEntryRole::kBlobCache};
699
700
  if (options.charged != CacheEntryRoleOptions::Decision::kFallback &&
700
701
  kMemoryChargingSupported.count(role) == 0) {
701
702
  return Status::NotSupported(
702
703
  "Enable/Disable CacheEntryRoleOptions::charged"
703
- "for CacheEntryRole " +
704
+ " for CacheEntryRole " +
704
705
  kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
705
706
  " is not supported");
706
707
  }
@@ -708,10 +709,42 @@ Status BlockBasedTableFactory::ValidateOptions(
708
709
  options.charged == CacheEntryRoleOptions::Decision::kEnabled) {
709
710
  return Status::InvalidArgument(
710
711
  "Enable CacheEntryRoleOptions::charged"
711
- "for CacheEntryRole " +
712
+ " for CacheEntryRole " +
712
713
  kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
713
714
  " but block cache is disabled");
714
715
  }
716
+ if (role == CacheEntryRole::kBlobCache &&
717
+ options.charged == CacheEntryRoleOptions::Decision::kEnabled) {
718
+ if (cf_opts.blob_cache == nullptr) {
719
+ return Status::InvalidArgument(
720
+ "Enable CacheEntryRoleOptions::charged"
721
+ " for CacheEntryRole " +
722
+ kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
723
+ " but blob cache is not configured");
724
+ }
725
+ if (table_options_.no_block_cache) {
726
+ return Status::InvalidArgument(
727
+ "Enable CacheEntryRoleOptions::charged"
728
+ " for CacheEntryRole " +
729
+ kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
730
+ " but block cache is disabled");
731
+ }
732
+ if (table_options_.block_cache == cf_opts.blob_cache) {
733
+ return Status::InvalidArgument(
734
+ "Enable CacheEntryRoleOptions::charged"
735
+ " for CacheEntryRole " +
736
+ kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
737
+ " but blob cache is the same as block cache");
738
+ }
739
+ if (cf_opts.blob_cache->GetCapacity() >
740
+ table_options_.block_cache->GetCapacity()) {
741
+ return Status::InvalidArgument(
742
+ "Enable CacheEntryRoleOptions::charged"
743
+ " for CacheEntryRole " +
744
+ kCacheEntryRoleToCamelString[static_cast<uint32_t>(role)] +
745
+ " but blob cache capacity is larger than block cache capacity");
746
+ }
747
+ }
715
748
  }
716
749
  {
717
750
  Status s = CheckCacheOptionCompatibility(table_options_);
@@ -10,11 +10,12 @@
10
10
  #include "table/block_based/index_builder.h"
11
11
 
12
12
  #include <assert.h>
13
- #include <cinttypes>
14
13
 
14
+ #include <cinttypes>
15
15
  #include <list>
16
16
  #include <string>
17
17
 
18
+ #include "db/dbformat.h"
18
19
  #include "rocksdb/comparator.h"
19
20
  #include "rocksdb/flush_block_policy.h"
20
21
  #include "table/block_based/partitioned_filter_block.h"
@@ -68,6 +69,40 @@ IndexBuilder* IndexBuilder::CreateIndexBuilder(
68
69
  return result;
69
70
  }
70
71
 
72
+ void ShortenedIndexBuilder::FindShortestInternalKeySeparator(
73
+ const Comparator& comparator, std::string* start, const Slice& limit) {
74
+ // Attempt to shorten the user portion of the key
75
+ Slice user_start = ExtractUserKey(*start);
76
+ Slice user_limit = ExtractUserKey(limit);
77
+ std::string tmp(user_start.data(), user_start.size());
78
+ comparator.FindShortestSeparator(&tmp, user_limit);
79
+ if (tmp.size() <= user_start.size() &&
80
+ comparator.Compare(user_start, tmp) < 0) {
81
+ // User key has become shorter physically, but larger logically.
82
+ // Tack on the earliest possible number to the shortened user key.
83
+ PutFixed64(&tmp,
84
+ PackSequenceAndType(kMaxSequenceNumber, kValueTypeForSeek));
85
+ assert(InternalKeyComparator(&comparator).Compare(*start, tmp) < 0);
86
+ assert(InternalKeyComparator(&comparator).Compare(tmp, limit) < 0);
87
+ start->swap(tmp);
88
+ }
89
+ }
90
+
91
+ void ShortenedIndexBuilder::FindShortInternalKeySuccessor(
92
+ const Comparator& comparator, std::string* key) {
93
+ Slice user_key = ExtractUserKey(*key);
94
+ std::string tmp(user_key.data(), user_key.size());
95
+ comparator.FindShortSuccessor(&tmp);
96
+ if (tmp.size() <= user_key.size() && comparator.Compare(user_key, tmp) < 0) {
97
+ // User key has become shorter physically, but larger logically.
98
+ // Tack on the earliest possible number to the shortened user key.
99
+ PutFixed64(&tmp,
100
+ PackSequenceAndType(kMaxSequenceNumber, kValueTypeForSeek));
101
+ assert(InternalKeyComparator(&comparator).Compare(*key, tmp) < 0);
102
+ key->swap(tmp);
103
+ }
104
+ }
105
+
71
106
  PartitionedIndexBuilder* PartitionedIndexBuilder::CreateIndexBuilder(
72
107
  const InternalKeyComparator* comparator,
73
108
  const bool use_value_delta_encoding,
@@ -152,8 +152,9 @@ class ShortenedIndexBuilder : public IndexBuilder {
152
152
  if (first_key_in_next_block != nullptr) {
153
153
  if (shortening_mode_ !=
154
154
  BlockBasedTableOptions::IndexShorteningMode::kNoShortening) {
155
- comparator_->FindShortestSeparator(last_key_in_current_block,
156
- *first_key_in_next_block);
155
+ FindShortestInternalKeySeparator(*comparator_->user_comparator(),
156
+ last_key_in_current_block,
157
+ *first_key_in_next_block);
157
158
  }
158
159
  if (!seperator_is_key_plus_seq_ &&
159
160
  comparator_->user_comparator()->Compare(
@@ -164,7 +165,8 @@ class ShortenedIndexBuilder : public IndexBuilder {
164
165
  } else {
165
166
  if (shortening_mode_ == BlockBasedTableOptions::IndexShorteningMode::
166
167
  kShortenSeparatorsAndSuccessor) {
167
- comparator_->FindShortSuccessor(last_key_in_current_block);
168
+ FindShortInternalKeySuccessor(*comparator_->user_comparator(),
169
+ last_key_in_current_block);
168
170
  }
169
171
  }
170
172
  auto sep = Slice(*last_key_in_current_block);
@@ -212,6 +214,15 @@ class ShortenedIndexBuilder : public IndexBuilder {
212
214
  return seperator_is_key_plus_seq_;
213
215
  }
214
216
 
217
+ // Changes *key to a short string >= *key.
218
+ //
219
+ static void FindShortestInternalKeySeparator(const Comparator& comparator,
220
+ std::string* start,
221
+ const Slice& limit);
222
+
223
+ static void FindShortInternalKeySuccessor(const Comparator& comparator,
224
+ std::string* key);
225
+
215
226
  friend class PartitionedIndexBuilder;
216
227
 
217
228
  private:
@@ -187,7 +187,7 @@ class InternalIteratorBase : public Cleanable {
187
187
  virtual void SetReadaheadState(ReadaheadFileInfo* /*readahead_file_info*/) {}
188
188
 
189
189
  protected:
190
- void SeekForPrevImpl(const Slice& target, const Comparator* cmp) {
190
+ void SeekForPrevImpl(const Slice& target, const CompareInterface* cmp) {
191
191
  Seek(target);
192
192
  if (!Valid()) {
193
193
  SeekToLast();
@@ -154,6 +154,10 @@ void PropertyBlockBuilder::AddTableProperty(const TableProperties& props) {
154
154
  if (!props.compression_options.empty()) {
155
155
  Add(TablePropertiesNames::kCompressionOptions, props.compression_options);
156
156
  }
157
+ if (!props.seqno_to_time_mapping.empty()) {
158
+ Add(TablePropertiesNames::kSequenceNumberTimeMapping,
159
+ props.seqno_to_time_mapping);
160
+ }
157
161
  }
158
162
 
159
163
  Slice PropertyBlockBuilder::Finish() {
@@ -369,6 +373,8 @@ Status ReadTablePropertiesHelper(
369
373
  new_table_properties->compression_name = raw_val.ToString();
370
374
  } else if (key == TablePropertiesNames::kCompressionOptions) {
371
375
  new_table_properties->compression_options = raw_val.ToString();
376
+ } else if (key == TablePropertiesNames::kSequenceNumberTimeMapping) {
377
+ new_table_properties->seqno_to_time_mapping = raw_val.ToString();
372
378
  } else {
373
379
  // handle user-collected properties
374
380
  new_table_properties->user_collected_properties.insert(
@@ -330,6 +330,11 @@ const char* PlainTableBuilder::GetFileChecksumFuncName() const {
330
330
  return kUnknownFileChecksumFuncName;
331
331
  }
332
332
  }
333
+ void PlainTableBuilder::SetSeqnoTimeTableProperties(const std::string& string,
334
+ uint64_t uint_64) {
335
+ // TODO: storing seqno to time mapping is not yet support for plain table.
336
+ TableBuilder::SetSeqnoTimeTableProperties(string, uint_64);
337
+ }
333
338
 
334
339
  } // namespace ROCKSDB_NAMESPACE
335
340
  #endif // ROCKSDB_LITE
@@ -94,6 +94,9 @@ class PlainTableBuilder: public TableBuilder {
94
94
  // Get file checksum function name
95
95
  const char* GetFileChecksumFuncName() const override;
96
96
 
97
+ void SetSeqnoTimeTableProperties(const std::string& string,
98
+ uint64_t uint_64) override;
99
+
97
100
  private:
98
101
  Arena arena_;
99
102
  const ImmutableOptions& ioptions_;
@@ -100,7 +100,7 @@ struct SstFileWriter::Rep {
100
100
  }
101
101
 
102
102
  Status Add(const Slice& user_key, const Slice& value, ValueType value_type) {
103
- if (internal_comparator.timestamp_size() != 0) {
103
+ if (internal_comparator.user_comparator()->timestamp_size() != 0) {
104
104
  return Status::InvalidArgument("Timestamp size mismatch");
105
105
  }
106
106
 
@@ -111,7 +111,8 @@ struct SstFileWriter::Rep {
111
111
  ValueType value_type) {
112
112
  const size_t timestamp_size = timestamp.size();
113
113
 
114
- if (internal_comparator.timestamp_size() != timestamp_size) {
114
+ if (internal_comparator.user_comparator()->timestamp_size() !=
115
+ timestamp_size) {
115
116
  return Status::InvalidArgument("Timestamp size mismatch");
116
117
  }
117
118
 
@@ -131,7 +132,7 @@ struct SstFileWriter::Rep {
131
132
  }
132
133
 
133
134
  Status DeleteRange(const Slice& begin_key, const Slice& end_key) {
134
- if (internal_comparator.timestamp_size() != 0) {
135
+ if (internal_comparator.user_comparator()->timestamp_size() != 0) {
135
136
  return Status::InvalidArgument("Timestamp size mismatch");
136
137
  }
137
138
 
@@ -278,14 +279,16 @@ Status SstFileWriter::Open(const std::string& file_path) {
278
279
  r->column_family_name = "";
279
280
  cf_id = TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
280
281
  }
282
+
283
+ // TODO: it would be better to set oldest_key_time to be used for getting the
284
+ // approximate time of ingested keys.
281
285
  TableBuilderOptions table_builder_options(
282
286
  r->ioptions, r->mutable_cf_options, r->internal_comparator,
283
287
  &int_tbl_prop_collector_factories, compression_type, compression_opts,
284
288
  cf_id, r->column_family_name, unknown_level, false /* is_bottommost */,
285
- TableFileCreationReason::kMisc, 0 /* creation_time */,
286
- 0 /* oldest_key_time */, 0 /* file_creation_time */,
287
- "SST Writer" /* db_id */, r->db_session_id, 0 /* target_file_size */,
288
- r->next_file_number);
289
+ TableFileCreationReason::kMisc, 0 /* oldest_key_time */,
290
+ 0 /* file_creation_time */, "SST Writer" /* db_id */, r->db_session_id,
291
+ 0 /* target_file_size */, r->next_file_number);
289
292
  // External SST files used to each get a unique session id. Now for
290
293
  // slightly better uniqueness probability in constructing cache keys, we
291
294
  // assign fake file numbers to each file (into table properties) and keep
@@ -16,6 +16,7 @@
16
16
  #include <vector>
17
17
 
18
18
  #include "db/dbformat.h"
19
+ #include "db/seqno_to_time_mapping.h"
19
20
  #include "db/table_properties_collector.h"
20
21
  #include "file/writable_file_writer.h"
21
22
  #include "options/cf_options.h"
@@ -109,7 +110,7 @@ struct TableBuilderOptions {
109
110
  const std::string& _column_family_name, int _level,
110
111
  bool _is_bottommost = false,
111
112
  TableFileCreationReason _reason = TableFileCreationReason::kMisc,
112
- const uint64_t _creation_time = 0, const int64_t _oldest_key_time = 0,
113
+ const int64_t _oldest_key_time = 0,
113
114
  const uint64_t _file_creation_time = 0, const std::string& _db_id = "",
114
115
  const std::string& _db_session_id = "",
115
116
  const uint64_t _target_file_size = 0, const uint64_t _cur_file_num = 0)
@@ -121,7 +122,6 @@ struct TableBuilderOptions {
121
122
  compression_opts(_compression_opts),
122
123
  column_family_id(_column_family_id),
123
124
  column_family_name(_column_family_name),
124
- creation_time(_creation_time),
125
125
  oldest_key_time(_oldest_key_time),
126
126
  target_file_size(_target_file_size),
127
127
  file_creation_time(_file_creation_time),
@@ -140,7 +140,6 @@ struct TableBuilderOptions {
140
140
  const CompressionOptions& compression_opts;
141
141
  const uint32_t column_family_id;
142
142
  const std::string& column_family_name;
143
- const uint64_t creation_time;
144
143
  const int64_t oldest_key_time;
145
144
  const uint64_t target_file_size;
146
145
  const uint64_t file_creation_time;
@@ -222,6 +221,11 @@ class TableBuilder {
222
221
 
223
222
  // Return file checksum function name
224
223
  virtual const char* GetFileChecksumFuncName() const = 0;
224
+
225
+ // Set the sequence number to time mapping
226
+ virtual void SetSeqnoTimeTableProperties(
227
+ const std::string& /*encoded_seqno_to_time_mapping*/,
228
+ uint64_t /*oldest_ancestor_time*/){};
225
229
  };
226
230
 
227
231
  } // namespace ROCKSDB_NAMESPACE