@nxtedition/rocksdb 10.1.5 → 10.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/binding.cc +5 -7
- package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
- package/deps/rocksdb/rocksdb/Makefile +38 -15
- package/deps/rocksdb/rocksdb/TARGETS +10 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
- package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
- package/deps/rocksdb/rocksdb/db/builder.h +1 -1
- package/deps/rocksdb/rocksdb/db/c.cc +205 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
- package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
- package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
- package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
- package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
- package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
- package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
- package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
- package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
- package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
- package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
- package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
- package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
- package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
- package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
- package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
- package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
- package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
- package/deps/rocksdb/rocksdb/env/env.cc +6 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
- package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
- package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
- package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
- package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
- package/deps/rocksdb/rocksdb/options/options.cc +3 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
- package/deps/rocksdb/rocksdb/src.mk +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
- package/deps/rocksdb/rocksdb/table/format.cc +1 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
- package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/util/random.cc +2 -1
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
- package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
- package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
- package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
- package/.tap/test-results/test/batch-test.js.tap +0 -12
- package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
- package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
- package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
- package/.tap/test-results/test/column-test.js.tap +0 -55
- package/.tap/test-results/test/common.js.tap +0 -0
- package/.tap/test-results/test/compression-test.js.tap +0 -30
- package/.tap/test-results/test/db-identity.js.tap +0 -12
- package/.tap/test-results/test/electron.js.tap +0 -0
- package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
- package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
- package/.tap/test-results/test/gc.js.tap +0 -0
- package/.tap/test-results/test/getproperty-test.js.tap +0 -29
- package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
- package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
- package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
- package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
- package/.tap/test-results/test/iterator-test.js.tap +0 -6
- package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
- package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
- package/.tap/test-results/test/leak-tester.js.tap +0 -0
- package/.tap/test-results/test/lock-test.js.tap +0 -18
- package/.tap/test-results/test/lock.js.tap +0 -0
- package/.tap/test-results/test/make.js.tap +0 -0
- package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
- package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
- package/.tap/test-results/test/mkdir-test.js.tap +0 -15
- package/.tap/test-results/test/segfault-test.js.tap +0 -76
- package/.tap/test-results/test/stack-blower.js.tap +0 -0
- package/deps/rocksdb/rocksdb/README.md +0 -29
- 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/utilities/transactions/lock/range/range_tree/lib/README +0 -13
package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
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 "utilities/table_properties_collectors/compact_for_tiering_collector.h"
|
|
8
|
+
|
|
9
|
+
#include <sstream>
|
|
10
|
+
|
|
11
|
+
#include "db/seqno_to_time_mapping.h"
|
|
12
|
+
#include "rocksdb/status.h"
|
|
13
|
+
#include "rocksdb/types.h"
|
|
14
|
+
#include "rocksdb/utilities/customizable_util.h"
|
|
15
|
+
#include "rocksdb/utilities/object_registry.h"
|
|
16
|
+
#include "rocksdb/utilities/options_type.h"
|
|
17
|
+
#include "rocksdb/utilities/table_properties_collectors.h"
|
|
18
|
+
#include "util/string_util.h"
|
|
19
|
+
|
|
20
|
+
namespace ROCKSDB_NAMESPACE {
|
|
21
|
+
const std::string
|
|
22
|
+
CompactForTieringCollector::kNumEligibleLastLevelEntriesPropertyName =
|
|
23
|
+
"rocksdb.eligible.last.level.entries";
|
|
24
|
+
|
|
25
|
+
CompactForTieringCollector::CompactForTieringCollector(
|
|
26
|
+
SequenceNumber last_level_inclusive_max_seqno_threshold,
|
|
27
|
+
double compaction_trigger_ratio)
|
|
28
|
+
: last_level_inclusive_max_seqno_threshold_(
|
|
29
|
+
last_level_inclusive_max_seqno_threshold),
|
|
30
|
+
compaction_trigger_ratio_(compaction_trigger_ratio) {
|
|
31
|
+
assert(last_level_inclusive_max_seqno_threshold_ != kMaxSequenceNumber);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
Status CompactForTieringCollector::AddUserKey(const Slice& /*key*/,
|
|
35
|
+
const Slice& value,
|
|
36
|
+
EntryType type,
|
|
37
|
+
SequenceNumber seq,
|
|
38
|
+
uint64_t /*file_size*/) {
|
|
39
|
+
SequenceNumber seq_for_check = seq;
|
|
40
|
+
if (type == kEntryTimedPut) {
|
|
41
|
+
seq_for_check = ParsePackedValueForSeqno(value);
|
|
42
|
+
}
|
|
43
|
+
if (seq_for_check < last_level_inclusive_max_seqno_threshold_) {
|
|
44
|
+
last_level_eligible_entries_counter_++;
|
|
45
|
+
}
|
|
46
|
+
total_entries_counter_ += 1;
|
|
47
|
+
return Status::OK();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Status CompactForTieringCollector::Finish(UserCollectedProperties* properties) {
|
|
51
|
+
assert(!finish_called_);
|
|
52
|
+
assert(compaction_trigger_ratio_ > 0);
|
|
53
|
+
if (last_level_eligible_entries_counter_ >=
|
|
54
|
+
compaction_trigger_ratio_ * total_entries_counter_) {
|
|
55
|
+
assert(compaction_trigger_ratio_ <= 1);
|
|
56
|
+
need_compaction_ = true;
|
|
57
|
+
}
|
|
58
|
+
if (last_level_eligible_entries_counter_ > 0) {
|
|
59
|
+
*properties = UserCollectedProperties{
|
|
60
|
+
{kNumEligibleLastLevelEntriesPropertyName,
|
|
61
|
+
std::to_string(last_level_eligible_entries_counter_)},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
finish_called_ = true;
|
|
65
|
+
return Status::OK();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
UserCollectedProperties CompactForTieringCollector::GetReadableProperties()
|
|
69
|
+
const {
|
|
70
|
+
return UserCollectedProperties{
|
|
71
|
+
{kNumEligibleLastLevelEntriesPropertyName,
|
|
72
|
+
std::to_string(last_level_eligible_entries_counter_)},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
bool CompactForTieringCollector::NeedCompact() const {
|
|
77
|
+
return need_compaction_;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void CompactForTieringCollector::Reset() {
|
|
81
|
+
last_level_eligible_entries_counter_ = 0;
|
|
82
|
+
total_entries_counter_ = 0;
|
|
83
|
+
finish_called_ = false;
|
|
84
|
+
need_compaction_ = false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
TablePropertiesCollector*
|
|
88
|
+
CompactForTieringCollectorFactory::CreateTablePropertiesCollector(
|
|
89
|
+
TablePropertiesCollectorFactory::Context context) {
|
|
90
|
+
double compaction_trigger_ratio = GetCompactionTriggerRatio();
|
|
91
|
+
if (compaction_trigger_ratio <= 0 ||
|
|
92
|
+
context.level_at_creation == context.num_levels - 1 ||
|
|
93
|
+
context.last_level_inclusive_max_seqno_threshold == kMaxSequenceNumber) {
|
|
94
|
+
return nullptr;
|
|
95
|
+
}
|
|
96
|
+
return new CompactForTieringCollector(
|
|
97
|
+
context.last_level_inclusive_max_seqno_threshold,
|
|
98
|
+
compaction_trigger_ratio);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static std::unordered_map<std::string, OptionTypeInfo>
|
|
102
|
+
on_compact_for_tiering_type_info = {
|
|
103
|
+
{"compaction_trigger_ratio",
|
|
104
|
+
{0, OptionType::kUnknown, OptionVerificationType::kNormal,
|
|
105
|
+
OptionTypeFlags::kCompareNever | OptionTypeFlags::kMutable,
|
|
106
|
+
[](const ConfigOptions&, const std::string&, const std::string& value,
|
|
107
|
+
void* addr) {
|
|
108
|
+
auto* factory =
|
|
109
|
+
static_cast<CompactForTieringCollectorFactory*>(addr);
|
|
110
|
+
factory->SetCompactionTriggerRatio(ParseDouble(value));
|
|
111
|
+
return Status::OK();
|
|
112
|
+
},
|
|
113
|
+
[](const ConfigOptions&, const std::string&, const void* addr,
|
|
114
|
+
std::string* value) {
|
|
115
|
+
const auto* factory =
|
|
116
|
+
static_cast<const CompactForTieringCollectorFactory*>(addr);
|
|
117
|
+
*value = std::to_string(factory->GetCompactionTriggerRatio());
|
|
118
|
+
return Status::OK();
|
|
119
|
+
},
|
|
120
|
+
nullptr}},
|
|
121
|
+
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
CompactForTieringCollectorFactory::CompactForTieringCollectorFactory(
|
|
125
|
+
double compaction_trigger_ratio)
|
|
126
|
+
: compaction_trigger_ratio_(compaction_trigger_ratio) {
|
|
127
|
+
RegisterOptions("", this, &on_compact_for_tiering_type_info);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
std::string CompactForTieringCollectorFactory::ToString() const {
|
|
131
|
+
std::ostringstream cfg;
|
|
132
|
+
cfg << Name()
|
|
133
|
+
<< ", compaction trigger ratio:" << compaction_trigger_ratio_.load()
|
|
134
|
+
<< std::endl;
|
|
135
|
+
return cfg.str();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
std::shared_ptr<CompactForTieringCollectorFactory>
|
|
139
|
+
NewCompactForTieringCollectorFactory(double compaction_trigger_ratio) {
|
|
140
|
+
return std::make_shared<CompactForTieringCollectorFactory>(
|
|
141
|
+
compaction_trigger_ratio);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
} // namespace ROCKSDB_NAMESPACE
|
package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include "rocksdb/utilities/table_properties_collectors.h"
|
|
10
|
+
|
|
11
|
+
namespace ROCKSDB_NAMESPACE {
|
|
12
|
+
|
|
13
|
+
// A user property collector that marks a SST file as need-compaction when for
|
|
14
|
+
// the tiering use case. See documentation for
|
|
15
|
+
// `CompactForTieringCollectorFactory`.
|
|
16
|
+
class CompactForTieringCollector : public TablePropertiesCollector {
|
|
17
|
+
public:
|
|
18
|
+
static const std::string kNumEligibleLastLevelEntriesPropertyName;
|
|
19
|
+
|
|
20
|
+
CompactForTieringCollector(
|
|
21
|
+
SequenceNumber last_level_inclusive_max_seqno_threshold_,
|
|
22
|
+
double compaction_trigger_ratio);
|
|
23
|
+
|
|
24
|
+
Status AddUserKey(const Slice& key, const Slice& value, EntryType type,
|
|
25
|
+
SequenceNumber seq, uint64_t file_size) override;
|
|
26
|
+
|
|
27
|
+
Status Finish(UserCollectedProperties* properties) override;
|
|
28
|
+
|
|
29
|
+
UserCollectedProperties GetReadableProperties() const override;
|
|
30
|
+
|
|
31
|
+
const char* Name() const override { return "CompactForTieringCollector"; }
|
|
32
|
+
|
|
33
|
+
bool NeedCompact() const override;
|
|
34
|
+
|
|
35
|
+
private:
|
|
36
|
+
void Reset();
|
|
37
|
+
|
|
38
|
+
SequenceNumber last_level_inclusive_max_seqno_threshold_;
|
|
39
|
+
double compaction_trigger_ratio_;
|
|
40
|
+
size_t last_level_eligible_entries_counter_ = 0;
|
|
41
|
+
size_t total_entries_counter_ = 0;
|
|
42
|
+
bool finish_called_ = false;
|
|
43
|
+
bool need_compaction_ = false;
|
|
44
|
+
};
|
|
45
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -0,0 +1,139 @@
|
|
|
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 "utilities/table_properties_collectors/compact_for_tiering_collector.h"
|
|
8
|
+
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <cmath>
|
|
11
|
+
#include <cstdio>
|
|
12
|
+
#include <iostream>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
#include "db/seqno_to_time_mapping.h"
|
|
16
|
+
#include "port/stack_trace.h"
|
|
17
|
+
#include "rocksdb/table.h"
|
|
18
|
+
#include "rocksdb/table_properties.h"
|
|
19
|
+
#include "rocksdb/utilities/table_properties_collectors.h"
|
|
20
|
+
#include "test_util/testharness.h"
|
|
21
|
+
#include "util/random.h"
|
|
22
|
+
|
|
23
|
+
namespace ROCKSDB_NAMESPACE {
|
|
24
|
+
|
|
25
|
+
TEST(CompactForTieringCollector, NotEnabled) {
|
|
26
|
+
TablePropertiesCollectorFactory::Context context;
|
|
27
|
+
context.column_family_id = 1;
|
|
28
|
+
context.level_at_creation = 1;
|
|
29
|
+
context.num_levels = 6;
|
|
30
|
+
context.last_level_inclusive_max_seqno_threshold = 50;
|
|
31
|
+
|
|
32
|
+
// Set compaction trigger ratio to 0 to disable it. No collector created.
|
|
33
|
+
auto factory = NewCompactForTieringCollectorFactory(0);
|
|
34
|
+
std::unique_ptr<TablePropertiesCollector> collector(
|
|
35
|
+
factory->CreateTablePropertiesCollector(context));
|
|
36
|
+
ASSERT_EQ(nullptr, collector);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
TEST(CompactForTieringCollector, TieringDisabled) {
|
|
40
|
+
TablePropertiesCollectorFactory::Context context;
|
|
41
|
+
context.column_family_id = 1;
|
|
42
|
+
context.level_at_creation = 1;
|
|
43
|
+
context.num_levels = 6;
|
|
44
|
+
context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
|
|
45
|
+
|
|
46
|
+
// Tiering is disabled on the column family. No collector created.
|
|
47
|
+
{
|
|
48
|
+
for (double compaction_trigger_ratio : {0.0, 0.1, 1.0, 1.5}) {
|
|
49
|
+
auto factory =
|
|
50
|
+
NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
|
|
51
|
+
std::unique_ptr<TablePropertiesCollector> collector(
|
|
52
|
+
factory->CreateTablePropertiesCollector(context));
|
|
53
|
+
ASSERT_EQ(nullptr, collector);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
TEST(CompactForTieringCollector, LastLevelFile) {
|
|
59
|
+
TablePropertiesCollectorFactory::Context context;
|
|
60
|
+
context.column_family_id = 1;
|
|
61
|
+
context.level_at_creation = 5;
|
|
62
|
+
context.num_levels = 6;
|
|
63
|
+
context.last_level_inclusive_max_seqno_threshold = 50;
|
|
64
|
+
|
|
65
|
+
// No collector created for a file that is already on the last level.
|
|
66
|
+
{
|
|
67
|
+
for (double compaction_trigger_ratio : {0.0, 0.1, 1.0, 1.5}) {
|
|
68
|
+
auto factory =
|
|
69
|
+
NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
|
|
70
|
+
std::unique_ptr<TablePropertiesCollector> collector(
|
|
71
|
+
factory->CreateTablePropertiesCollector(context));
|
|
72
|
+
ASSERT_EQ(nullptr, collector);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
TEST(CompactForTieringCollector, CollectorEnabled) {
|
|
78
|
+
TablePropertiesCollectorFactory::Context context;
|
|
79
|
+
context.column_family_id = 1;
|
|
80
|
+
context.level_at_creation = 1;
|
|
81
|
+
context.num_levels = 6;
|
|
82
|
+
context.last_level_inclusive_max_seqno_threshold = 50;
|
|
83
|
+
const size_t kTotalEntries = 100;
|
|
84
|
+
|
|
85
|
+
{
|
|
86
|
+
for (double compaction_trigger_ratio : {0.1, 0.33333333, 0.5, 1.0, 1.5}) {
|
|
87
|
+
auto factory =
|
|
88
|
+
NewCompactForTieringCollectorFactory(compaction_trigger_ratio);
|
|
89
|
+
std::unique_ptr<TablePropertiesCollector> collector(
|
|
90
|
+
factory->CreateTablePropertiesCollector(context));
|
|
91
|
+
for (size_t i = 0; i < kTotalEntries; i++) {
|
|
92
|
+
ASSERT_OK(collector->AddUserKey("hello", "rocksdb", kEntryPut, i, 0));
|
|
93
|
+
ASSERT_FALSE(collector->NeedCompact());
|
|
94
|
+
}
|
|
95
|
+
UserCollectedProperties user_properties;
|
|
96
|
+
ASSERT_OK(collector->Finish(&user_properties));
|
|
97
|
+
ASSERT_EQ(user_properties[CompactForTieringCollector::
|
|
98
|
+
kNumEligibleLastLevelEntriesPropertyName],
|
|
99
|
+
std::to_string(50));
|
|
100
|
+
if (compaction_trigger_ratio > 0.5) {
|
|
101
|
+
ASSERT_FALSE(collector->NeedCompact());
|
|
102
|
+
} else {
|
|
103
|
+
ASSERT_TRUE(collector->NeedCompact());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
TEST(CompactForTieringCollector, TimedPutEntries) {
|
|
110
|
+
TablePropertiesCollectorFactory::Context context;
|
|
111
|
+
context.column_family_id = 1;
|
|
112
|
+
context.level_at_creation = 1;
|
|
113
|
+
context.num_levels = 6;
|
|
114
|
+
context.last_level_inclusive_max_seqno_threshold = 50;
|
|
115
|
+
const size_t kTotalEntries = 100;
|
|
116
|
+
|
|
117
|
+
auto factory = NewCompactForTieringCollectorFactory(0.1);
|
|
118
|
+
std::unique_ptr<TablePropertiesCollector> collector(
|
|
119
|
+
factory->CreateTablePropertiesCollector(context));
|
|
120
|
+
for (size_t i = 0; i < kTotalEntries; i++) {
|
|
121
|
+
std::string value;
|
|
122
|
+
PackValueAndSeqno("rocksdb", i, &value);
|
|
123
|
+
ASSERT_OK(collector->AddUserKey("hello", value, kEntryTimedPut, 0, 0));
|
|
124
|
+
ASSERT_FALSE(collector->NeedCompact());
|
|
125
|
+
}
|
|
126
|
+
UserCollectedProperties user_properties;
|
|
127
|
+
ASSERT_OK(collector->Finish(&user_properties));
|
|
128
|
+
ASSERT_EQ(user_properties[CompactForTieringCollector::
|
|
129
|
+
kNumEligibleLastLevelEntriesPropertyName],
|
|
130
|
+
std::to_string(50));
|
|
131
|
+
ASSERT_TRUE(collector->NeedCompact());
|
|
132
|
+
}
|
|
133
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
134
|
+
|
|
135
|
+
int main(int argc, char** argv) {
|
|
136
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
137
|
+
::testing::InitGoogleTest(&argc, argv);
|
|
138
|
+
return RUN_ALL_TESTS();
|
|
139
|
+
}
|
package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc
CHANGED
|
@@ -188,6 +188,7 @@ NewCompactOnDeletionCollectorFactory(size_t sliding_window_size,
|
|
|
188
188
|
new CompactOnDeletionCollectorFactory(sliding_window_size,
|
|
189
189
|
deletion_trigger, deletion_ratio));
|
|
190
190
|
}
|
|
191
|
+
|
|
191
192
|
namespace {
|
|
192
193
|
static int RegisterTablePropertiesCollectorFactories(
|
|
193
194
|
ObjectLibrary& library, const std::string& /*arg*/) {
|
|
@@ -202,6 +203,17 @@ static int RegisterTablePropertiesCollectorFactories(
|
|
|
202
203
|
guard->reset(new CompactOnDeletionCollectorFactory(0, 0, 0));
|
|
203
204
|
return guard->get();
|
|
204
205
|
});
|
|
206
|
+
library.AddFactory<TablePropertiesCollectorFactory>(
|
|
207
|
+
CompactForTieringCollectorFactory::kClassName(),
|
|
208
|
+
[](const std::string& /*uri*/,
|
|
209
|
+
std::unique_ptr<TablePropertiesCollectorFactory>* guard,
|
|
210
|
+
std::string* /* errmsg */) {
|
|
211
|
+
// By default, create a `CompactForTieringCollectorFactory` that is
|
|
212
|
+
// disabled. Users will need to call corresponding setters to enable
|
|
213
|
+
// the factory.
|
|
214
|
+
guard->reset(new CompactForTieringCollectorFactory(0));
|
|
215
|
+
return guard->get();
|
|
216
|
+
});
|
|
205
217
|
return 1;
|
|
206
218
|
}
|
|
207
219
|
} // namespace
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
#include <cstdio>
|
|
15
15
|
#include <vector>
|
|
16
16
|
|
|
17
|
+
#include "db/dbformat.h"
|
|
17
18
|
#include "port/stack_trace.h"
|
|
18
19
|
#include "rocksdb/table.h"
|
|
19
20
|
#include "rocksdb/table_properties.h"
|
|
@@ -27,6 +28,7 @@ TEST(CompactOnDeletionCollector, DeletionRatio) {
|
|
|
27
28
|
TablePropertiesCollectorFactory::Context context;
|
|
28
29
|
context.column_family_id =
|
|
29
30
|
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
|
|
31
|
+
context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
|
|
30
32
|
const size_t kTotalEntries = 100;
|
|
31
33
|
|
|
32
34
|
{
|
|
@@ -86,6 +88,7 @@ TEST(CompactOnDeletionCollector, SlidingWindow) {
|
|
|
86
88
|
TablePropertiesCollectorFactory::Context context;
|
|
87
89
|
context.column_family_id =
|
|
88
90
|
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
|
|
91
|
+
context.last_level_inclusive_max_seqno_threshold = kMaxSequenceNumber;
|
|
89
92
|
|
|
90
93
|
std::vector<int> window_sizes;
|
|
91
94
|
std::vector<int> deletion_triggers;
|
|
@@ -1719,9 +1719,10 @@ TEST_P(OptimisticTransactionTest, PutEntitySuccess) {
|
|
|
1719
1719
|
}
|
|
1720
1720
|
|
|
1721
1721
|
{
|
|
1722
|
-
|
|
1723
|
-
ASSERT_OK(txn->
|
|
1724
|
-
|
|
1722
|
+
PinnableWideColumns columns;
|
|
1723
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
1724
|
+
ReadOptions(), txn_db->DefaultColumnFamily(), foo, &columns));
|
|
1725
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
1725
1726
|
}
|
|
1726
1727
|
|
|
1727
1728
|
ASSERT_OK(
|
|
@@ -1737,9 +1738,10 @@ TEST_P(OptimisticTransactionTest, PutEntitySuccess) {
|
|
|
1737
1738
|
}
|
|
1738
1739
|
|
|
1739
1740
|
{
|
|
1740
|
-
|
|
1741
|
-
ASSERT_OK(txn->
|
|
1742
|
-
|
|
1741
|
+
PinnableWideColumns columns;
|
|
1742
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
1743
|
+
ReadOptions(), txn_db->DefaultColumnFamily(), foo, &columns));
|
|
1744
|
+
ASSERT_EQ(columns.columns(), foo_new_columns);
|
|
1743
1745
|
}
|
|
1744
1746
|
|
|
1745
1747
|
ASSERT_OK(txn->Commit());
|
|
@@ -2034,6 +2036,60 @@ TEST_P(OptimisticTransactionTest, PutEntityWriteConflictTxnTxn) {
|
|
|
2034
2036
|
}
|
|
2035
2037
|
}
|
|
2036
2038
|
|
|
2039
|
+
TEST_P(OptimisticTransactionTest, PutEntityReadConflict) {
|
|
2040
|
+
constexpr char foo[] = "foo";
|
|
2041
|
+
const WideColumns foo_columns{
|
|
2042
|
+
{kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
|
|
2043
|
+
|
|
2044
|
+
ASSERT_OK(txn_db->PutEntity(WriteOptions(), txn_db->DefaultColumnFamily(),
|
|
2045
|
+
foo, foo_columns));
|
|
2046
|
+
|
|
2047
|
+
std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
|
|
2048
|
+
ASSERT_NE(txn, nullptr);
|
|
2049
|
+
|
|
2050
|
+
txn->SetSnapshot();
|
|
2051
|
+
|
|
2052
|
+
ReadOptions snapshot_read_options;
|
|
2053
|
+
snapshot_read_options.snapshot = txn->GetSnapshot();
|
|
2054
|
+
|
|
2055
|
+
{
|
|
2056
|
+
PinnableWideColumns columns;
|
|
2057
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
2058
|
+
snapshot_read_options, txn_db->DefaultColumnFamily(), foo, &columns));
|
|
2059
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
// This PutEntity outside of a transaction will conflict with the previous
|
|
2063
|
+
// write
|
|
2064
|
+
const WideColumns foo_conflict_columns{{kDefaultWideColumnName, "X"},
|
|
2065
|
+
{"conflicting", "write"}};
|
|
2066
|
+
ASSERT_OK(txn_db->PutEntity(WriteOptions(), txn_db->DefaultColumnFamily(),
|
|
2067
|
+
foo, foo_conflict_columns));
|
|
2068
|
+
|
|
2069
|
+
{
|
|
2070
|
+
PinnableWideColumns columns;
|
|
2071
|
+
ASSERT_OK(txn_db->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(),
|
|
2072
|
+
foo, &columns));
|
|
2073
|
+
ASSERT_EQ(columns.columns(), foo_conflict_columns);
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
{
|
|
2077
|
+
PinnableWideColumns columns;
|
|
2078
|
+
ASSERT_OK(txn->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(), foo,
|
|
2079
|
+
&columns));
|
|
2080
|
+
ASSERT_EQ(columns.columns(), foo_conflict_columns);
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
ASSERT_TRUE(txn->Commit().IsBusy()); // Txn should not commit
|
|
2084
|
+
|
|
2085
|
+
{
|
|
2086
|
+
PinnableWideColumns columns;
|
|
2087
|
+
ASSERT_OK(txn_db->GetEntity(ReadOptions(), txn_db->DefaultColumnFamily(),
|
|
2088
|
+
foo, &columns));
|
|
2089
|
+
ASSERT_EQ(columns.columns(), foo_conflict_columns);
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
|
|
2037
2093
|
TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
|
|
2038
2094
|
constexpr char foo[] = "foo";
|
|
2039
2095
|
constexpr char bar[] = "bar";
|
|
@@ -2121,6 +2177,49 @@ TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
|
|
|
2121
2177
|
ASSERT_TRUE(statuses[0].IsInvalidArgument());
|
|
2122
2178
|
ASSERT_TRUE(statuses[1].IsInvalidArgument());
|
|
2123
2179
|
}
|
|
2180
|
+
|
|
2181
|
+
{
|
|
2182
|
+
constexpr ColumnFamilyHandle* column_family = nullptr;
|
|
2183
|
+
PinnableWideColumns columns;
|
|
2184
|
+
ASSERT_TRUE(
|
|
2185
|
+
txn->GetEntityForUpdate(ReadOptions(), column_family, foo, &columns)
|
|
2186
|
+
.IsInvalidArgument());
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
{
|
|
2190
|
+
constexpr PinnableWideColumns* columns = nullptr;
|
|
2191
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(ReadOptions(),
|
|
2192
|
+
txn_db->DefaultColumnFamily(), foo,
|
|
2193
|
+
columns)
|
|
2194
|
+
.IsInvalidArgument());
|
|
2195
|
+
}
|
|
2196
|
+
|
|
2197
|
+
{
|
|
2198
|
+
ReadOptions read_options;
|
|
2199
|
+
read_options.io_activity = Env::IOActivity::kGet;
|
|
2200
|
+
|
|
2201
|
+
PinnableWideColumns columns;
|
|
2202
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(read_options,
|
|
2203
|
+
txn_db->DefaultColumnFamily(), foo,
|
|
2204
|
+
&columns)
|
|
2205
|
+
.IsInvalidArgument());
|
|
2206
|
+
}
|
|
2207
|
+
|
|
2208
|
+
{
|
|
2209
|
+
txn->SetSnapshot();
|
|
2210
|
+
|
|
2211
|
+
ReadOptions read_options;
|
|
2212
|
+
read_options.snapshot = txn->GetSnapshot();
|
|
2213
|
+
|
|
2214
|
+
PinnableWideColumns columns;
|
|
2215
|
+
constexpr bool exclusive = true;
|
|
2216
|
+
constexpr bool do_validate = false;
|
|
2217
|
+
|
|
2218
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(read_options,
|
|
2219
|
+
txn_db->DefaultColumnFamily(), foo,
|
|
2220
|
+
&columns, exclusive, do_validate)
|
|
2221
|
+
.IsInvalidArgument());
|
|
2222
|
+
}
|
|
2124
2223
|
}
|
|
2125
2224
|
|
|
2126
2225
|
INSTANTIATE_TEST_CASE_P(
|
|
@@ -217,6 +217,60 @@ inline Status WriteCommittedTxn::GetForUpdateImpl(
|
|
|
217
217
|
value, exclusive, do_validate);
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
Status WriteCommittedTxn::GetEntityForUpdate(const ReadOptions& read_options,
|
|
221
|
+
ColumnFamilyHandle* column_family,
|
|
222
|
+
const Slice& key,
|
|
223
|
+
PinnableWideColumns* columns,
|
|
224
|
+
bool exclusive, bool do_validate) {
|
|
225
|
+
if (!column_family) {
|
|
226
|
+
return Status::InvalidArgument(
|
|
227
|
+
"Cannot call GetEntityForUpdate without a column family handle");
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const Comparator* const ucmp = column_family->GetComparator();
|
|
231
|
+
assert(ucmp);
|
|
232
|
+
const size_t ts_sz = ucmp->timestamp_size();
|
|
233
|
+
|
|
234
|
+
if (ts_sz == 0) {
|
|
235
|
+
return TransactionBaseImpl::GetEntityForUpdate(
|
|
236
|
+
read_options, column_family, key, columns, exclusive, do_validate);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
assert(ts_sz > 0);
|
|
240
|
+
|
|
241
|
+
if (!do_validate) {
|
|
242
|
+
if (read_timestamp_ != kMaxTxnTimestamp) {
|
|
243
|
+
return Status::InvalidArgument(
|
|
244
|
+
"Read timestamp must not be set if validation is disabled");
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
if (read_timestamp_ == kMaxTxnTimestamp) {
|
|
248
|
+
return Status::InvalidArgument(
|
|
249
|
+
"Read timestamp must be set for validation");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
std::string ts_buf;
|
|
254
|
+
PutFixed64(&ts_buf, read_timestamp_);
|
|
255
|
+
Slice ts(ts_buf);
|
|
256
|
+
|
|
257
|
+
if (!read_options.timestamp) {
|
|
258
|
+
ReadOptions read_options_copy = read_options;
|
|
259
|
+
read_options_copy.timestamp = &ts;
|
|
260
|
+
|
|
261
|
+
return TransactionBaseImpl::GetEntityForUpdate(
|
|
262
|
+
read_options_copy, column_family, key, columns, exclusive, do_validate);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
assert(read_options.timestamp);
|
|
266
|
+
if (*read_options.timestamp != ts) {
|
|
267
|
+
return Status::InvalidArgument("Must read from the same read timestamp");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return TransactionBaseImpl::GetEntityForUpdate(
|
|
271
|
+
read_options, column_family, key, columns, exclusive, do_validate);
|
|
272
|
+
}
|
|
273
|
+
|
|
220
274
|
Status WriteCommittedTxn::PutEntityImpl(ColumnFamilyHandle* column_family,
|
|
221
275
|
const Slice& key,
|
|
222
276
|
const WideColumns& columns,
|
|
@@ -584,9 +638,9 @@ Status WriteCommittedTxn::PrepareInternal() {
|
|
|
584
638
|
SequenceNumber* const KIgnoreSeqUsed = nullptr;
|
|
585
639
|
const size_t kNoBatchCount = 0;
|
|
586
640
|
s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
|
|
587
|
-
kNoWriteCallback,
|
|
588
|
-
|
|
589
|
-
&mark_log_callback);
|
|
641
|
+
kNoWriteCallback, /*user_write_cb=*/nullptr,
|
|
642
|
+
&log_number_, kRefNoLog, kDisableMemtable,
|
|
643
|
+
KIgnoreSeqUsed, kNoBatchCount, &mark_log_callback);
|
|
590
644
|
return s;
|
|
591
645
|
}
|
|
592
646
|
|
|
@@ -719,11 +773,11 @@ Status WriteCommittedTxn::CommitWithoutPrepareInternal() {
|
|
|
719
773
|
post_mem_cb = &snapshot_creation_cb;
|
|
720
774
|
}
|
|
721
775
|
}
|
|
722
|
-
auto s = db_impl_->WriteImpl(
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
776
|
+
auto s = db_impl_->WriteImpl(
|
|
777
|
+
write_options_, wb,
|
|
778
|
+
/*callback*/ nullptr, /*user_write_cb=*/nullptr, /*log_used*/ nullptr,
|
|
779
|
+
/*log_ref*/ 0, /*disable_memtable*/ false, &seq_used, /*batch_cnt=*/0,
|
|
780
|
+
/*pre_release_callback=*/nullptr, post_mem_cb);
|
|
727
781
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
728
782
|
if (s.ok()) {
|
|
729
783
|
SetId(seq_used);
|
|
@@ -734,6 +788,7 @@ Status WriteCommittedTxn::CommitWithoutPrepareInternal() {
|
|
|
734
788
|
Status WriteCommittedTxn::CommitBatchInternal(WriteBatch* batch, size_t) {
|
|
735
789
|
uint64_t seq_used = kMaxSequenceNumber;
|
|
736
790
|
auto s = db_impl_->WriteImpl(write_options_, batch, /*callback*/ nullptr,
|
|
791
|
+
/*user_write_cb=*/nullptr,
|
|
737
792
|
/*log_used*/ nullptr, /*log_ref*/ 0,
|
|
738
793
|
/*disable_memtable*/ false, &seq_used);
|
|
739
794
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
@@ -807,6 +862,7 @@ Status WriteCommittedTxn::CommitInternal() {
|
|
|
807
862
|
}
|
|
808
863
|
}
|
|
809
864
|
s = db_impl_->WriteImpl(write_options_, working_batch, /*callback*/ nullptr,
|
|
865
|
+
/*user_write_cb=*/nullptr,
|
|
810
866
|
/*log_used*/ nullptr, /*log_ref*/ log_number_,
|
|
811
867
|
/*disable_memtable*/ false, &seq_used,
|
|
812
868
|
/*batch_cnt=*/0, /*pre_release_callback=*/nullptr,
|
|
@@ -234,6 +234,11 @@ class WriteCommittedTxn : public PessimisticTransaction {
|
|
|
234
234
|
PinnableSlice* pinnable_val, bool exclusive,
|
|
235
235
|
const bool do_validate) override;
|
|
236
236
|
|
|
237
|
+
Status GetEntityForUpdate(const ReadOptions& read_options,
|
|
238
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
239
|
+
PinnableWideColumns* columns, bool exclusive,
|
|
240
|
+
bool do_validate) override;
|
|
241
|
+
|
|
237
242
|
using TransactionBaseImpl::Put;
|
|
238
243
|
// `key` does NOT include timestamp even when it's enabled.
|
|
239
244
|
Status Put(ColumnFamilyHandle* column_family, const Slice& key,
|