@nxtedition/rocksdb 7.0.5 → 7.0.8
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 +363 -329
- package/chained-batch.js +6 -1
- package/deps/rocksdb/rocksdb/CMakeLists.txt +8 -3
- package/deps/rocksdb/rocksdb/Makefile +10 -4
- package/deps/rocksdb/rocksdb/TARGETS +6 -4
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +9 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +14 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +8 -8
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +272 -174
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +201 -57
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +19 -19
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -1
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +170 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +95 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +298 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +172 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +8 -3
- package/deps/rocksdb/rocksdb/db/column_family.h +6 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +10 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +38 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +4 -7
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -71
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +70 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +13 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +36 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +139 -91
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +48 -14
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +90 -55
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +9 -4
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -7
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +3 -1
- package/deps/rocksdb/rocksdb/db/dbformat.h +5 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable.cc +1 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +43 -1
- package/deps/rocksdb/rocksdb/db/version_edit.cc +13 -5
- package/deps/rocksdb/rocksdb/db/version_edit.h +22 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +4 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +109 -41
- package/deps/rocksdb/rocksdb/db/version_set.h +36 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -4
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/version_util.h +1 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/write_batch.cc +34 -10
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -0
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +7 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +5 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +24 -3
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +10 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +9 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -3
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +8 -6
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -2
- package/deps/rocksdb/rocksdb/options/options_test.cc +1 -11
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.h +11 -3
- package/deps/rocksdb/rocksdb/src.mk +6 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -33
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +38 -118
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +6 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +10 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +4 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +10 -28
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -91
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -30
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -27
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +11 -13
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -40
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +22 -43
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +11 -22
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +24 -25
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +0 -1
- package/deps/rocksdb/rocksdb/table/get_context.h +0 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +3 -18
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +3 -16
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3 -3
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +0 -201
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +48 -0
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +5 -11
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -21
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +45 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +21 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +10 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +9 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +5 -4
- package/deps/rocksdb/rocksdb.gyp +1 -1
- package/index.js +36 -14
- package/package-lock.json +23687 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/liburing/liburing/README +0 -46
- package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
- package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
- package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
- package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
- package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
- package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
- package/deps/liburing/liburing/test/Makefile +0 -312
- package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
- package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
- package/deps/liburing/liburing/test/accept-link.c +0 -251
- package/deps/liburing/liburing/test/accept-reuse.c +0 -164
- package/deps/liburing/liburing/test/accept-test.c +0 -79
- package/deps/liburing/liburing/test/accept.c +0 -476
- package/deps/liburing/liburing/test/across-fork.c +0 -283
- package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
- package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
- package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
- package/deps/liburing/liburing/test/close-opath.c +0 -122
- package/deps/liburing/liburing/test/config +0 -10
- package/deps/liburing/liburing/test/connect.c +0 -398
- package/deps/liburing/liburing/test/cq-full.c +0 -96
- package/deps/liburing/liburing/test/cq-overflow.c +0 -294
- package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
- package/deps/liburing/liburing/test/cq-ready.c +0 -94
- package/deps/liburing/liburing/test/cq-size.c +0 -58
- package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
- package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
- package/deps/liburing/liburing/test/defer.c +0 -307
- package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
- package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
- package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
- package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
- package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
- package/deps/liburing/liburing/test/eventfd.c +0 -112
- package/deps/liburing/liburing/test/fadvise.c +0 -202
- package/deps/liburing/liburing/test/fallocate.c +0 -249
- package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
- package/deps/liburing/liburing/test/file-register.c +0 -843
- package/deps/liburing/liburing/test/file-update.c +0 -173
- package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
- package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
- package/deps/liburing/liburing/test/fixed-link.c +0 -90
- package/deps/liburing/liburing/test/fsync.c +0 -224
- package/deps/liburing/liburing/test/hardlink.c +0 -136
- package/deps/liburing/liburing/test/helpers.c +0 -135
- package/deps/liburing/liburing/test/helpers.h +0 -67
- package/deps/liburing/liburing/test/io-cancel.c +0 -537
- package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
- package/deps/liburing/liburing/test/io_uring_register.c +0 -664
- package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
- package/deps/liburing/liburing/test/iopoll.c +0 -366
- package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
- package/deps/liburing/liburing/test/lfs-openat.c +0 -273
- package/deps/liburing/liburing/test/link-timeout.c +0 -1107
- package/deps/liburing/liburing/test/link.c +0 -496
- package/deps/liburing/liburing/test/link_drain.c +0 -229
- package/deps/liburing/liburing/test/madvise.c +0 -195
- package/deps/liburing/liburing/test/mkdir.c +0 -108
- package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
- package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
- package/deps/liburing/liburing/test/nop.c +0 -115
- package/deps/liburing/liburing/test/open-close.c +0 -146
- package/deps/liburing/liburing/test/openat2.c +0 -240
- package/deps/liburing/liburing/test/personality.c +0 -204
- package/deps/liburing/liburing/test/pipe-eof.c +0 -81
- package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
- package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
- package/deps/liburing/liburing/test/poll-cancel.c +0 -135
- package/deps/liburing/liburing/test/poll-link.c +0 -227
- package/deps/liburing/liburing/test/poll-many.c +0 -208
- package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
- package/deps/liburing/liburing/test/poll-ring.c +0 -48
- package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
- package/deps/liburing/liburing/test/poll.c +0 -109
- package/deps/liburing/liburing/test/probe.c +0 -137
- package/deps/liburing/liburing/test/read-write.c +0 -876
- package/deps/liburing/liburing/test/register-restrictions.c +0 -633
- package/deps/liburing/liburing/test/rename.c +0 -134
- package/deps/liburing/liburing/test/ring-leak.c +0 -173
- package/deps/liburing/liburing/test/ring-leak2.c +0 -249
- package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
- package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
- package/deps/liburing/liburing/test/runtests.sh +0 -170
- package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
- package/deps/liburing/liburing/test/self.c +0 -91
- package/deps/liburing/liburing/test/send_recv.c +0 -291
- package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
- package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
- package/deps/liburing/liburing/test/shared-wq.c +0 -84
- package/deps/liburing/liburing/test/short-read.c +0 -75
- package/deps/liburing/liburing/test/shutdown.c +0 -163
- package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
- package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
- package/deps/liburing/liburing/test/socket-rw.c +0 -147
- package/deps/liburing/liburing/test/splice.c +0 -511
- package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
- package/deps/liburing/liburing/test/sq-full.c +0 -45
- package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
- package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
- package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
- package/deps/liburing/liburing/test/sq-space_left.c +0 -159
- package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
- package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
- package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
- package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
- package/deps/liburing/liburing/test/statx.c +0 -172
- package/deps/liburing/liburing/test/stdout.c +0 -232
- package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
- package/deps/liburing/liburing/test/submit-reuse.c +0 -239
- package/deps/liburing/liburing/test/symlink.c +0 -116
- package/deps/liburing/liburing/test/teardowns.c +0 -58
- package/deps/liburing/liburing/test/thread-exit.c +0 -131
- package/deps/liburing/liburing/test/timeout-new.c +0 -246
- package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
- package/deps/liburing/liburing/test/timeout.c +0 -1354
- package/deps/liburing/liburing/test/unlink.c +0 -111
- package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
- package/deps/rocksdb/rocksdb/README.md +0 -32
- package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
- package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
- package/deps/rocksdb/rocksdb/port/README +0 -10
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +0 -358
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +0 -127
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +0 -219
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
|
@@ -36,7 +36,7 @@ enum Tag : uint32_t {
|
|
|
36
36
|
kLogNumber = 2,
|
|
37
37
|
kNextFileNumber = 3,
|
|
38
38
|
kLastSequence = 4,
|
|
39
|
-
|
|
39
|
+
kCompactCursor = 5,
|
|
40
40
|
kDeletedFile = 6,
|
|
41
41
|
kNewFile = 7,
|
|
42
42
|
// 8 was used for large value refs
|
|
@@ -463,6 +463,24 @@ class VersionEdit {
|
|
|
463
463
|
using NewFiles = std::vector<std::pair<int, FileMetaData>>;
|
|
464
464
|
const NewFiles& GetNewFiles() const { return new_files_; }
|
|
465
465
|
|
|
466
|
+
// Retrieve all the compact cursors
|
|
467
|
+
using CompactCursors = std::vector<std::pair<int, InternalKey>>;
|
|
468
|
+
const CompactCursors& GetCompactCursors() const { return compact_cursors_; }
|
|
469
|
+
void AddCompactCursor(int level, const InternalKey& cursor) {
|
|
470
|
+
compact_cursors_.push_back(std::make_pair(level, cursor));
|
|
471
|
+
}
|
|
472
|
+
void SetCompactCursors(
|
|
473
|
+
const std::vector<InternalKey>& compact_cursors_by_level) {
|
|
474
|
+
compact_cursors_.clear();
|
|
475
|
+
compact_cursors_.reserve(compact_cursors_by_level.size());
|
|
476
|
+
for (int i = 0; i < (int)compact_cursors_by_level.size(); i++) {
|
|
477
|
+
if (compact_cursors_by_level[i].Valid()) {
|
|
478
|
+
compact_cursors_.push_back(
|
|
479
|
+
std::make_pair(i, compact_cursors_by_level[i]));
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
466
484
|
// Add a new blob file.
|
|
467
485
|
void AddBlobFile(uint64_t blob_file_number, uint64_t total_blob_count,
|
|
468
486
|
uint64_t total_blob_bytes, std::string checksum_method,
|
|
@@ -635,6 +653,9 @@ class VersionEdit {
|
|
|
635
653
|
bool has_min_log_number_to_keep_ = false;
|
|
636
654
|
bool has_last_sequence_ = false;
|
|
637
655
|
|
|
656
|
+
// Compaction cursors for round-robin compaction policy
|
|
657
|
+
CompactCursors compact_cursors_;
|
|
658
|
+
|
|
638
659
|
DeletedFiles deleted_files_;
|
|
639
660
|
NewFiles new_files_;
|
|
640
661
|
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
#include <cinttypes>
|
|
13
13
|
#include <sstream>
|
|
14
14
|
|
|
15
|
-
#include "db/blob/blob_file_cache.h"
|
|
16
15
|
#include "db/blob/blob_file_reader.h"
|
|
16
|
+
#include "db/blob/blob_source.h"
|
|
17
17
|
#include "logging/logging.h"
|
|
18
18
|
#include "monitoring/persistent_stats_history.h"
|
|
19
19
|
|
|
@@ -831,11 +831,10 @@ Status VersionEditHandlerPointInTime::VerifyFile(const std::string& fpath,
|
|
|
831
831
|
Status VersionEditHandlerPointInTime::VerifyBlobFile(
|
|
832
832
|
ColumnFamilyData* cfd, uint64_t blob_file_num,
|
|
833
833
|
const BlobFileAddition& blob_addition) {
|
|
834
|
-
|
|
835
|
-
assert(
|
|
834
|
+
BlobSource* blob_source = cfd->blob_source();
|
|
835
|
+
assert(blob_source);
|
|
836
836
|
CacheHandleGuard<BlobFileReader> blob_file_reader;
|
|
837
|
-
Status s =
|
|
838
|
-
blob_file_cache->GetBlobFileReader(blob_file_num, &blob_file_reader);
|
|
837
|
+
Status s = blob_source->GetBlobFileReader(blob_file_num, &blob_file_reader);
|
|
839
838
|
if (!s.ok()) {
|
|
840
839
|
return s;
|
|
841
840
|
}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
#include "db/blob/blob_file_reader.h"
|
|
26
26
|
#include "db/blob/blob_index.h"
|
|
27
27
|
#include "db/blob/blob_log_format.h"
|
|
28
|
+
#include "db/blob/blob_source.h"
|
|
28
29
|
#include "db/compaction/compaction.h"
|
|
29
30
|
#include "db/compaction/file_pri.h"
|
|
30
31
|
#include "db/dbformat.h"
|
|
@@ -1797,6 +1798,7 @@ VersionStorageInfo::VersionStorageInfo(
|
|
|
1797
1798
|
compaction_score_(num_levels_),
|
|
1798
1799
|
compaction_level_(num_levels_),
|
|
1799
1800
|
l0_delay_trigger_count_(0),
|
|
1801
|
+
compact_cursor_(num_levels_),
|
|
1800
1802
|
accumulated_file_size_(0),
|
|
1801
1803
|
accumulated_raw_key_size_(0),
|
|
1802
1804
|
accumulated_raw_value_size_(0),
|
|
@@ -1819,6 +1821,8 @@ VersionStorageInfo::VersionStorageInfo(
|
|
|
1819
1821
|
current_num_deletions_ = ref_vstorage->current_num_deletions_;
|
|
1820
1822
|
current_num_samples_ = ref_vstorage->current_num_samples_;
|
|
1821
1823
|
oldest_snapshot_seqnum_ = ref_vstorage->oldest_snapshot_seqnum_;
|
|
1824
|
+
compact_cursor_ = ref_vstorage->compact_cursor_;
|
|
1825
|
+
compact_cursor_.resize(num_levels_);
|
|
1822
1826
|
}
|
|
1823
1827
|
}
|
|
1824
1828
|
|
|
@@ -1833,7 +1837,7 @@ Version::Version(ColumnFamilyData* column_family_data, VersionSet* vset,
|
|
|
1833
1837
|
info_log_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->logger),
|
|
1834
1838
|
db_statistics_((cfd_ == nullptr) ? nullptr : cfd_->ioptions()->stats),
|
|
1835
1839
|
table_cache_((cfd_ == nullptr) ? nullptr : cfd_->table_cache()),
|
|
1836
|
-
|
|
1840
|
+
blob_source_(cfd_ ? cfd_->blob_source() : nullptr),
|
|
1837
1841
|
merge_operator_(
|
|
1838
1842
|
(cfd_ == nullptr) ? nullptr : cfd_->ioptions()->merge_operator.get()),
|
|
1839
1843
|
storage_info_(
|
|
@@ -1880,34 +1884,22 @@ Status Version::GetBlob(const ReadOptions& read_options, const Slice& user_key,
|
|
|
1880
1884
|
PinnableSlice* value, uint64_t* bytes_read) const {
|
|
1881
1885
|
assert(value);
|
|
1882
1886
|
|
|
1883
|
-
if (read_options.read_tier == kBlockCacheTier) {
|
|
1884
|
-
return Status::Incomplete("Cannot read blob: no disk I/O allowed");
|
|
1885
|
-
}
|
|
1886
|
-
|
|
1887
1887
|
if (blob_index.HasTTL() || blob_index.IsInlined()) {
|
|
1888
1888
|
return Status::Corruption("Unexpected TTL/inlined blob index");
|
|
1889
1889
|
}
|
|
1890
1890
|
|
|
1891
1891
|
const uint64_t blob_file_number = blob_index.file_number();
|
|
1892
1892
|
|
|
1893
|
-
|
|
1893
|
+
auto blob_file_meta = storage_info_.GetBlobFileMetaData(blob_file_number);
|
|
1894
|
+
if (!blob_file_meta) {
|
|
1894
1895
|
return Status::Corruption("Invalid blob file number");
|
|
1895
1896
|
}
|
|
1896
1897
|
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
&blob_file_reader);
|
|
1903
|
-
if (!s.ok()) {
|
|
1904
|
-
return s;
|
|
1905
|
-
}
|
|
1906
|
-
}
|
|
1907
|
-
|
|
1908
|
-
assert(blob_file_reader.GetValue());
|
|
1909
|
-
const Status s = blob_file_reader.GetValue()->GetBlob(
|
|
1910
|
-
read_options, user_key, blob_index.offset(), blob_index.size(),
|
|
1898
|
+
assert(blob_source_);
|
|
1899
|
+
value->Reset();
|
|
1900
|
+
const Status s = blob_source_->GetBlob(
|
|
1901
|
+
read_options, user_key, blob_file_number, blob_index.offset(),
|
|
1902
|
+
blob_file_meta->GetBlobFileSize(), blob_index.size(),
|
|
1911
1903
|
blob_index.compression(), prefetch_buffer, value, bytes_read);
|
|
1912
1904
|
|
|
1913
1905
|
return s;
|
|
@@ -1948,9 +1940,9 @@ void Version::MultiGetBlob(
|
|
|
1948
1940
|
}
|
|
1949
1941
|
|
|
1950
1942
|
CacheHandleGuard<BlobFileReader> blob_file_reader;
|
|
1951
|
-
assert(
|
|
1952
|
-
status =
|
|
1953
|
-
|
|
1943
|
+
assert(blob_source_);
|
|
1944
|
+
status =
|
|
1945
|
+
blob_source_->GetBlobFileReader(blob_file_number, &blob_file_reader);
|
|
1954
1946
|
assert(!status.ok() || blob_file_reader.GetValue());
|
|
1955
1947
|
|
|
1956
1948
|
auto& blobs_in_file = elem.second;
|
|
@@ -2252,8 +2244,8 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
|
|
|
2252
2244
|
Status s;
|
|
2253
2245
|
uint64_t num_index_read = 0;
|
|
2254
2246
|
uint64_t num_filter_read = 0;
|
|
2255
|
-
uint64_t num_data_read = 0;
|
|
2256
2247
|
uint64_t num_sst_read = 0;
|
|
2248
|
+
uint64_t num_level_read = 0;
|
|
2257
2249
|
|
|
2258
2250
|
MultiGetRange keys_with_blobs_range(*range, range->begin(), range->end());
|
|
2259
2251
|
// blob_file => [[blob_idx, it], ...]
|
|
@@ -2275,7 +2267,7 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
|
|
|
2275
2267
|
s = MultiGetFromSST(read_options, fp.CurrentFileRange(),
|
|
2276
2268
|
fp.GetHitFileLevel(), fp.IsHitFileLastInLevel(), f,
|
|
2277
2269
|
blob_rqs, num_filter_read, num_index_read,
|
|
2278
|
-
|
|
2270
|
+
num_sst_read);
|
|
2279
2271
|
if (fp.GetHitFileLevel() == 0) {
|
|
2280
2272
|
dump_stats_for_l0_file = true;
|
|
2281
2273
|
}
|
|
@@ -2290,13 +2282,14 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
|
|
|
2290
2282
|
mget_tasks.emplace_back(MultiGetFromSSTCoroutine(
|
|
2291
2283
|
read_options, fp.CurrentFileRange(), fp.GetHitFileLevel(),
|
|
2292
2284
|
fp.IsHitFileLastInLevel(), f, blob_rqs, num_filter_read,
|
|
2293
|
-
num_index_read,
|
|
2285
|
+
num_index_read, num_sst_read));
|
|
2294
2286
|
if (fp.KeyMaySpanNextFile()) {
|
|
2295
2287
|
break;
|
|
2296
2288
|
}
|
|
2297
2289
|
f = fp.GetNextFileInLevel();
|
|
2298
2290
|
}
|
|
2299
2291
|
if (mget_tasks.size() > 0) {
|
|
2292
|
+
RecordTick(db_statistics_, MULTIGET_COROUTINE_COUNT, mget_tasks.size());
|
|
2300
2293
|
// Collect all results so far
|
|
2301
2294
|
std::vector<Status> statuses = folly::coro::blockingWait(
|
|
2302
2295
|
folly::coro::collectAllRange(std::move(mget_tasks))
|
|
@@ -2328,18 +2321,18 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
|
|
|
2328
2321
|
(prev_level != 0 && prev_level != (int)fp.GetHitFileLevel())) {
|
|
2329
2322
|
// Dump the stats if the search has moved to the next level and
|
|
2330
2323
|
// reset for next level.
|
|
2331
|
-
if (
|
|
2324
|
+
if (num_filter_read + num_index_read) {
|
|
2332
2325
|
RecordInHistogram(db_statistics_,
|
|
2333
2326
|
NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
|
|
2334
2327
|
num_index_read + num_filter_read);
|
|
2335
|
-
|
|
2336
|
-
|
|
2328
|
+
}
|
|
2329
|
+
if (num_sst_read) {
|
|
2337
2330
|
RecordInHistogram(db_statistics_, NUM_SST_READ_PER_LEVEL,
|
|
2338
2331
|
num_sst_read);
|
|
2332
|
+
num_level_read++;
|
|
2339
2333
|
}
|
|
2340
2334
|
num_filter_read = 0;
|
|
2341
2335
|
num_index_read = 0;
|
|
2342
|
-
num_data_read = 0;
|
|
2343
2336
|
num_sst_read = 0;
|
|
2344
2337
|
}
|
|
2345
2338
|
prev_level = fp.GetHitFileLevel();
|
|
@@ -2347,11 +2340,19 @@ void Version::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
|
|
|
2347
2340
|
}
|
|
2348
2341
|
|
|
2349
2342
|
// Dump stats for most recent level
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2343
|
+
if (num_filter_read + num_index_read) {
|
|
2344
|
+
RecordInHistogram(db_statistics_,
|
|
2345
|
+
NUM_INDEX_AND_FILTER_BLOCKS_READ_PER_LEVEL,
|
|
2346
|
+
num_index_read + num_filter_read);
|
|
2347
|
+
}
|
|
2348
|
+
if (num_sst_read) {
|
|
2349
|
+
RecordInHistogram(db_statistics_, NUM_SST_READ_PER_LEVEL, num_sst_read);
|
|
2350
|
+
num_level_read++;
|
|
2351
|
+
}
|
|
2352
|
+
if (num_level_read) {
|
|
2353
|
+
RecordInHistogram(db_statistics_, NUM_LEVEL_READ_PER_MULTIGET,
|
|
2354
|
+
num_level_read);
|
|
2355
|
+
}
|
|
2355
2356
|
|
|
2356
2357
|
if (s.ok() && !blob_rqs.empty()) {
|
|
2357
2358
|
MultiGetBlob(read_options, keys_with_blobs_range, blob_rqs);
|
|
@@ -3194,6 +3195,60 @@ void SortFileByOverlappingRatio(
|
|
|
3194
3195
|
file_to_order[f2.file->fd.GetNumber()];
|
|
3195
3196
|
});
|
|
3196
3197
|
}
|
|
3198
|
+
|
|
3199
|
+
void SortFileByRoundRobin(const InternalKeyComparator& icmp,
|
|
3200
|
+
std::vector<InternalKey>* compact_cursor,
|
|
3201
|
+
bool level0_non_overlapping, int level,
|
|
3202
|
+
std::vector<Fsize>* temp) {
|
|
3203
|
+
if (level == 0 && !level0_non_overlapping) {
|
|
3204
|
+
// Using kOldestSmallestSeqFirst when level === 0, since the
|
|
3205
|
+
// files may overlap (not fully sorted)
|
|
3206
|
+
std::sort(temp->begin(), temp->end(),
|
|
3207
|
+
[](const Fsize& f1, const Fsize& f2) -> bool {
|
|
3208
|
+
return f1.file->fd.smallest_seqno < f2.file->fd.smallest_seqno;
|
|
3209
|
+
});
|
|
3210
|
+
return;
|
|
3211
|
+
}
|
|
3212
|
+
|
|
3213
|
+
bool should_move_files =
|
|
3214
|
+
compact_cursor->at(level).Valid() && temp->size() > 1;
|
|
3215
|
+
|
|
3216
|
+
// The iterator points to the Fsize with smallest key larger than or equal to
|
|
3217
|
+
// the given cursor
|
|
3218
|
+
std::vector<Fsize>::iterator current_file_iter;
|
|
3219
|
+
if (should_move_files) {
|
|
3220
|
+
// Find the file of which the smallest key is larger than or equal to
|
|
3221
|
+
// the cursor (the smallest key in the successor file of the last
|
|
3222
|
+
// chosen file), skip this if the cursor is invalid or there is only
|
|
3223
|
+
// one file in this level
|
|
3224
|
+
current_file_iter = std::lower_bound(
|
|
3225
|
+
temp->begin(), temp->end(), compact_cursor->at(level),
|
|
3226
|
+
[&](const Fsize& f, const InternalKey& cursor) -> bool {
|
|
3227
|
+
return icmp.Compare(cursor, f.file->smallest) > 0;
|
|
3228
|
+
});
|
|
3229
|
+
|
|
3230
|
+
should_move_files = current_file_iter != temp->end();
|
|
3231
|
+
}
|
|
3232
|
+
if (should_move_files) {
|
|
3233
|
+
// Construct a local temporary vector
|
|
3234
|
+
std::vector<Fsize> local_temp;
|
|
3235
|
+
local_temp.reserve(temp->size());
|
|
3236
|
+
// Move the selected File into the first position and its successors
|
|
3237
|
+
// into the second, third, ..., positions
|
|
3238
|
+
for (auto iter = current_file_iter; iter != temp->end(); iter++) {
|
|
3239
|
+
local_temp.push_back(*iter);
|
|
3240
|
+
}
|
|
3241
|
+
// Move the origin predecessors of the selected file in a round-robin
|
|
3242
|
+
// manner
|
|
3243
|
+
for (auto iter = temp->begin(); iter != current_file_iter; iter++) {
|
|
3244
|
+
local_temp.push_back(*iter);
|
|
3245
|
+
}
|
|
3246
|
+
// Replace all the items in temp
|
|
3247
|
+
for (size_t i = 0; i < local_temp.size(); i++) {
|
|
3248
|
+
temp->at(i) = local_temp[i];
|
|
3249
|
+
}
|
|
3250
|
+
}
|
|
3251
|
+
}
|
|
3197
3252
|
} // namespace
|
|
3198
3253
|
|
|
3199
3254
|
void VersionStorageInfo::UpdateFilesByCompactionPri(
|
|
@@ -3246,6 +3301,10 @@ void VersionStorageInfo::UpdateFilesByCompactionPri(
|
|
|
3246
3301
|
files_[level + 1], ioptions.clock, level,
|
|
3247
3302
|
num_non_empty_levels_, options.ttl, &temp);
|
|
3248
3303
|
break;
|
|
3304
|
+
case kRoundRobin:
|
|
3305
|
+
SortFileByRoundRobin(*internal_comparator_, &compact_cursor_,
|
|
3306
|
+
level0_non_overlapping_, level, &temp);
|
|
3307
|
+
break;
|
|
3249
3308
|
default:
|
|
3250
3309
|
assert(false);
|
|
3251
3310
|
}
|
|
@@ -4109,11 +4168,12 @@ VersionSet::VersionSet(const std::string& dbname,
|
|
|
4109
4168
|
WriteController* write_controller,
|
|
4110
4169
|
BlockCacheTracer* const block_cache_tracer,
|
|
4111
4170
|
const std::shared_ptr<IOTracer>& io_tracer,
|
|
4171
|
+
const std::string& db_id,
|
|
4112
4172
|
const std::string& db_session_id)
|
|
4113
|
-
: column_family_set_(
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4173
|
+
: column_family_set_(new ColumnFamilySet(
|
|
4174
|
+
dbname, _db_options, storage_options, table_cache,
|
|
4175
|
+
write_buffer_manager, write_controller, block_cache_tracer, io_tracer,
|
|
4176
|
+
db_id, db_session_id)),
|
|
4117
4177
|
table_cache_(table_cache),
|
|
4118
4178
|
env_(_db_options->env),
|
|
4119
4179
|
fs_(_db_options->fs, io_tracer),
|
|
@@ -4155,9 +4215,13 @@ void VersionSet::Reset() {
|
|
|
4155
4215
|
if (column_family_set_) {
|
|
4156
4216
|
WriteBufferManager* wbm = column_family_set_->write_buffer_manager();
|
|
4157
4217
|
WriteController* wc = column_family_set_->write_controller();
|
|
4218
|
+
// db_id becomes the source of truth after DBImpl::Recover():
|
|
4219
|
+
// https://github.com/facebook/rocksdb/blob/v7.3.1/db/db_impl/db_impl_open.cc#L527
|
|
4220
|
+
// Note: we may not be able to recover db_id from MANIFEST if
|
|
4221
|
+
// options.write_dbid_to_manifest is false (default).
|
|
4158
4222
|
column_family_set_.reset(new ColumnFamilySet(
|
|
4159
4223
|
dbname_, db_options_, file_options_, table_cache_, wbm, wc,
|
|
4160
|
-
block_cache_tracer_, io_tracer_, db_session_id_));
|
|
4224
|
+
block_cache_tracer_, io_tracer_, db_id_, db_session_id_));
|
|
4161
4225
|
}
|
|
4162
4226
|
db_id_.clear();
|
|
4163
4227
|
next_file_number_.store(2);
|
|
@@ -5210,6 +5274,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
|
|
|
5210
5274
|
WriteBufferManager wb(options->db_write_buffer_size);
|
|
5211
5275
|
VersionSet versions(dbname, &db_options, file_options, tc.get(), &wb, &wc,
|
|
5212
5276
|
nullptr /*BlockCacheTracer*/, nullptr /*IOTracer*/,
|
|
5277
|
+
/*db_id*/ "",
|
|
5213
5278
|
/*db_session_id*/ "");
|
|
5214
5279
|
Status status;
|
|
5215
5280
|
|
|
@@ -5281,6 +5346,7 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
|
|
|
5281
5346
|
delete[] vstorage -> files_;
|
|
5282
5347
|
vstorage->files_ = new_files_list;
|
|
5283
5348
|
vstorage->num_levels_ = new_levels;
|
|
5349
|
+
vstorage->ResizeCompactCursors(new_levels);
|
|
5284
5350
|
|
|
5285
5351
|
MutableCFOptions mutable_cf_options(*options);
|
|
5286
5352
|
VersionEdit ve;
|
|
@@ -5516,6 +5582,8 @@ Status VersionSet::WriteCurrentStateToManifest(
|
|
|
5516
5582
|
}
|
|
5517
5583
|
}
|
|
5518
5584
|
|
|
5585
|
+
edit.SetCompactCursors(vstorage->GetCompactCursors());
|
|
5586
|
+
|
|
5519
5587
|
const auto& blob_files = vstorage->GetBlobFiles();
|
|
5520
5588
|
for (const auto& meta : blob_files) {
|
|
5521
5589
|
assert(meta);
|
|
@@ -6143,7 +6211,7 @@ ReactiveVersionSet::ReactiveVersionSet(
|
|
|
6143
6211
|
const std::shared_ptr<IOTracer>& io_tracer)
|
|
6144
6212
|
: VersionSet(dbname, _db_options, _file_options, table_cache,
|
|
6145
6213
|
write_buffer_manager, write_controller,
|
|
6146
|
-
/*block_cache_tracer=*/nullptr, io_tracer,
|
|
6214
|
+
/*block_cache_tracer=*/nullptr, io_tracer, /*db_id*/ "",
|
|
6147
6215
|
/*db_session_id*/ "") {}
|
|
6148
6216
|
|
|
6149
6217
|
ReactiveVersionSet::~ReactiveVersionSet() {}
|
|
@@ -130,6 +130,36 @@ class VersionStorageInfo {
|
|
|
130
130
|
|
|
131
131
|
void AddFile(int level, FileMetaData* f);
|
|
132
132
|
|
|
133
|
+
// Resize/Initialize the space for compact_cursor_
|
|
134
|
+
void ResizeCompactCursors(int level) {
|
|
135
|
+
compact_cursor_.resize(level, InternalKey());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const std::vector<InternalKey>& GetCompactCursors() const {
|
|
139
|
+
return compact_cursor_;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// REQUIRES: ResizeCompactCursors has been called
|
|
143
|
+
void AddCursorForOneLevel(int level,
|
|
144
|
+
const InternalKey& smallest_uncompacted_key) {
|
|
145
|
+
compact_cursor_[level] = smallest_uncompacted_key;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// REQUIRES: lock is held
|
|
149
|
+
// Update the compact cursor and advance the file index so that it can point
|
|
150
|
+
// to the next cursor
|
|
151
|
+
const InternalKey& GetNextCompactCursor(int level) {
|
|
152
|
+
int cmp_idx = next_file_to_compact_by_size_[level] + 1;
|
|
153
|
+
// TODO(zichen): may need to update next_file_to_compact_by_size_
|
|
154
|
+
// for parallel compaction.
|
|
155
|
+
InternalKey new_cursor;
|
|
156
|
+
if (cmp_idx >= (int)files_by_compaction_pri_[level].size()) {
|
|
157
|
+
cmp_idx = 0;
|
|
158
|
+
}
|
|
159
|
+
// TODO(zichen): rethink if this strategy gives us some good guarantee
|
|
160
|
+
return files_[level][files_by_compaction_pri_[level][cmp_idx]]->smallest;
|
|
161
|
+
}
|
|
162
|
+
|
|
133
163
|
void ReserveBlob(size_t size) { blob_files_.reserve(size); }
|
|
134
164
|
|
|
135
165
|
void AddBlobFile(std::shared_ptr<BlobFileMetaData> blob_file_meta);
|
|
@@ -657,6 +687,9 @@ class VersionStorageInfo {
|
|
|
657
687
|
int l0_delay_trigger_count_ = 0; // Count used to trigger slow down and stop
|
|
658
688
|
// for number of L0 files.
|
|
659
689
|
|
|
690
|
+
// Compact cursors for round-robin compactions in each level
|
|
691
|
+
std::vector<InternalKey> compact_cursor_;
|
|
692
|
+
|
|
660
693
|
// the following are the sampled temporary stats.
|
|
661
694
|
// the current accumulated size of sampled files.
|
|
662
695
|
uint64_t accumulated_file_size_;
|
|
@@ -958,13 +991,13 @@ class Version {
|
|
|
958
991
|
int hit_file_level, bool is_hit_file_last_in_level, FdWithKeyRange* f,
|
|
959
992
|
std::unordered_map<uint64_t, BlobReadRequests>& blob_rqs,
|
|
960
993
|
uint64_t& num_filter_read, uint64_t& num_index_read,
|
|
961
|
-
uint64_t&
|
|
994
|
+
uint64_t& num_sst_read);
|
|
962
995
|
|
|
963
996
|
ColumnFamilyData* cfd_; // ColumnFamilyData to which this Version belongs
|
|
964
997
|
Logger* info_log_;
|
|
965
998
|
Statistics* db_statistics_;
|
|
966
999
|
TableCache* table_cache_;
|
|
967
|
-
|
|
1000
|
+
BlobSource* blob_source_;
|
|
968
1001
|
const MergeOperator* merge_operator_;
|
|
969
1002
|
|
|
970
1003
|
VersionStorageInfo storage_info_;
|
|
@@ -1025,7 +1058,7 @@ class VersionSet {
|
|
|
1025
1058
|
WriteController* write_controller,
|
|
1026
1059
|
BlockCacheTracer* const block_cache_tracer,
|
|
1027
1060
|
const std::shared_ptr<IOTracer>& io_tracer,
|
|
1028
|
-
const std::string& db_session_id);
|
|
1061
|
+
const std::string& db_id, const std::string& db_session_id);
|
|
1029
1062
|
// No copying allowed
|
|
1030
1063
|
VersionSet(const VersionSet&) = delete;
|
|
1031
1064
|
void operator=(const VersionSet&) = delete;
|
|
@@ -15,8 +15,7 @@ DEFINE_SYNC_AND_ASYNC(Status, Version::MultiGetFromSST)
|
|
|
15
15
|
(const ReadOptions& read_options, MultiGetRange file_range, int hit_file_level,
|
|
16
16
|
bool is_hit_file_last_in_level, FdWithKeyRange* f,
|
|
17
17
|
std::unordered_map<uint64_t, BlobReadRequests>& blob_rqs,
|
|
18
|
-
uint64_t& num_filter_read, uint64_t& num_index_read, uint64_t&
|
|
19
|
-
uint64_t& num_sst_read) {
|
|
18
|
+
uint64_t& num_filter_read, uint64_t& num_index_read, uint64_t& num_sst_read) {
|
|
20
19
|
bool timer_enabled = GetPerfLevel() >= PerfLevel::kEnableTimeExceptForMutex &&
|
|
21
20
|
get_perf_context()->per_level_perf_context_enabled;
|
|
22
21
|
|
|
@@ -63,12 +62,10 @@ DEFINE_SYNC_AND_ASYNC(Status, Version::MultiGetFromSST)
|
|
|
63
62
|
batch_size++;
|
|
64
63
|
num_index_read += get_context.get_context_stats_.num_index_read;
|
|
65
64
|
num_filter_read += get_context.get_context_stats_.num_filter_read;
|
|
66
|
-
num_data_read += get_context.get_context_stats_.num_data_read;
|
|
67
65
|
num_sst_read += get_context.get_context_stats_.num_sst_read;
|
|
68
66
|
// Reset these stats since they're specific to a level
|
|
69
67
|
get_context.get_context_stats_.num_index_read = 0;
|
|
70
68
|
get_context.get_context_stats_.num_filter_read = 0;
|
|
71
|
-
get_context.get_context_stats_.num_data_read = 0;
|
|
72
69
|
get_context.get_context_stats_.num_sst_read = 0;
|
|
73
70
|
|
|
74
71
|
// report the counters before returning
|
|
@@ -1146,7 +1146,7 @@ class VersionSetTestBase {
|
|
|
1146
1146
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1147
1147
|
&write_buffer_manager_, &write_controller_,
|
|
1148
1148
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1149
|
-
/*db_session_id*/ ""));
|
|
1149
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1150
1150
|
reactive_versions_ = std::make_shared<ReactiveVersionSet>(
|
|
1151
1151
|
dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1152
1152
|
&write_buffer_manager_, &write_controller_, nullptr);
|
|
@@ -1250,7 +1250,7 @@ class VersionSetTestBase {
|
|
|
1250
1250
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1251
1251
|
&write_buffer_manager_, &write_controller_,
|
|
1252
1252
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1253
|
-
/*db_session_id*/ ""));
|
|
1253
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1254
1254
|
EXPECT_OK(versions_->Recover(column_families_, false));
|
|
1255
1255
|
}
|
|
1256
1256
|
|
|
@@ -1756,7 +1756,7 @@ TEST_F(VersionSetTest, WalAddition) {
|
|
|
1756
1756
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1757
1757
|
&write_buffer_manager_, &write_controller_,
|
|
1758
1758
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1759
|
-
/*db_session_id*/ ""));
|
|
1759
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1760
1760
|
ASSERT_OK(new_versions->Recover(column_families_, /*read_only=*/false));
|
|
1761
1761
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
1762
1762
|
ASSERT_EQ(wals.size(), 1);
|
|
@@ -1823,7 +1823,7 @@ TEST_F(VersionSetTest, WalCloseWithoutSync) {
|
|
|
1823
1823
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1824
1824
|
&write_buffer_manager_, &write_controller_,
|
|
1825
1825
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1826
|
-
/*db_session_id*/ ""));
|
|
1826
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1827
1827
|
ASSERT_OK(new_versions->Recover(column_families_, false));
|
|
1828
1828
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
1829
1829
|
ASSERT_EQ(wals.size(), 2);
|
|
@@ -1876,7 +1876,7 @@ TEST_F(VersionSetTest, WalDeletion) {
|
|
|
1876
1876
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1877
1877
|
&write_buffer_manager_, &write_controller_,
|
|
1878
1878
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1879
|
-
/*db_session_id*/ ""));
|
|
1879
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1880
1880
|
ASSERT_OK(new_versions->Recover(column_families_, false));
|
|
1881
1881
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
1882
1882
|
ASSERT_EQ(wals.size(), 1);
|
|
@@ -1914,7 +1914,7 @@ TEST_F(VersionSetTest, WalDeletion) {
|
|
|
1914
1914
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
1915
1915
|
&write_buffer_manager_, &write_controller_,
|
|
1916
1916
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
1917
|
-
/*db_session_id*/ ""));
|
|
1917
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
1918
1918
|
ASSERT_OK(new_versions->Recover(column_families_, false));
|
|
1919
1919
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
1920
1920
|
ASSERT_EQ(wals.size(), 1);
|
|
@@ -2032,7 +2032,7 @@ TEST_F(VersionSetTest, DeleteWalsBeforeNonExistingWalNumber) {
|
|
|
2032
2032
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
2033
2033
|
&write_buffer_manager_, &write_controller_,
|
|
2034
2034
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
2035
|
-
/*db_session_id*/ ""));
|
|
2035
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
2036
2036
|
ASSERT_OK(new_versions->Recover(column_families_, false));
|
|
2037
2037
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
2038
2038
|
ASSERT_EQ(wals.size(), 1);
|
|
@@ -2068,7 +2068,7 @@ TEST_F(VersionSetTest, DeleteAllWals) {
|
|
|
2068
2068
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
2069
2069
|
&write_buffer_manager_, &write_controller_,
|
|
2070
2070
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
2071
|
-
/*db_session_id*/ ""));
|
|
2071
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
2072
2072
|
ASSERT_OK(new_versions->Recover(column_families_, false));
|
|
2073
2073
|
const auto& wals = new_versions->GetWalSet().GetWals();
|
|
2074
2074
|
ASSERT_EQ(wals.size(), 0);
|
|
@@ -2110,7 +2110,7 @@ TEST_F(VersionSetTest, AtomicGroupWithWalEdits) {
|
|
|
2110
2110
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
2111
2111
|
&write_buffer_manager_, &write_controller_,
|
|
2112
2112
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
2113
|
-
/*db_session_id*/ ""));
|
|
2113
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
2114
2114
|
std::string db_id;
|
|
2115
2115
|
ASSERT_OK(
|
|
2116
2116
|
new_versions->Recover(column_families_, /*read_only=*/false, &db_id));
|
|
@@ -2164,7 +2164,7 @@ class VersionSetWithTimestampTest : public VersionSetTest {
|
|
|
2164
2164
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
2165
2165
|
&write_buffer_manager_, &write_controller_,
|
|
2166
2166
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
2167
|
-
/*db_session_id*/ ""));
|
|
2167
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
2168
2168
|
ASSERT_OK(vset->Recover(column_families_, /*read_only=*/false,
|
|
2169
2169
|
/*db_id=*/nullptr));
|
|
2170
2170
|
for (auto* cfd : *(vset->GetColumnFamilySet())) {
|
|
@@ -25,7 +25,7 @@ class OfflineManifestWriter {
|
|
|
25
25
|
options.table_cache_numshardbits)),
|
|
26
26
|
versions_(db_path, &immutable_db_options_, sopt_, tc_.get(), &wb_, &wc_,
|
|
27
27
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
28
|
-
/*db_session_id*/ "") {}
|
|
28
|
+
/*db_id*/ "", /*db_session_id*/ "") {}
|
|
29
29
|
|
|
30
30
|
Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families) {
|
|
31
31
|
return versions_.Recover(column_families);
|
|
@@ -54,7 +54,7 @@ class WalManagerTest : public testing::Test {
|
|
|
54
54
|
new VersionSet(dbname_, &db_options_, env_options_, table_cache_.get(),
|
|
55
55
|
&write_buffer_manager_, &write_controller_,
|
|
56
56
|
/*block_cache_tracer=*/nullptr, /*io_tracer=*/nullptr,
|
|
57
|
-
/*db_session_id*/ ""));
|
|
57
|
+
/*db_id*/ "", /*db_session_id*/ ""));
|
|
58
58
|
|
|
59
59
|
wal_manager_.reset(
|
|
60
60
|
new WalManager(db_options_, env_options_, nullptr /*IOTracer*/));
|
|
@@ -2844,16 +2844,10 @@ class ProtectionInfoUpdater : public WriteBatch::Handler {
|
|
|
2844
2844
|
|
|
2845
2845
|
Status WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
|
|
2846
2846
|
assert(contents.size() >= WriteBatchInternal::kHeader);
|
|
2847
|
+
assert(b->prot_info_ == nullptr);
|
|
2847
2848
|
|
|
2848
2849
|
b->rep_.assign(contents.data(), contents.size());
|
|
2849
2850
|
b->content_flags_.store(ContentFlags::DEFERRED, std::memory_order_relaxed);
|
|
2850
|
-
|
|
2851
|
-
// If we have a prot_info_, update protection info entries for the batch.
|
|
2852
|
-
if (b->prot_info_) {
|
|
2853
|
-
ProtectionInfoUpdater prot_info_updater(b->prot_info_.get());
|
|
2854
|
-
return b->Iterate(&prot_info_updater);
|
|
2855
|
-
}
|
|
2856
|
-
|
|
2857
2851
|
return Status::OK();
|
|
2858
2852
|
}
|
|
2859
2853
|
|
|
@@ -2885,12 +2879,18 @@ Status WriteBatchInternal::Append(WriteBatch* dst, const WriteBatch* src,
|
|
|
2885
2879
|
src_flags = src->content_flags_.load(std::memory_order_relaxed);
|
|
2886
2880
|
}
|
|
2887
2881
|
|
|
2888
|
-
if (
|
|
2882
|
+
if (src->prot_info_ != nullptr) {
|
|
2883
|
+
if (dst->prot_info_ == nullptr) {
|
|
2884
|
+
dst->prot_info_.reset(new WriteBatch::ProtectionInfo());
|
|
2885
|
+
}
|
|
2889
2886
|
std::copy(src->prot_info_->entries_.begin(),
|
|
2890
2887
|
src->prot_info_->entries_.begin() + src_count,
|
|
2891
2888
|
std::back_inserter(dst->prot_info_->entries_));
|
|
2892
|
-
} else if (
|
|
2893
|
-
dst
|
|
2889
|
+
} else if (dst->prot_info_ != nullptr) {
|
|
2890
|
+
// dst has empty prot_info->entries
|
|
2891
|
+
// In this special case, we allow write batch without prot_info to
|
|
2892
|
+
// be appende to write batch with empty prot_info
|
|
2893
|
+
dst->prot_info_ = nullptr;
|
|
2894
2894
|
}
|
|
2895
2895
|
SetCount(dst, Count(dst) + src_count);
|
|
2896
2896
|
assert(src->rep_.size() >= WriteBatchInternal::kHeader);
|
|
@@ -2910,4 +2910,28 @@ size_t WriteBatchInternal::AppendedByteSize(size_t leftByteSize,
|
|
|
2910
2910
|
}
|
|
2911
2911
|
}
|
|
2912
2912
|
|
|
2913
|
+
Status WriteBatchInternal::UpdateProtectionInfo(WriteBatch* wb,
|
|
2914
|
+
size_t bytes_per_key) {
|
|
2915
|
+
if (bytes_per_key == 0) {
|
|
2916
|
+
if (wb->prot_info_ != nullptr) {
|
|
2917
|
+
wb->prot_info_.reset();
|
|
2918
|
+
return Status::OK();
|
|
2919
|
+
} else {
|
|
2920
|
+
// Already not protected.
|
|
2921
|
+
return Status::OK();
|
|
2922
|
+
}
|
|
2923
|
+
} else if (bytes_per_key == 8) {
|
|
2924
|
+
if (wb->prot_info_ == nullptr) {
|
|
2925
|
+
wb->prot_info_.reset(new WriteBatch::ProtectionInfo());
|
|
2926
|
+
ProtectionInfoUpdater prot_info_updater(wb->prot_info_.get());
|
|
2927
|
+
return wb->Iterate(&prot_info_updater);
|
|
2928
|
+
} else {
|
|
2929
|
+
// Already protected.
|
|
2930
|
+
return Status::OK();
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
return Status::NotSupported(
|
|
2934
|
+
"WriteBatch protection info must be zero or eight bytes/key");
|
|
2935
|
+
}
|
|
2936
|
+
|
|
2913
2937
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -236,6 +236,8 @@ class WriteBatchInternal {
|
|
|
236
236
|
static bool HasKeyWithTimestamp(const WriteBatch& wb) {
|
|
237
237
|
return wb.has_key_with_ts_;
|
|
238
238
|
}
|
|
239
|
+
|
|
240
|
+
static Status UpdateProtectionInfo(WriteBatch* wb, size_t bytes_per_key);
|
|
239
241
|
};
|
|
240
242
|
|
|
241
243
|
// LocalSavePoint is similar to a scope guard
|
|
@@ -307,6 +307,10 @@ TEST_P(WriteCallbackPTest, WriteWithCallbackTest) {
|
|
|
307
307
|
WriteOptions woptions;
|
|
308
308
|
woptions.disableWAL = !enable_WAL_;
|
|
309
309
|
woptions.sync = enable_WAL_;
|
|
310
|
+
if (woptions.protection_bytes_per_key > 0) {
|
|
311
|
+
ASSERT_OK(WriteBatchInternal::UpdateProtectionInfo(
|
|
312
|
+
&write_op.write_batch_, woptions.protection_bytes_per_key));
|
|
313
|
+
}
|
|
310
314
|
Status s;
|
|
311
315
|
if (seq_per_batch_) {
|
|
312
316
|
class PublishSeqCallback : public PreReleaseCallback {
|