@nxtedition/rocksdb 7.0.27 → 7.0.30
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.
- package/binding.cc +170 -30
- package/chained-batch.js +1 -1
- package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -0
- package/deps/rocksdb/rocksdb/Makefile +3 -0
- package/deps/rocksdb/rocksdb/TARGETS +10 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +17 -7
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +1 -0
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +117 -0
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +121 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +270 -180
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +412 -124
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +1 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +71 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +11 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +21 -14
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +68 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +16 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +519 -12
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +120 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +15 -5
- package/deps/rocksdb/rocksdb/db/builder.h +3 -0
- package/deps/rocksdb/rocksdb/db/c.cc +18 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +18 -0
- package/deps/rocksdb/rocksdb/db/column_family.h +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +3 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +9 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +15 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +36 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +50 -13
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +12 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -17
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +26 -9
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +0 -11
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +93 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +16 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_test.cc +0 -3
- package/deps/rocksdb/rocksdb/db/db_test2.cc +39 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +9 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +2 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +0 -38
- package/deps/rocksdb/rocksdb/db/dbformat.h +14 -13
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +5 -2
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +13 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +0 -10
- package/deps/rocksdb/rocksdb/db/flush_job.cc +19 -15
- package/deps/rocksdb/rocksdb/db/flush_job.h +7 -0
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +21 -15
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +4 -3
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +9 -0
- package/deps/rocksdb/rocksdb/db/memtable_list.h +5 -0
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +53 -12
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +14 -2
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/repair.cc +8 -6
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +890 -0
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +324 -0
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +186 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +23 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +74 -1
- package/deps/rocksdb/rocksdb/env/io_posix.cc +11 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +28 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +30 -23
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +3 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/cf_options.cc +14 -1
- package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -56
- package/deps/rocksdb/rocksdb/options/db_options.cc +4 -5
- package/deps/rocksdb/rocksdb/options/options.cc +11 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -0
- package/deps/rocksdb/rocksdb/options/options_helper.h +4 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +4 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +36 -3
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +36 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +14 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +5 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -7
- package/deps/rocksdb/rocksdb/table/table_builder.h +7 -3
- package/deps/rocksdb/rocksdb/table/table_properties.cc +9 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +3 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +58 -30
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +20 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +29 -154
- package/deps/rocksdb/rocksdb/util/rate_limiter.h +16 -34
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +0 -92
- package/deps/rocksdb/rocksdb/util/timer.h +6 -0
- package/deps/rocksdb/rocksdb/util/vector_iterator.h +4 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -45
- package/deps/rocksdb/rocksdb/utilities/debug.cc +40 -0
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/index.js +19 -2
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/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
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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_->
|
|
156
|
-
|
|
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_->
|
|
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
|
|
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() !=
|
|
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 /*
|
|
286
|
-
0 /*
|
|
287
|
-
|
|
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
|
|
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
|