@nxtedition/rocksdb 7.1.14 → 7.1.16
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 +1 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
- package/deps/rocksdb/rocksdb/Makefile +91 -11
- package/deps/rocksdb/rocksdb/TARGETS +8 -4
- package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
- package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
- package/deps/rocksdb/rocksdb/db/c.cc +29 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
- package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
- package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
- package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
- package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
- package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
- package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
- package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
- package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
- package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
- package/deps/rocksdb/rocksdb/file/filename.h +4 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
- package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options.cc +2 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
- package/deps/rocksdb/rocksdb/src.mk +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +26 -29
- package/deps/rocksdb/rocksdb/table/format.h +44 -26
- package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
- package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
- package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
- package/deps/rocksdb/rocksdb/util/timer.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
- package/deps/rocksdb/rocksdb.gyp +0 -1
- package/index.js +6 -10
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
|
@@ -101,7 +101,7 @@ DEFINE_bool(convert_to_human_readable_trace, false,
|
|
|
101
101
|
"You can specify 'no_key' to reduce the size, if key is not "
|
|
102
102
|
"needed in the next step.\n"
|
|
103
103
|
"File name: <prefix>_human_readable_trace.txt\n"
|
|
104
|
-
"Format:[type_id cf_id value_size time_in_micorsec
|
|
104
|
+
"Format:[<key> type_id cf_id value_size time_in_micorsec].");
|
|
105
105
|
DEFINE_bool(output_qps_stats, false,
|
|
106
106
|
"Output the query per second(qps) statistics \n"
|
|
107
107
|
"For the overall qps, it will contain all qps of each query type. "
|
|
@@ -299,6 +299,16 @@ class autovector {
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
template <class... Args>
|
|
302
|
+
#if _LIBCPP_STD_VER > 14
|
|
303
|
+
reference emplace_back(Args&&... args) {
|
|
304
|
+
if (num_stack_items_ < kSize) {
|
|
305
|
+
return *(new ((void*)(&values_[num_stack_items_++]))
|
|
306
|
+
value_type(std::forward<Args>(args)...));
|
|
307
|
+
} else {
|
|
308
|
+
return vect_.emplace_back(std::forward<Args>(args)...);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
#else
|
|
302
312
|
void emplace_back(Args&&... args) {
|
|
303
313
|
if (num_stack_items_ < kSize) {
|
|
304
314
|
new ((void*)(&values_[num_stack_items_++]))
|
|
@@ -307,6 +317,8 @@ class autovector {
|
|
|
307
317
|
vect_.emplace_back(std::forward<Args>(args)...);
|
|
308
318
|
}
|
|
309
319
|
}
|
|
320
|
+
#endif
|
|
321
|
+
|
|
310
322
|
|
|
311
323
|
void pop_back() {
|
|
312
324
|
assert(!empty());
|
|
@@ -344,9 +344,10 @@ TEST_F(RateLimiterTest, Rate) {
|
|
|
344
344
|
}
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
-
// This can fail
|
|
347
|
+
// This can fail due to slow execution speed, like when using valgrind or in
|
|
348
|
+
// heavily loaded CI environments
|
|
348
349
|
bool skip_minimum_rate_check =
|
|
349
|
-
#if defined(CIRCLECI) && defined(OS_MACOSX)
|
|
350
|
+
#if (defined(CIRCLECI) && defined(OS_MACOSX)) || defined(ROCKSDB_VALGRIND_RUN)
|
|
350
351
|
true;
|
|
351
352
|
#else
|
|
352
353
|
getenv("SANDCASTLE");
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
7
|
+
#include "util/stderr_logger.h"
|
|
8
|
+
|
|
9
|
+
#include "port/sys_time.h"
|
|
10
|
+
|
|
11
|
+
namespace ROCKSDB_NAMESPACE {
|
|
12
|
+
StderrLogger::~StderrLogger() {}
|
|
13
|
+
|
|
14
|
+
void StderrLogger::Logv(const char* format, va_list ap) {
|
|
15
|
+
const uint64_t thread_id = Env::Default()->GetThreadID();
|
|
16
|
+
|
|
17
|
+
port::TimeVal now_tv;
|
|
18
|
+
port::GetTimeOfDay(&now_tv, nullptr);
|
|
19
|
+
const time_t seconds = now_tv.tv_sec;
|
|
20
|
+
struct tm t;
|
|
21
|
+
port::LocalTimeR(&seconds, &t);
|
|
22
|
+
fprintf(stderr, "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ", t.tm_year + 1900,
|
|
23
|
+
t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
|
|
24
|
+
static_cast<int>(now_tv.tv_usec),
|
|
25
|
+
static_cast<long long unsigned int>(thread_id));
|
|
26
|
+
|
|
27
|
+
vfprintf(stderr, format, ap);
|
|
28
|
+
fprintf(stderr, "\n");
|
|
29
|
+
}
|
|
30
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// Copyright (c)
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
2
3
|
// This source code is licensed under both the GPLv2 (found in the
|
|
3
4
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
5
|
// (found in the LICENSE.Apache file in the root directory).
|
|
@@ -8,7 +9,6 @@
|
|
|
8
9
|
#include <stdarg.h>
|
|
9
10
|
#include <stdio.h>
|
|
10
11
|
|
|
11
|
-
#include "port/sys_time.h"
|
|
12
12
|
#include "rocksdb/env.h"
|
|
13
13
|
|
|
14
14
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -19,26 +19,13 @@ class StderrLogger : public Logger {
|
|
|
19
19
|
explicit StderrLogger(const InfoLogLevel log_level = InfoLogLevel::INFO_LEVEL)
|
|
20
20
|
: Logger(log_level) {}
|
|
21
21
|
|
|
22
|
+
~StderrLogger() override;
|
|
23
|
+
|
|
22
24
|
// Brings overloaded Logv()s into scope so they're not hidden when we override
|
|
23
25
|
// a subset of them.
|
|
24
26
|
using Logger::Logv;
|
|
25
27
|
|
|
26
|
-
virtual void Logv(const char* format, va_list ap) override
|
|
27
|
-
const uint64_t thread_id = Env::Default()->GetThreadID();
|
|
28
|
-
|
|
29
|
-
port::TimeVal now_tv;
|
|
30
|
-
port::GetTimeOfDay(&now_tv, nullptr);
|
|
31
|
-
const time_t seconds = now_tv.tv_sec;
|
|
32
|
-
struct tm t;
|
|
33
|
-
port::LocalTimeR(&seconds, &t);
|
|
34
|
-
fprintf(stderr, "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ",
|
|
35
|
-
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
|
|
36
|
-
t.tm_sec, static_cast<int>(now_tv.tv_usec),
|
|
37
|
-
static_cast<long long unsigned int>(thread_id));
|
|
38
|
-
|
|
39
|
-
vfprintf(stderr, format, ap);
|
|
40
|
-
fprintf(stderr, "\n");
|
|
41
|
-
}
|
|
28
|
+
virtual void Logv(const char* format, va_list ap) override;
|
|
42
29
|
};
|
|
43
30
|
|
|
44
31
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -187,10 +187,9 @@ class Timer {
|
|
|
187
187
|
return ret;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
void TEST_OverrideTimer(SystemClock* clock) {
|
|
191
191
|
InstrumentedMutexLock l(&mutex_);
|
|
192
|
-
|
|
193
|
-
return it != map_.end() && it->second->IsValid();
|
|
192
|
+
clock_ = clock;
|
|
194
193
|
}
|
|
195
194
|
#endif // NDEBUG
|
|
196
195
|
|
|
@@ -2083,6 +2083,10 @@ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsOldFileNaming) {
|
|
|
2083
2083
|
});
|
|
2084
2084
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
2085
2085
|
|
|
2086
|
+
// Corrupting the table properties corrupts the unique id.
|
|
2087
|
+
// Ignore the unique id recorded in the manifest.
|
|
2088
|
+
options_.verify_sst_unique_id_in_manifest = false;
|
|
2089
|
+
|
|
2086
2090
|
OpenDBAndBackupEngine(true, false, kShareWithChecksum);
|
|
2087
2091
|
FillDB(db_.get(), 0, keys_iteration);
|
|
2088
2092
|
CloseDBAndBackupEngine();
|
|
@@ -2984,9 +2988,12 @@ TEST_F(BackupEngineTest, ReadOnlyBackupEngine) {
|
|
|
2984
2988
|
DestroyDBWithoutCheck(dbname_, options_);
|
|
2985
2989
|
OpenDBAndBackupEngine(true);
|
|
2986
2990
|
FillDB(db_.get(), 0, 100);
|
|
2987
|
-
|
|
2991
|
+
// Also test read-only DB with CreateNewBackup and flush=true (no flush)
|
|
2992
|
+
CloseAndReopenDB(/*read_only*/ true);
|
|
2993
|
+
ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
|
|
2994
|
+
CloseAndReopenDB(/*read_only*/ false);
|
|
2988
2995
|
FillDB(db_.get(), 100, 200);
|
|
2989
|
-
ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
|
|
2996
|
+
ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
|
|
2990
2997
|
CloseDBAndBackupEngine();
|
|
2991
2998
|
DestroyDBWithoutCheck(dbname_, options_);
|
|
2992
2999
|
|
|
@@ -1165,7 +1165,7 @@ Status BlobDBImpl::DecompressSlice(const Slice& compressed_value,
|
|
|
1165
1165
|
UncompressionContext context(compression_type);
|
|
1166
1166
|
UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
|
|
1167
1167
|
compression_type);
|
|
1168
|
-
Status s =
|
|
1168
|
+
Status s = UncompressBlockData(
|
|
1169
1169
|
info, compressed_value.data(), compressed_value.size(), &contents,
|
|
1170
1170
|
kBlockBasedTableVersionFormat, *(cfh->cfd()->ioptions()));
|
|
1171
1171
|
if (!s.ok()) {
|
|
@@ -213,7 +213,7 @@ Status BlobDumpTool::DumpRecord(DisplayType show_key, DisplayType show_blob,
|
|
|
213
213
|
UncompressionContext context(compression);
|
|
214
214
|
UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
|
|
215
215
|
compression);
|
|
216
|
-
s =
|
|
216
|
+
s = UncompressBlockData(
|
|
217
217
|
info, slice.data() + key_size, static_cast<size_t>(value_size),
|
|
218
218
|
&contents, 2 /*compress_format_version*/, ImmutableOptions(Options()));
|
|
219
219
|
if (!s.ok()) {
|
|
@@ -175,33 +175,33 @@ CacheDumperImpl::DumpOneBlockCallBack() {
|
|
|
175
175
|
// Step 4: if the block should not be filter out, write the block to the
|
|
176
176
|
// CacheDumpWriter
|
|
177
177
|
if (!filter_out && block_start != nullptr) {
|
|
178
|
-
|
|
179
|
-
memcpy(buffer, block_start, block_len);
|
|
180
|
-
WriteCacheBlock(type, key, (void*)buffer, block_len)
|
|
178
|
+
WriteBlock(type, key, Slice(block_start, block_len))
|
|
181
179
|
.PermitUncheckedError();
|
|
182
|
-
delete[] buffer;
|
|
183
180
|
}
|
|
184
181
|
};
|
|
185
182
|
}
|
|
186
|
-
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
// the
|
|
183
|
+
|
|
184
|
+
// Write the block to the writer. It takes the timestamp of the
|
|
185
|
+
// block being copied from block cache, block type, key, block pointer,
|
|
186
|
+
// block size and block checksum as the input. When writing the dumper raw
|
|
187
|
+
// block, we first create the dump unit and encoude it to a string. Then,
|
|
188
|
+
// we calculate the checksum of the whole dump unit string and store it in
|
|
189
|
+
// the dump unit metadata.
|
|
191
190
|
// First, we write the metadata first, which is a fixed size string. Then, we
|
|
192
191
|
// Append the dump unit string to the writer.
|
|
193
|
-
IOStatus CacheDumperImpl::
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
192
|
+
IOStatus CacheDumperImpl::WriteBlock(CacheDumpUnitType type, const Slice& key,
|
|
193
|
+
const Slice& value) {
|
|
194
|
+
uint64_t timestamp = clock_->NowMicros();
|
|
195
|
+
uint32_t value_checksum = crc32c::Value(value.data(), value.size());
|
|
196
|
+
|
|
197
|
+
// First, serialize the block information in a string
|
|
198
198
|
DumpUnit dump_unit;
|
|
199
199
|
dump_unit.timestamp = timestamp;
|
|
200
200
|
dump_unit.key = key;
|
|
201
201
|
dump_unit.type = type;
|
|
202
|
-
dump_unit.value_len =
|
|
203
|
-
dump_unit.value = value;
|
|
204
|
-
dump_unit.value_checksum =
|
|
202
|
+
dump_unit.value_len = value.size();
|
|
203
|
+
dump_unit.value = const_cast<char*>(value.data());
|
|
204
|
+
dump_unit.value_checksum = value_checksum;
|
|
205
205
|
std::string encoded_data;
|
|
206
206
|
CacheDumperHelper::EncodeDumpUnit(dump_unit, &encoded_data);
|
|
207
207
|
|
|
@@ -212,19 +212,19 @@ IOStatus CacheDumperImpl::WriteRawBlock(uint64_t timestamp,
|
|
|
212
212
|
unit_meta.sequence_num = sequence_num_;
|
|
213
213
|
sequence_num_++;
|
|
214
214
|
unit_meta.dump_unit_checksum =
|
|
215
|
-
crc32c::Value(encoded_data.
|
|
216
|
-
unit_meta.dump_unit_size =
|
|
215
|
+
crc32c::Value(encoded_data.data(), encoded_data.size());
|
|
216
|
+
unit_meta.dump_unit_size = encoded_data.size();
|
|
217
217
|
std::string encoded_meta;
|
|
218
218
|
CacheDumperHelper::EncodeDumpUnitMeta(unit_meta, &encoded_meta);
|
|
219
219
|
|
|
220
220
|
// We write the metadata first.
|
|
221
221
|
assert(writer_ != nullptr);
|
|
222
|
-
IOStatus io_s = writer_->WriteMetadata(
|
|
222
|
+
IOStatus io_s = writer_->WriteMetadata(encoded_meta);
|
|
223
223
|
if (!io_s.ok()) {
|
|
224
224
|
return io_s;
|
|
225
225
|
}
|
|
226
226
|
// followed by the dump unit.
|
|
227
|
-
return writer_->WritePacket(
|
|
227
|
+
return writer_->WritePacket(encoded_data);
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
// Before we write any block, we write the header first to store the cache dump
|
|
@@ -238,38 +238,18 @@ IOStatus CacheDumperImpl::WriteHeader() {
|
|
|
238
238
|
<< "RocksDB Version: " << kMajorVersion << "." << kMinorVersion << "\t"
|
|
239
239
|
<< "Format: dump_unit_metadata <sequence_number, dump_unit_checksum, "
|
|
240
240
|
"dump_unit_size>, dump_unit <timestamp, key, block_type, "
|
|
241
|
-
"block_size,
|
|
241
|
+
"block_size, block_data, block_checksum> cache_value\n";
|
|
242
242
|
std::string header_value(s.str());
|
|
243
243
|
CacheDumpUnitType type = CacheDumpUnitType::kHeader;
|
|
244
|
-
|
|
245
|
-
uint32_t header_checksum =
|
|
246
|
-
crc32c::Value(header_value.c_str(), header_value.size());
|
|
247
|
-
return WriteRawBlock(timestamp, type, Slice(header_key),
|
|
248
|
-
(void*)header_value.c_str(), header_value.size(),
|
|
249
|
-
header_checksum);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Write the block dumped from cache
|
|
253
|
-
IOStatus CacheDumperImpl::WriteCacheBlock(const CacheDumpUnitType type,
|
|
254
|
-
const Slice& key, void* value,
|
|
255
|
-
size_t len) {
|
|
256
|
-
uint64_t timestamp = clock_->NowMicros();
|
|
257
|
-
uint32_t value_checksum = crc32c::Value((char*)value, len);
|
|
258
|
-
return WriteRawBlock(timestamp, type, key, value, len, value_checksum);
|
|
244
|
+
return WriteBlock(type, header_key, header_value);
|
|
259
245
|
}
|
|
260
246
|
|
|
261
247
|
// Write the footer after all the blocks are stored to indicate the ending.
|
|
262
248
|
IOStatus CacheDumperImpl::WriteFooter() {
|
|
263
249
|
std::string footer_key = "footer";
|
|
264
|
-
std::ostringstream s;
|
|
265
250
|
std::string footer_value("cache dump completed");
|
|
266
251
|
CacheDumpUnitType type = CacheDumpUnitType::kFooter;
|
|
267
|
-
|
|
268
|
-
uint32_t footer_checksum =
|
|
269
|
-
crc32c::Value(footer_value.c_str(), footer_value.size());
|
|
270
|
-
return WriteRawBlock(timestamp, type, Slice(footer_key),
|
|
271
|
-
(void*)footer_value.c_str(), footer_value.size(),
|
|
272
|
-
footer_checksum);
|
|
252
|
+
return WriteBlock(type, footer_key, footer_value);
|
|
273
253
|
}
|
|
274
254
|
|
|
275
255
|
// This is the main function to restore the cache entries to secondary cache.
|
|
@@ -309,9 +289,10 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
|
|
|
309
289
|
if (!io_s.ok()) {
|
|
310
290
|
break;
|
|
311
291
|
}
|
|
312
|
-
//
|
|
313
|
-
|
|
314
|
-
|
|
292
|
+
// Create the uncompressed_block based on the information in the dump_unit
|
|
293
|
+
// (There is no block trailer here compatible with block-based SST file.)
|
|
294
|
+
BlockContents uncompressed_block(
|
|
295
|
+
Slice(static_cast<char*>(dump_unit.value), dump_unit.value_len));
|
|
315
296
|
Cache::CacheItemHelper* helper = nullptr;
|
|
316
297
|
Statistics* statistics = nullptr;
|
|
317
298
|
Status s = Status::OK();
|
|
@@ -323,7 +304,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
|
|
|
323
304
|
BlockType::kFilter);
|
|
324
305
|
std::unique_ptr<ParsedFullFilterBlock> block_holder;
|
|
325
306
|
block_holder.reset(BlocklikeTraits<ParsedFullFilterBlock>::Create(
|
|
326
|
-
std::move(
|
|
307
|
+
std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
|
|
327
308
|
statistics, false, toptions_.filter_policy.get()));
|
|
328
309
|
if (helper != nullptr) {
|
|
329
310
|
s = secondary_cache_->Insert(dump_unit.key,
|
|
@@ -335,7 +316,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
|
|
|
335
316
|
helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kData);
|
|
336
317
|
std::unique_ptr<Block> block_holder;
|
|
337
318
|
block_holder.reset(BlocklikeTraits<Block>::Create(
|
|
338
|
-
std::move(
|
|
319
|
+
std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
|
|
339
320
|
statistics, false, toptions_.filter_policy.get()));
|
|
340
321
|
if (helper != nullptr) {
|
|
341
322
|
s = secondary_cache_->Insert(dump_unit.key,
|
|
@@ -347,7 +328,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
|
|
|
347
328
|
helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kIndex);
|
|
348
329
|
std::unique_ptr<Block> block_holder;
|
|
349
330
|
block_holder.reset(BlocklikeTraits<Block>::Create(
|
|
350
|
-
std::move(
|
|
331
|
+
std::move(uncompressed_block), 0, statistics, false,
|
|
351
332
|
toptions_.filter_policy.get()));
|
|
352
333
|
if (helper != nullptr) {
|
|
353
334
|
s = secondary_cache_->Insert(dump_unit.key,
|
|
@@ -360,7 +341,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
|
|
|
360
341
|
BlockType::kFilterPartitionIndex);
|
|
361
342
|
std::unique_ptr<Block> block_holder;
|
|
362
343
|
block_holder.reset(BlocklikeTraits<Block>::Create(
|
|
363
|
-
std::move(
|
|
344
|
+
std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
|
|
364
345
|
statistics, false, toptions_.filter_policy.get()));
|
|
365
346
|
if (helper != nullptr) {
|
|
366
347
|
s = secondary_cache_->Insert(dump_unit.key,
|
|
@@ -436,7 +417,7 @@ IOStatus CacheDumpedLoaderImpl::ReadHeader(std::string* data,
|
|
|
436
417
|
if (!io_s.ok()) {
|
|
437
418
|
return io_s;
|
|
438
419
|
}
|
|
439
|
-
uint32_t unit_checksum = crc32c::Value(data->
|
|
420
|
+
uint32_t unit_checksum = crc32c::Value(data->data(), data->size());
|
|
440
421
|
if (unit_checksum != header_meta.dump_unit_checksum) {
|
|
441
422
|
return IOStatus::Corruption("Read header unit corrupted!");
|
|
442
423
|
}
|
|
@@ -461,7 +442,7 @@ IOStatus CacheDumpedLoaderImpl::ReadCacheBlock(std::string* data,
|
|
|
461
442
|
if (!io_s.ok()) {
|
|
462
443
|
return io_s;
|
|
463
444
|
}
|
|
464
|
-
uint32_t unit_checksum = crc32c::Value(data->
|
|
445
|
+
uint32_t unit_checksum = crc32c::Value(data->data(), data->size());
|
|
465
446
|
if (unit_checksum != unit_meta.dump_unit_checksum) {
|
|
466
447
|
return IOStatus::Corruption(
|
|
467
448
|
"Checksum does not match! Read dumped unit corrupted!");
|
|
@@ -75,7 +75,7 @@ struct DumpUnit {
|
|
|
75
75
|
// Pointer to the block. Note that, in the dump process, it points to a memory
|
|
76
76
|
// buffer copied from cache block. The buffer is freed when we process the
|
|
77
77
|
// next block. In the load process, we use an std::string to store the
|
|
78
|
-
//
|
|
78
|
+
// serialized dump_unit read from the reader. So it points to the memory
|
|
79
79
|
// address of the begin of the block in this string.
|
|
80
80
|
void* value;
|
|
81
81
|
|
|
@@ -103,14 +103,9 @@ class CacheDumperImpl : public CacheDumper {
|
|
|
103
103
|
IOStatus DumpCacheEntriesToWriter() override;
|
|
104
104
|
|
|
105
105
|
private:
|
|
106
|
-
IOStatus
|
|
107
|
-
|
|
108
|
-
uint32_t checksum);
|
|
109
|
-
|
|
106
|
+
IOStatus WriteBlock(CacheDumpUnitType type, const Slice& key,
|
|
107
|
+
const Slice& value);
|
|
110
108
|
IOStatus WriteHeader();
|
|
111
|
-
|
|
112
|
-
IOStatus WriteCacheBlock(const CacheDumpUnitType type, const Slice& key,
|
|
113
|
-
void* value, size_t len);
|
|
114
109
|
IOStatus WriteFooter();
|
|
115
110
|
bool ShouldFilterOut(const Slice& key);
|
|
116
111
|
std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
|
|
@@ -166,7 +161,7 @@ class ToFileCacheDumpWriter : public CacheDumpWriter {
|
|
|
166
161
|
|
|
167
162
|
~ToFileCacheDumpWriter() { Close().PermitUncheckedError(); }
|
|
168
163
|
|
|
169
|
-
// Write the
|
|
164
|
+
// Write the serialized metadata to the file
|
|
170
165
|
virtual IOStatus WriteMetadata(const Slice& metadata) override {
|
|
171
166
|
assert(file_writer_ != nullptr);
|
|
172
167
|
std::string prefix;
|
|
@@ -179,7 +174,7 @@ class ToFileCacheDumpWriter : public CacheDumpWriter {
|
|
|
179
174
|
return io_s;
|
|
180
175
|
}
|
|
181
176
|
|
|
182
|
-
// Write the
|
|
177
|
+
// Write the serialized data to the file
|
|
183
178
|
virtual IOStatus WritePacket(const Slice& data) override {
|
|
184
179
|
assert(file_writer_ != nullptr);
|
|
185
180
|
std::string prefix;
|
|
@@ -284,7 +279,7 @@ class FromFileCacheDumpReader : public CacheDumpReader {
|
|
|
284
279
|
// The cache dump and load helper class
|
|
285
280
|
class CacheDumperHelper {
|
|
286
281
|
public:
|
|
287
|
-
//
|
|
282
|
+
// serialize the dump_unit_meta to a string, it is fixed 16 bytes size.
|
|
288
283
|
static void EncodeDumpUnitMeta(const DumpUnitMeta& meta, std::string* data) {
|
|
289
284
|
assert(data);
|
|
290
285
|
PutFixed32(data, static_cast<uint32_t>(meta.sequence_num));
|
|
@@ -292,7 +287,7 @@ class CacheDumperHelper {
|
|
|
292
287
|
PutFixed64(data, meta.dump_unit_size);
|
|
293
288
|
}
|
|
294
289
|
|
|
295
|
-
//
|
|
290
|
+
// Serialize the dump_unit to a string.
|
|
296
291
|
static void EncodeDumpUnit(const DumpUnit& dump_unit, std::string* data) {
|
|
297
292
|
assert(data);
|
|
298
293
|
PutFixed64(data, dump_unit.timestamp);
|
|
@@ -304,7 +299,7 @@ class CacheDumperHelper {
|
|
|
304
299
|
Slice((char*)dump_unit.value, dump_unit.value_len));
|
|
305
300
|
}
|
|
306
301
|
|
|
307
|
-
//
|
|
302
|
+
// Deserialize the dump_unit_meta from a string
|
|
308
303
|
static Status DecodeDumpUnitMeta(const std::string& encoded_data,
|
|
309
304
|
DumpUnitMeta* unit_meta) {
|
|
310
305
|
assert(unit_meta != nullptr);
|
|
@@ -323,7 +318,7 @@ class CacheDumperHelper {
|
|
|
323
318
|
return Status::OK();
|
|
324
319
|
}
|
|
325
320
|
|
|
326
|
-
//
|
|
321
|
+
// Deserialize the dump_unit from a string.
|
|
327
322
|
static Status DecodeDumpUnit(const std::string& encoded_data,
|
|
328
323
|
DumpUnit* dump_unit) {
|
|
329
324
|
assert(dump_unit != nullptr);
|
|
@@ -78,11 +78,9 @@ Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
|
|
|
78
78
|
DBImpl* idb = static_cast<DBImpl*>(db->GetRootDB());
|
|
79
79
|
auto icmp = InternalKeyComparator(idb->GetOptions(cfh).comparator);
|
|
80
80
|
ReadOptions read_options;
|
|
81
|
-
ReadRangeDelAggregator range_del_agg(&icmp,
|
|
82
|
-
kMaxSequenceNumber /* upper_bound */);
|
|
83
81
|
Arena arena;
|
|
84
|
-
ScopedArenaIterator iter(
|
|
85
|
-
read_options, &arena,
|
|
82
|
+
ScopedArenaIterator iter(
|
|
83
|
+
idb->NewInternalIterator(read_options, &arena, kMaxSequenceNumber, cfh));
|
|
86
84
|
|
|
87
85
|
if (!begin_key.empty()) {
|
|
88
86
|
InternalKey ikey;
|
|
@@ -240,6 +240,7 @@ IOStatus TestFSWritableFile::PositionedAppend(
|
|
|
240
240
|
|
|
241
241
|
IOStatus TestFSWritableFile::Close(const IOOptions& options,
|
|
242
242
|
IODebugContext* dbg) {
|
|
243
|
+
MutexLock l(&mutex_);
|
|
243
244
|
if (!fs_->IsFilesystemActive()) {
|
|
244
245
|
return fs_->GetError();
|
|
245
246
|
}
|
|
@@ -271,6 +272,7 @@ IOStatus TestFSWritableFile::Close(const IOOptions& options,
|
|
|
271
272
|
}
|
|
272
273
|
|
|
273
274
|
IOStatus TestFSWritableFile::Flush(const IOOptions&, IODebugContext*) {
|
|
275
|
+
MutexLock l(&mutex_);
|
|
274
276
|
if (!fs_->IsFilesystemActive()) {
|
|
275
277
|
return fs_->GetError();
|
|
276
278
|
}
|
|
@@ -282,6 +284,7 @@ IOStatus TestFSWritableFile::Flush(const IOOptions&, IODebugContext*) {
|
|
|
282
284
|
|
|
283
285
|
IOStatus TestFSWritableFile::Sync(const IOOptions& options,
|
|
284
286
|
IODebugContext* dbg) {
|
|
287
|
+
MutexLock l(&mutex_);
|
|
285
288
|
if (!fs_->IsFilesystemActive()) {
|
|
286
289
|
return fs_->GetError();
|
|
287
290
|
}
|
|
@@ -302,6 +305,7 @@ IOStatus TestFSWritableFile::Sync(const IOOptions& options,
|
|
|
302
305
|
IOStatus TestFSWritableFile::RangeSync(uint64_t offset, uint64_t nbytes,
|
|
303
306
|
const IOOptions& options,
|
|
304
307
|
IODebugContext* dbg) {
|
|
308
|
+
MutexLock l(&mutex_);
|
|
305
309
|
if (!fs_->IsFilesystemActive()) {
|
|
306
310
|
return fs_->GetError();
|
|
307
311
|
}
|
|
@@ -87,17 +87,18 @@ Status FaultInjectionSecondaryCache::Insert(
|
|
|
87
87
|
std::unique_ptr<SecondaryCacheResultHandle>
|
|
88
88
|
FaultInjectionSecondaryCache::Lookup(const Slice& key,
|
|
89
89
|
const Cache::CreateCallback& create_cb,
|
|
90
|
-
bool wait, bool
|
|
90
|
+
bool wait, bool advise_erase,
|
|
91
|
+
bool& is_in_sec_cache) {
|
|
91
92
|
ErrorContext* ctx = GetErrorContext();
|
|
92
93
|
if (base_is_compressed_sec_cache_) {
|
|
93
94
|
if (ctx->rand.OneIn(prob_)) {
|
|
94
95
|
return nullptr;
|
|
95
96
|
} else {
|
|
96
|
-
return base_->Lookup(key, create_cb, wait, is_in_sec_cache);
|
|
97
|
+
return base_->Lookup(key, create_cb, wait, advise_erase, is_in_sec_cache);
|
|
97
98
|
}
|
|
98
99
|
} else {
|
|
99
100
|
std::unique_ptr<SecondaryCacheResultHandle> hdl =
|
|
100
|
-
base_->Lookup(key, create_cb, wait, is_in_sec_cache);
|
|
101
|
+
base_->Lookup(key, create_cb, wait, advise_erase, is_in_sec_cache);
|
|
101
102
|
if (wait && ctx->rand.OneIn(prob_)) {
|
|
102
103
|
hdl.reset();
|
|
103
104
|
}
|
|
@@ -36,7 +36,9 @@ class FaultInjectionSecondaryCache : public SecondaryCache {
|
|
|
36
36
|
|
|
37
37
|
std::unique_ptr<SecondaryCacheResultHandle> Lookup(
|
|
38
38
|
const Slice& key, const Cache::CreateCallback& create_cb, bool wait,
|
|
39
|
-
bool& is_in_sec_cache) override;
|
|
39
|
+
bool advise_erase, bool& is_in_sec_cache) override;
|
|
40
|
+
|
|
41
|
+
bool SupportForceErase() const override { return base_->SupportForceErase(); }
|
|
40
42
|
|
|
41
43
|
void Erase(const Slice& key) override;
|
|
42
44
|
|
|
@@ -35,18 +35,26 @@ Status OpenDb(const Options& options, const std::string& dbname,
|
|
|
35
35
|
return s;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
// l0_file_size specifies size of file on L0. Files will be range partitioned
|
|
39
|
+
// after a full compaction so they are likely qualified to put on L0. If
|
|
40
|
+
// left as 0, the files are compacted in a single file and put to L0. Otherwise,
|
|
41
|
+
// will try to compact the files as size l0_file_size.
|
|
38
42
|
Status CompactToLevel(const Options& options, const std::string& dbname,
|
|
39
|
-
int dest_level, bool need_reopen) {
|
|
43
|
+
int dest_level, uint64_t l0_file_size, bool need_reopen) {
|
|
40
44
|
std::unique_ptr<DB> db;
|
|
41
45
|
Options no_compact_opts = GetNoCompactionOptions(options);
|
|
42
46
|
if (dest_level == 0) {
|
|
47
|
+
if (l0_file_size == 0) {
|
|
48
|
+
// Single file.
|
|
49
|
+
l0_file_size = 999999999999999;
|
|
50
|
+
}
|
|
43
51
|
// L0 has strict sequenceID requirements to files to it. It's safer
|
|
44
52
|
// to only put one compacted file to there.
|
|
45
53
|
// This is only used for converting to universal compaction with
|
|
46
54
|
// only one level. In this case, compacting to one file is also
|
|
47
55
|
// optimal.
|
|
48
|
-
no_compact_opts.target_file_size_base =
|
|
49
|
-
no_compact_opts.max_compaction_bytes =
|
|
56
|
+
no_compact_opts.target_file_size_base = l0_file_size;
|
|
57
|
+
no_compact_opts.max_compaction_bytes = l0_file_size;
|
|
50
58
|
}
|
|
51
59
|
Status s = OpenDb(no_compact_opts, dbname, &db);
|
|
52
60
|
if (!s.ok()) {
|
|
@@ -98,7 +106,8 @@ Status MigrateToUniversal(std::string dbname, const Options& old_opts,
|
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
if (need_compact) {
|
|
101
|
-
return CompactToLevel(old_opts, dbname, new_opts.num_levels - 1,
|
|
109
|
+
return CompactToLevel(old_opts, dbname, new_opts.num_levels - 1,
|
|
110
|
+
/*l0_file_size=*/0, true);
|
|
102
111
|
}
|
|
103
112
|
return Status::OK();
|
|
104
113
|
}
|
|
@@ -119,7 +128,7 @@ Status MigrateToLevelBase(std::string dbname, const Options& old_opts,
|
|
|
119
128
|
// multiplier from 4 to 8, with the same data, we will have fewer
|
|
120
129
|
// levels. Unless we issue a full comaction, the LSM tree may stuck
|
|
121
130
|
// with more levels than needed and it won't recover automatically.
|
|
122
|
-
return CompactToLevel(opts, dbname, 1, true);
|
|
131
|
+
return CompactToLevel(opts, dbname, 1, /*l0_file_size=*/0, true);
|
|
123
132
|
} else {
|
|
124
133
|
// Compact everything to the last level to guarantee it can be safely
|
|
125
134
|
// opened.
|
|
@@ -127,11 +136,13 @@ Status MigrateToLevelBase(std::string dbname, const Options& old_opts,
|
|
|
127
136
|
return Status::OK();
|
|
128
137
|
} else if (new_opts.num_levels > old_opts.num_levels) {
|
|
129
138
|
// Dynamic level mode requires data to be put in the last level first.
|
|
130
|
-
return CompactToLevel(new_opts, dbname, new_opts.num_levels - 1,
|
|
139
|
+
return CompactToLevel(new_opts, dbname, new_opts.num_levels - 1,
|
|
140
|
+
/*l0_file_size=*/0, false);
|
|
131
141
|
} else {
|
|
132
142
|
Options opts = old_opts;
|
|
133
143
|
opts.target_file_size_base = new_opts.target_file_size_base;
|
|
134
|
-
return CompactToLevel(opts, dbname, new_opts.num_levels - 1,
|
|
144
|
+
return CompactToLevel(opts, dbname, new_opts.num_levels - 1,
|
|
145
|
+
/*l0_file_size=*/0, true);
|
|
135
146
|
}
|
|
136
147
|
}
|
|
137
148
|
}
|
|
@@ -150,7 +161,14 @@ Status OptionChangeMigration(std::string dbname, const Options& old_opts,
|
|
|
150
161
|
return MigrateToLevelBase(dbname, old_opts, new_opts);
|
|
151
162
|
} else if (new_opts.compaction_style ==
|
|
152
163
|
CompactionStyle::kCompactionStyleFIFO) {
|
|
153
|
-
|
|
164
|
+
uint64_t l0_file_size = 0;
|
|
165
|
+
if (new_opts.compaction_options_fifo.max_table_files_size > 0) {
|
|
166
|
+
// Create at least 8 files when max_table_files_size hits, so that the DB
|
|
167
|
+
// doesn't just disappear. This in fact violates the FIFO condition, but
|
|
168
|
+
// otherwise, the migrated DB is unlikley to be usable.
|
|
169
|
+
l0_file_size = new_opts.compaction_options_fifo.max_table_files_size / 8;
|
|
170
|
+
}
|
|
171
|
+
return CompactToLevel(old_opts, dbname, 0, l0_file_size, true);
|
|
154
172
|
} else {
|
|
155
173
|
return Status::NotSupported(
|
|
156
174
|
"Do not how to migrate to this compaction style");
|