@nxtedition/rocksdb 8.1.4 → 8.1.6
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/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
- package/deps/rocksdb/rocksdb/Makefile +15 -3
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
- package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +15 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
- package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
- package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
- package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +6 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
- package/package.json +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
#ifndef ROCKSDB_LITE
|
|
12
12
|
|
|
13
13
|
#include <cstdint>
|
|
14
|
+
#include <forward_list>
|
|
14
15
|
#include <functional>
|
|
15
16
|
#include <map>
|
|
16
17
|
#include <string>
|
|
@@ -23,6 +24,8 @@
|
|
|
23
24
|
#include "rocksdb/status.h"
|
|
24
25
|
|
|
25
26
|
namespace ROCKSDB_NAMESPACE {
|
|
27
|
+
class BackupEngineReadOnlyBase;
|
|
28
|
+
class BackupEngine;
|
|
26
29
|
|
|
27
30
|
// The default DB file checksum function name.
|
|
28
31
|
constexpr char kDbFileChecksumFuncName[] = "FileChecksumCrc32c";
|
|
@@ -270,6 +273,28 @@ inline BackupEngineOptions::ShareFilesNaming operator|(
|
|
|
270
273
|
return static_cast<BackupEngineOptions::ShareFilesNaming>(l | r);
|
|
271
274
|
}
|
|
272
275
|
|
|
276
|
+
// Identifying information about a backup shared file that is (or might be)
|
|
277
|
+
// excluded from a backup using exclude_files_callback.
|
|
278
|
+
struct BackupExcludedFileInfo {
|
|
279
|
+
explicit BackupExcludedFileInfo(const std::string& _relative_file)
|
|
280
|
+
: relative_file(_relative_file) {}
|
|
281
|
+
|
|
282
|
+
// File name and path relative to the backup dir.
|
|
283
|
+
std::string relative_file;
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// An auxiliary structure for exclude_files_callback
|
|
287
|
+
struct MaybeExcludeBackupFile {
|
|
288
|
+
explicit MaybeExcludeBackupFile(BackupExcludedFileInfo&& _info)
|
|
289
|
+
: info(std::move(_info)) {}
|
|
290
|
+
|
|
291
|
+
// Identifying information about a backup shared file that could be excluded
|
|
292
|
+
const BackupExcludedFileInfo info;
|
|
293
|
+
|
|
294
|
+
// API user sets to true if the file should be excluded from this backup
|
|
295
|
+
bool exclude_decision = false;
|
|
296
|
+
};
|
|
297
|
+
|
|
273
298
|
struct CreateBackupOptions {
|
|
274
299
|
// Flush will always trigger if 2PC is enabled.
|
|
275
300
|
// If write-ahead logs are disabled, set flush_before_backup=true to
|
|
@@ -278,10 +303,31 @@ struct CreateBackupOptions {
|
|
|
278
303
|
|
|
279
304
|
// Callback for reporting progress, based on callback_trigger_interval_size.
|
|
280
305
|
//
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
306
|
+
// An exception thrown from the callback will result in Status::Aborted from
|
|
307
|
+
// the operation.
|
|
308
|
+
std::function<void()> progress_callback = {};
|
|
309
|
+
|
|
310
|
+
// A callback that allows the API user to select files for exclusion, such
|
|
311
|
+
// as if the files are known to exist in an alternate backup directory.
|
|
312
|
+
// Only "shared" files can be excluded from backups. This is an advanced
|
|
313
|
+
// feature because the BackupEngine user is trusted to keep track of files
|
|
314
|
+
// such that the DB can be restored.
|
|
315
|
+
//
|
|
316
|
+
// Input to the callback is a [begin,end) range of sharable files live in
|
|
317
|
+
// the DB being backed up, and the callback implementation sets
|
|
318
|
+
// exclude_decision=true for files to exclude. A callback offers maximum
|
|
319
|
+
// flexibility, e.g. if remote files are unavailable at backup time but
|
|
320
|
+
// whose existence has been recorded somewhere. In case of an empty or
|
|
321
|
+
// no-op callback, all files are included in the backup .
|
|
322
|
+
//
|
|
323
|
+
// To restore the DB, RestoreOptions::alternate_dirs must be used to provide
|
|
324
|
+
// the excluded files.
|
|
325
|
+
//
|
|
326
|
+
// An exception thrown from the callback will result in Status::Aborted from
|
|
327
|
+
// the operation.
|
|
328
|
+
std::function<void(MaybeExcludeBackupFile* files_begin,
|
|
329
|
+
MaybeExcludeBackupFile* files_end)>
|
|
330
|
+
exclude_files_callback = {};
|
|
285
331
|
|
|
286
332
|
// If false, background_thread_cpu_priority is ignored.
|
|
287
333
|
// Otherwise, the cpu priority can be decreased,
|
|
@@ -300,6 +346,11 @@ struct RestoreOptions {
|
|
|
300
346
|
// Default: false
|
|
301
347
|
bool keep_log_files;
|
|
302
348
|
|
|
349
|
+
// For backups that were created using exclude_files_callback, this
|
|
350
|
+
// option enables restoring those backups by providing BackupEngines on
|
|
351
|
+
// directories known to contain the required files.
|
|
352
|
+
std::forward_list<BackupEngineReadOnlyBase*> alternate_dirs;
|
|
353
|
+
|
|
303
354
|
explicit RestoreOptions(bool _keep_log_files = false)
|
|
304
355
|
: keep_log_files(_keep_log_files) {}
|
|
305
356
|
};
|
|
@@ -324,9 +375,15 @@ struct BackupInfo {
|
|
|
324
375
|
// Backup API user metadata
|
|
325
376
|
std::string app_metadata;
|
|
326
377
|
|
|
327
|
-
// Backup file details, if requested with include_file_details=true
|
|
378
|
+
// Backup file details, if requested with include_file_details=true.
|
|
379
|
+
// Does not include excluded_files.
|
|
328
380
|
std::vector<BackupFileInfo> file_details;
|
|
329
381
|
|
|
382
|
+
// Identifying information about shared files that were excluded from the
|
|
383
|
+
// created backup. See exclude_files_callback and alternate_dirs.
|
|
384
|
+
// This information is only provided if include_file_details=true.
|
|
385
|
+
std::vector<BackupExcludedFileInfo> excluded_files;
|
|
386
|
+
|
|
330
387
|
// DB "name" (a directory in the backup_env) for opening this backup as a
|
|
331
388
|
// read-only DB. This should also be used as the DBOptions::wal_dir, such
|
|
332
389
|
// as by default setting wal_dir="". See also env_for_open.
|
|
@@ -348,8 +405,8 @@ struct BackupInfo {
|
|
|
348
405
|
|
|
349
406
|
BackupInfo() {}
|
|
350
407
|
|
|
351
|
-
BackupInfo(BackupID _backup_id, int64_t _timestamp, uint64_t _size,
|
|
352
|
-
|
|
408
|
+
explicit BackupInfo(BackupID _backup_id, int64_t _timestamp, uint64_t _size,
|
|
409
|
+
uint32_t _number_files, const std::string& _app_metadata)
|
|
353
410
|
: backup_id(_backup_id),
|
|
354
411
|
timestamp(_timestamp),
|
|
355
412
|
size(_size),
|
|
@@ -364,8 +421,8 @@ class BackupStatistics {
|
|
|
364
421
|
number_fail_backup = 0;
|
|
365
422
|
}
|
|
366
423
|
|
|
367
|
-
BackupStatistics(uint32_t _number_success_backup,
|
|
368
|
-
|
|
424
|
+
explicit BackupStatistics(uint32_t _number_success_backup,
|
|
425
|
+
uint32_t _number_fail_backup)
|
|
369
426
|
: number_success_backup(_number_success_backup),
|
|
370
427
|
number_fail_backup(_number_fail_backup) {}
|
|
371
428
|
|
|
@@ -462,6 +519,9 @@ class BackupEngineReadOnlyBase {
|
|
|
462
519
|
// Returns Status::OK() if all checks are good
|
|
463
520
|
virtual IOStatus VerifyBackup(BackupID backup_id,
|
|
464
521
|
bool verify_with_checksum = false) const = 0;
|
|
522
|
+
|
|
523
|
+
// Internal use only
|
|
524
|
+
virtual BackupEngine* AsBackupEngine() = 0;
|
|
465
525
|
};
|
|
466
526
|
|
|
467
527
|
// Append-only functions of a BackupEngine. See BackupEngine comment for
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// NOTE: in 'main' development branch, this should be the *next*
|
|
13
13
|
// minor or major version number planned for release.
|
|
14
14
|
#define ROCKSDB_MAJOR 7
|
|
15
|
-
#define ROCKSDB_MINOR
|
|
15
|
+
#define ROCKSDB_MINOR 10
|
|
16
16
|
#define ROCKSDB_PATCH 2
|
|
17
17
|
|
|
18
18
|
// Do not use these. We made the mistake of declaring macros starting with
|
|
@@ -8,9 +8,7 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
10
|
#include "memory/arena.h"
|
|
11
|
-
|
|
12
|
-
#include <sys/mman.h>
|
|
13
|
-
#endif
|
|
11
|
+
|
|
14
12
|
#include <algorithm>
|
|
15
13
|
|
|
16
14
|
#include "logging/logging.h"
|
|
@@ -22,16 +20,7 @@
|
|
|
22
20
|
|
|
23
21
|
namespace ROCKSDB_NAMESPACE {
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
#ifndef _MSC_VER
|
|
27
|
-
const size_t Arena::kInlineSize;
|
|
28
|
-
#endif
|
|
29
|
-
|
|
30
|
-
const size_t Arena::kMinBlockSize = 4096;
|
|
31
|
-
const size_t Arena::kMaxBlockSize = 2u << 30;
|
|
32
|
-
static const int kAlignUnit = alignof(max_align_t);
|
|
33
|
-
|
|
34
|
-
size_t OptimizeBlockSize(size_t block_size) {
|
|
23
|
+
size_t Arena::OptimizeBlockSize(size_t block_size) {
|
|
35
24
|
// Make sure block_size is in optimal range
|
|
36
25
|
block_size = std::max(Arena::kMinBlockSize, block_size);
|
|
37
26
|
block_size = std::min(Arena::kMaxBlockSize, block_size);
|
|
@@ -53,14 +42,12 @@ Arena::Arena(size_t block_size, AllocTracker* tracker, size_t huge_page_size)
|
|
|
53
42
|
blocks_memory_ += alloc_bytes_remaining_;
|
|
54
43
|
aligned_alloc_ptr_ = inline_block_;
|
|
55
44
|
unaligned_alloc_ptr_ = inline_block_ + alloc_bytes_remaining_;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
45
|
+
if (MemMapping::kHugePageSupported) {
|
|
46
|
+
hugetlb_size_ = huge_page_size;
|
|
47
|
+
if (hugetlb_size_ && kBlockSize > hugetlb_size_) {
|
|
48
|
+
hugetlb_size_ = ((kBlockSize - 1U) / hugetlb_size_ + 1U) * hugetlb_size_;
|
|
49
|
+
}
|
|
60
50
|
}
|
|
61
|
-
#else
|
|
62
|
-
(void)huge_page_size;
|
|
63
|
-
#endif
|
|
64
51
|
if (tracker_ != nullptr) {
|
|
65
52
|
tracker_->Allocate(kInlineSize);
|
|
66
53
|
}
|
|
@@ -71,21 +58,6 @@ Arena::~Arena() {
|
|
|
71
58
|
assert(tracker_->is_freed());
|
|
72
59
|
tracker_->FreeMem();
|
|
73
60
|
}
|
|
74
|
-
for (const auto& block : blocks_) {
|
|
75
|
-
delete[] block;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
#ifdef MAP_HUGETLB
|
|
79
|
-
for (const auto& mmap_info : huge_blocks_) {
|
|
80
|
-
if (mmap_info.addr_ == nullptr) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
auto ret = munmap(mmap_info.addr_, mmap_info.length_);
|
|
84
|
-
if (ret != 0) {
|
|
85
|
-
// TODO(sdong): Better handling
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
#endif
|
|
89
61
|
}
|
|
90
62
|
|
|
91
63
|
char* Arena::AllocateFallback(size_t bytes, bool aligned) {
|
|
@@ -99,12 +71,10 @@ char* Arena::AllocateFallback(size_t bytes, bool aligned) {
|
|
|
99
71
|
// We waste the remaining space in the current block.
|
|
100
72
|
size_t size = 0;
|
|
101
73
|
char* block_head = nullptr;
|
|
102
|
-
|
|
103
|
-
if (hugetlb_size_) {
|
|
74
|
+
if (MemMapping::kHugePageSupported && hugetlb_size_ > 0) {
|
|
104
75
|
size = hugetlb_size_;
|
|
105
76
|
block_head = AllocateFromHugePage(size);
|
|
106
77
|
}
|
|
107
|
-
#endif
|
|
108
78
|
if (!block_head) {
|
|
109
79
|
size = kBlockSize;
|
|
110
80
|
block_head = AllocateNewBlock(size);
|
|
@@ -123,45 +93,22 @@ char* Arena::AllocateFallback(size_t bytes, bool aligned) {
|
|
|
123
93
|
}
|
|
124
94
|
|
|
125
95
|
char* Arena::AllocateFromHugePage(size_t bytes) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// - If `emplace_back` throws, no memory leaks because we haven't called
|
|
135
|
-
// `mmap` yet.
|
|
136
|
-
// - If `mmap` throws, no memory leaks because the vector will be cleaned up
|
|
137
|
-
// via RAII.
|
|
138
|
-
huge_blocks_.emplace_back(nullptr /* addr */, 0 /* length */);
|
|
139
|
-
|
|
140
|
-
void* addr = mmap(nullptr, bytes, (PROT_READ | PROT_WRITE),
|
|
141
|
-
(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), -1, 0);
|
|
142
|
-
|
|
143
|
-
if (addr == MAP_FAILED) {
|
|
144
|
-
return nullptr;
|
|
145
|
-
}
|
|
146
|
-
huge_blocks_.back() = MmapInfo(addr, bytes);
|
|
147
|
-
blocks_memory_ += bytes;
|
|
148
|
-
if (tracker_ != nullptr) {
|
|
149
|
-
tracker_->Allocate(bytes);
|
|
96
|
+
MemMapping mm = MemMapping::AllocateHuge(bytes);
|
|
97
|
+
auto addr = static_cast<char*>(mm.Get());
|
|
98
|
+
if (addr) {
|
|
99
|
+
huge_blocks_.push_back(std::move(mm));
|
|
100
|
+
blocks_memory_ += bytes;
|
|
101
|
+
if (tracker_ != nullptr) {
|
|
102
|
+
tracker_->Allocate(bytes);
|
|
103
|
+
}
|
|
150
104
|
}
|
|
151
|
-
return
|
|
152
|
-
#else
|
|
153
|
-
(void)bytes;
|
|
154
|
-
return nullptr;
|
|
155
|
-
#endif
|
|
105
|
+
return addr;
|
|
156
106
|
}
|
|
157
107
|
|
|
158
108
|
char* Arena::AllocateAligned(size_t bytes, size_t huge_page_size,
|
|
159
109
|
Logger* logger) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
#ifdef MAP_HUGETLB
|
|
164
|
-
if (huge_page_size > 0 && bytes > 0) {
|
|
110
|
+
if (MemMapping::kHugePageSupported && hugetlb_size_ > 0 &&
|
|
111
|
+
huge_page_size > 0 && bytes > 0) {
|
|
165
112
|
// Allocate from a huge page TLB table.
|
|
166
113
|
size_t reserved_size =
|
|
167
114
|
((bytes - 1U) / huge_page_size + 1U) * huge_page_size;
|
|
@@ -177,10 +124,6 @@ char* Arena::AllocateAligned(size_t bytes, size_t huge_page_size,
|
|
|
177
124
|
return addr;
|
|
178
125
|
}
|
|
179
126
|
}
|
|
180
|
-
#else
|
|
181
|
-
(void)huge_page_size;
|
|
182
|
-
(void)logger;
|
|
183
|
-
#endif
|
|
184
127
|
|
|
185
128
|
size_t current_mod =
|
|
186
129
|
reinterpret_cast<uintptr_t>(aligned_alloc_ptr_) & (kAlignUnit - 1);
|
|
@@ -200,17 +143,11 @@ char* Arena::AllocateAligned(size_t bytes, size_t huge_page_size,
|
|
|
200
143
|
}
|
|
201
144
|
|
|
202
145
|
char* Arena::AllocateNewBlock(size_t block_bytes) {
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
// own memory and do fewer reallocations.
|
|
206
|
-
//
|
|
207
|
-
// - If `emplace_back` throws, no memory leaks because we haven't called `new`
|
|
208
|
-
// yet.
|
|
209
|
-
// - If `new` throws, no memory leaks because the vector will be cleaned up
|
|
210
|
-
// via RAII.
|
|
211
|
-
blocks_.emplace_back(nullptr);
|
|
212
|
-
|
|
146
|
+
// NOTE: std::make_unique zero-initializes the block so is not appropriate
|
|
147
|
+
// here
|
|
213
148
|
char* block = new char[block_bytes];
|
|
149
|
+
blocks_.push_back(std::unique_ptr<char[]>(block));
|
|
150
|
+
|
|
214
151
|
size_t allocated_size;
|
|
215
152
|
#ifdef ROCKSDB_MALLOC_USABLE_SIZE
|
|
216
153
|
allocated_size = malloc_usable_size(block);
|
|
@@ -227,7 +164,6 @@ char* Arena::AllocateNewBlock(size_t block_bytes) {
|
|
|
227
164
|
if (tracker_ != nullptr) {
|
|
228
165
|
tracker_->Allocate(allocated_size);
|
|
229
166
|
}
|
|
230
|
-
blocks_.back() = block;
|
|
231
167
|
return block;
|
|
232
168
|
}
|
|
233
169
|
|
|
@@ -12,16 +12,13 @@
|
|
|
12
12
|
// size, it uses malloc to directly get the requested size.
|
|
13
13
|
|
|
14
14
|
#pragma once
|
|
15
|
-
|
|
16
|
-
#include <sys/mman.h>
|
|
17
|
-
#endif
|
|
18
|
-
#include <assert.h>
|
|
19
|
-
#include <stdint.h>
|
|
20
|
-
#include <cerrno>
|
|
15
|
+
|
|
21
16
|
#include <cstddef>
|
|
22
|
-
#include <
|
|
17
|
+
#include <deque>
|
|
18
|
+
|
|
23
19
|
#include "memory/allocator.h"
|
|
24
|
-
#include "
|
|
20
|
+
#include "port/mmap.h"
|
|
21
|
+
#include "rocksdb/env.h"
|
|
25
22
|
|
|
26
23
|
namespace ROCKSDB_NAMESPACE {
|
|
27
24
|
|
|
@@ -31,9 +28,13 @@ class Arena : public Allocator {
|
|
|
31
28
|
Arena(const Arena&) = delete;
|
|
32
29
|
void operator=(const Arena&) = delete;
|
|
33
30
|
|
|
34
|
-
static
|
|
35
|
-
static
|
|
36
|
-
static
|
|
31
|
+
static constexpr size_t kInlineSize = 2048;
|
|
32
|
+
static constexpr size_t kMinBlockSize = 4096;
|
|
33
|
+
static constexpr size_t kMaxBlockSize = 2u << 30;
|
|
34
|
+
|
|
35
|
+
static constexpr unsigned kAlignUnit = alignof(std::max_align_t);
|
|
36
|
+
static_assert((kAlignUnit & (kAlignUnit - 1)) == 0,
|
|
37
|
+
"Pointer size should be power of 2");
|
|
37
38
|
|
|
38
39
|
// huge_page_size: if 0, don't use huge page TLB. If > 0 (should set to the
|
|
39
40
|
// supported hugepage size of the system), block allocation will try huge
|
|
@@ -63,7 +64,7 @@ class Arena : public Allocator {
|
|
|
63
64
|
// by the arena (exclude the space allocated but not yet used for future
|
|
64
65
|
// allocations).
|
|
65
66
|
size_t ApproximateMemoryUsage() const {
|
|
66
|
-
return blocks_memory_ + blocks_.
|
|
67
|
+
return blocks_memory_ + blocks_.size() * sizeof(char*) -
|
|
67
68
|
alloc_bytes_remaining_;
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -81,21 +82,19 @@ class Arena : public Allocator {
|
|
|
81
82
|
return blocks_.empty() && huge_blocks_.empty();
|
|
82
83
|
}
|
|
83
84
|
|
|
85
|
+
// check and adjust the block_size so that the return value is
|
|
86
|
+
// 1. in the range of [kMinBlockSize, kMaxBlockSize].
|
|
87
|
+
// 2. the multiple of align unit.
|
|
88
|
+
static size_t OptimizeBlockSize(size_t block_size);
|
|
89
|
+
|
|
84
90
|
private:
|
|
85
|
-
char inline_block_[kInlineSize]
|
|
91
|
+
alignas(std::max_align_t) char inline_block_[kInlineSize];
|
|
86
92
|
// Number of bytes allocated in one block
|
|
87
93
|
const size_t kBlockSize;
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
struct MmapInfo {
|
|
93
|
-
void* addr_;
|
|
94
|
-
size_t length_;
|
|
95
|
-
|
|
96
|
-
MmapInfo(void* addr, size_t length) : addr_(addr), length_(length) {}
|
|
97
|
-
};
|
|
98
|
-
std::vector<MmapInfo> huge_blocks_;
|
|
94
|
+
// Allocated memory blocks
|
|
95
|
+
std::deque<std::unique_ptr<char[]>> blocks_;
|
|
96
|
+
// Huge page allocations
|
|
97
|
+
std::deque<MemMapping> huge_blocks_;
|
|
99
98
|
size_t irregular_block_num = 0;
|
|
100
99
|
|
|
101
100
|
// Stats for current active block.
|
|
@@ -108,15 +107,15 @@ class Arena : public Allocator {
|
|
|
108
107
|
// How many bytes left in currently active block?
|
|
109
108
|
size_t alloc_bytes_remaining_ = 0;
|
|
110
109
|
|
|
111
|
-
#ifdef MAP_HUGETLB
|
|
112
110
|
size_t hugetlb_size_ = 0;
|
|
113
|
-
|
|
111
|
+
|
|
114
112
|
char* AllocateFromHugePage(size_t bytes);
|
|
115
113
|
char* AllocateFallback(size_t bytes, bool aligned);
|
|
116
114
|
char* AllocateNewBlock(size_t block_bytes);
|
|
117
115
|
|
|
118
116
|
// Bytes of memory in blocks allocated so far
|
|
119
117
|
size_t blocks_memory_ = 0;
|
|
118
|
+
// Non-owned
|
|
120
119
|
AllocTracker* tracker_;
|
|
121
120
|
};
|
|
122
121
|
|
|
@@ -133,9 +132,4 @@ inline char* Arena::Allocate(size_t bytes) {
|
|
|
133
132
|
return AllocateFallback(bytes, false /* unaligned */);
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
// check and adjust the block_size so that the return value is
|
|
137
|
-
// 1. in the range of [kMinBlockSize, kMaxBlockSize].
|
|
138
|
-
// 2. the multiple of align unit.
|
|
139
|
-
extern size_t OptimizeBlockSize(size_t block_size);
|
|
140
|
-
|
|
141
135
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
10
|
#include "memory/arena.h"
|
|
11
|
+
|
|
12
|
+
#ifndef OS_WIN
|
|
13
|
+
#include <sys/resource.h>
|
|
14
|
+
#endif
|
|
15
|
+
#include "port/port.h"
|
|
11
16
|
#include "test_util/testharness.h"
|
|
12
17
|
#include "util/random.h"
|
|
13
18
|
|
|
@@ -196,6 +201,91 @@ TEST_F(ArenaTest, Simple) {
|
|
|
196
201
|
SimpleTest(0);
|
|
197
202
|
SimpleTest(kHugePageSize);
|
|
198
203
|
}
|
|
204
|
+
|
|
205
|
+
// Number of minor page faults since last call
|
|
206
|
+
size_t PopMinorPageFaultCount() {
|
|
207
|
+
#ifdef RUSAGE_SELF
|
|
208
|
+
static long prev = 0;
|
|
209
|
+
struct rusage usage;
|
|
210
|
+
EXPECT_EQ(getrusage(RUSAGE_SELF, &usage), 0);
|
|
211
|
+
size_t rv = usage.ru_minflt - prev;
|
|
212
|
+
prev = usage.ru_minflt;
|
|
213
|
+
return rv;
|
|
214
|
+
#else
|
|
215
|
+
// Conservative
|
|
216
|
+
return SIZE_MAX;
|
|
217
|
+
#endif // RUSAGE_SELF
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
TEST(MmapTest, AllocateLazyZeroed) {
|
|
221
|
+
// Doesn't have to be page aligned
|
|
222
|
+
constexpr size_t len = 1234567;
|
|
223
|
+
MemMapping m = MemMapping::AllocateLazyZeroed(len);
|
|
224
|
+
auto arr = static_cast<char*>(m.Get());
|
|
225
|
+
|
|
226
|
+
// Should generally work
|
|
227
|
+
ASSERT_NE(arr, nullptr);
|
|
228
|
+
|
|
229
|
+
// Start counting page faults
|
|
230
|
+
PopMinorPageFaultCount();
|
|
231
|
+
|
|
232
|
+
// Access half of the allocation
|
|
233
|
+
size_t i = 0;
|
|
234
|
+
for (; i < len / 2; ++i) {
|
|
235
|
+
ASSERT_EQ(arr[i], 0);
|
|
236
|
+
arr[i] = static_cast<char>(i & 255);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Appropriate page faults (maybe more)
|
|
240
|
+
size_t faults = PopMinorPageFaultCount();
|
|
241
|
+
ASSERT_GE(faults, len / 2 / port::kPageSize);
|
|
242
|
+
|
|
243
|
+
// Access rest of the allocation
|
|
244
|
+
for (; i < len; ++i) {
|
|
245
|
+
ASSERT_EQ(arr[i], 0);
|
|
246
|
+
arr[i] = static_cast<char>(i & 255);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Appropriate page faults (maybe more)
|
|
250
|
+
faults = PopMinorPageFaultCount();
|
|
251
|
+
ASSERT_GE(faults, len / 2 / port::kPageSize);
|
|
252
|
+
|
|
253
|
+
// Verify data
|
|
254
|
+
for (i = 0; i < len; ++i) {
|
|
255
|
+
ASSERT_EQ(arr[i], static_cast<char>(i & 255));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
TEST_F(ArenaTest, UnmappedAllocation) {
|
|
260
|
+
// Verify that it's possible to get unmapped pages in large allocations,
|
|
261
|
+
// for memory efficiency and to ensure we don't accidentally waste time &
|
|
262
|
+
// space initializing the memory.
|
|
263
|
+
constexpr size_t kBlockSize = 2U << 20;
|
|
264
|
+
Arena arena(kBlockSize);
|
|
265
|
+
|
|
266
|
+
// The allocator might give us back recycled memory for a while, but
|
|
267
|
+
// shouldn't last forever.
|
|
268
|
+
for (int i = 0;; ++i) {
|
|
269
|
+
char* p = arena.Allocate(kBlockSize);
|
|
270
|
+
|
|
271
|
+
// Start counting page faults
|
|
272
|
+
PopMinorPageFaultCount();
|
|
273
|
+
|
|
274
|
+
// Overwrite the whole allocation
|
|
275
|
+
for (size_t j = 0; j < kBlockSize; ++j) {
|
|
276
|
+
p[j] = static_cast<char>(j & 255);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
size_t faults = PopMinorPageFaultCount();
|
|
280
|
+
if (faults >= kBlockSize * 3 / 4 / port::kPageSize) {
|
|
281
|
+
// Most of the access generated page faults => GOOD
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
// Should have succeeded after enough tries
|
|
285
|
+
ASSERT_LT(i, 1000);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
199
289
|
} // namespace ROCKSDB_NAMESPACE
|
|
200
290
|
|
|
201
291
|
int main(int argc, char** argv) {
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
#pragma once
|
|
8
8
|
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
|
|
9
11
|
#include "rocksdb/memory_allocator.h"
|
|
10
12
|
|
|
11
13
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -35,4 +37,11 @@ inline CacheAllocationPtr AllocateBlock(size_t size,
|
|
|
35
37
|
return CacheAllocationPtr(new char[size]);
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
inline CacheAllocationPtr AllocateAndCopyBlock(const Slice& data,
|
|
41
|
+
MemoryAllocator* allocator) {
|
|
42
|
+
CacheAllocationPtr cap = AllocateBlock(data.size(), allocator);
|
|
43
|
+
std::copy_n(data.data(), data.size(), cap.get());
|
|
44
|
+
return cap;
|
|
45
|
+
}
|
|
46
|
+
|
|
38
47
|
} // namespace ROCKSDB_NAMESPACE
|