@nxtedition/rocksdb 10.1.5 → 10.2.0
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 +19 -11
- 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/prebuilds/linux-x64/@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
|
@@ -351,6 +351,24 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
|
|
|
351
351
|
return s;
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
+
Status TransactionBaseImpl::GetEntityForUpdate(
|
|
355
|
+
const ReadOptions& read_options, ColumnFamilyHandle* column_family,
|
|
356
|
+
const Slice& key, PinnableWideColumns* columns, bool exclusive,
|
|
357
|
+
bool do_validate) {
|
|
358
|
+
if (!do_validate && read_options.snapshot != nullptr) {
|
|
359
|
+
return Status::InvalidArgument(
|
|
360
|
+
"Snapshot must not be set if validation is disabled");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const Status s =
|
|
364
|
+
TryLock(column_family, key, true /* read_only */, exclusive, do_validate);
|
|
365
|
+
if (!s.ok()) {
|
|
366
|
+
return s;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return GetEntityImpl(read_options, column_family, key, columns);
|
|
370
|
+
}
|
|
371
|
+
|
|
354
372
|
std::vector<Status> TransactionBaseImpl::MultiGet(
|
|
355
373
|
const ReadOptions& _read_options,
|
|
356
374
|
const std::vector<ColumnFamilyHandle*>& column_family,
|
|
@@ -814,11 +832,13 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
|
|
|
814
832
|
}
|
|
815
833
|
|
|
816
834
|
Status PutCF(uint32_t cf, const Slice& key, const Slice& val) override {
|
|
817
|
-
|
|
835
|
+
Slice user_key = GetUserKey(cf, key);
|
|
836
|
+
return txn_->Put(db_->GetColumnFamilyHandle(cf), user_key, val);
|
|
818
837
|
}
|
|
819
838
|
|
|
820
839
|
Status PutEntityCF(uint32_t cf, const Slice& key,
|
|
821
840
|
const Slice& entity) override {
|
|
841
|
+
Slice user_key = GetUserKey(cf, key);
|
|
822
842
|
Slice entity_copy = entity;
|
|
823
843
|
WideColumns columns;
|
|
824
844
|
const Status s =
|
|
@@ -827,19 +847,22 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
|
|
|
827
847
|
return s;
|
|
828
848
|
}
|
|
829
849
|
|
|
830
|
-
return txn_->PutEntity(db_->GetColumnFamilyHandle(cf),
|
|
850
|
+
return txn_->PutEntity(db_->GetColumnFamilyHandle(cf), user_key, columns);
|
|
831
851
|
}
|
|
832
852
|
|
|
833
853
|
Status DeleteCF(uint32_t cf, const Slice& key) override {
|
|
834
|
-
|
|
854
|
+
Slice user_key = GetUserKey(cf, key);
|
|
855
|
+
return txn_->Delete(db_->GetColumnFamilyHandle(cf), user_key);
|
|
835
856
|
}
|
|
836
857
|
|
|
837
858
|
Status SingleDeleteCF(uint32_t cf, const Slice& key) override {
|
|
838
|
-
|
|
859
|
+
Slice user_key = GetUserKey(cf, key);
|
|
860
|
+
return txn_->SingleDelete(db_->GetColumnFamilyHandle(cf), user_key);
|
|
839
861
|
}
|
|
840
862
|
|
|
841
863
|
Status MergeCF(uint32_t cf, const Slice& key, const Slice& val) override {
|
|
842
|
-
|
|
864
|
+
Slice user_key = GetUserKey(cf, key);
|
|
865
|
+
return txn_->Merge(db_->GetColumnFamilyHandle(cf), user_key, val);
|
|
843
866
|
}
|
|
844
867
|
|
|
845
868
|
// this is used for reconstructing prepared transactions upon
|
|
@@ -862,6 +885,21 @@ Status TransactionBaseImpl::RebuildFromWriteBatch(WriteBatch* src_batch) {
|
|
|
862
885
|
Status MarkRollback(const Slice&) override {
|
|
863
886
|
return Status::InvalidArgument();
|
|
864
887
|
}
|
|
888
|
+
size_t GetTimestampSize(uint32_t cf_id) {
|
|
889
|
+
auto cfd = db_->versions_->GetColumnFamilySet()->GetColumnFamily(cf_id);
|
|
890
|
+
const Comparator* ucmp = cfd->user_comparator();
|
|
891
|
+
assert(ucmp);
|
|
892
|
+
return ucmp->timestamp_size();
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
Slice GetUserKey(uint32_t cf_id, const Slice& key) {
|
|
896
|
+
size_t ts_sz = GetTimestampSize(cf_id);
|
|
897
|
+
if (ts_sz == 0) {
|
|
898
|
+
return key;
|
|
899
|
+
}
|
|
900
|
+
assert(key.size() >= ts_sz);
|
|
901
|
+
return Slice(key.data(), key.size() - ts_sz);
|
|
902
|
+
}
|
|
865
903
|
};
|
|
866
904
|
|
|
867
905
|
IndexedWriteBatchBuilder copycat(this, dbimpl_);
|
|
@@ -95,6 +95,11 @@ class TransactionBaseImpl : public Transaction {
|
|
|
95
95
|
exclusive, do_validate);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
Status GetEntityForUpdate(const ReadOptions& read_options,
|
|
99
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
100
|
+
PinnableWideColumns* columns, bool exclusive = true,
|
|
101
|
+
bool do_validate = true) override;
|
|
102
|
+
|
|
98
103
|
using Transaction::MultiGet;
|
|
99
104
|
std::vector<Status> MultiGet(
|
|
100
105
|
const ReadOptions& _read_options,
|
|
@@ -7025,9 +7025,10 @@ TEST_P(TransactionTest, PutEntitySuccess) {
|
|
|
7025
7025
|
}
|
|
7026
7026
|
|
|
7027
7027
|
{
|
|
7028
|
-
|
|
7029
|
-
ASSERT_OK(txn->
|
|
7030
|
-
|
|
7028
|
+
PinnableWideColumns columns;
|
|
7029
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
7030
|
+
ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
|
|
7031
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7031
7032
|
}
|
|
7032
7033
|
|
|
7033
7034
|
ASSERT_OK(txn->PutEntity(db->DefaultColumnFamily(), foo, foo_new_columns));
|
|
@@ -7042,9 +7043,10 @@ TEST_P(TransactionTest, PutEntitySuccess) {
|
|
|
7042
7043
|
}
|
|
7043
7044
|
|
|
7044
7045
|
{
|
|
7045
|
-
|
|
7046
|
-
ASSERT_OK(txn->
|
|
7047
|
-
|
|
7046
|
+
PinnableWideColumns columns;
|
|
7047
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
7048
|
+
ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
|
|
7049
|
+
ASSERT_EQ(columns.columns(), foo_new_columns);
|
|
7048
7050
|
}
|
|
7049
7051
|
|
|
7050
7052
|
ASSERT_OK(txn->Commit());
|
|
@@ -7227,6 +7229,67 @@ TEST_P(TransactionTest, PutEntityWriteConflict) {
|
|
|
7227
7229
|
}
|
|
7228
7230
|
}
|
|
7229
7231
|
|
|
7232
|
+
TEST_P(TransactionTest, PutEntityReadConflict) {
|
|
7233
|
+
const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
|
|
7234
|
+
if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
|
|
7235
|
+
ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
|
|
7236
|
+
return;
|
|
7237
|
+
}
|
|
7238
|
+
|
|
7239
|
+
constexpr char foo[] = "foo";
|
|
7240
|
+
const WideColumns foo_columns{
|
|
7241
|
+
{kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
|
|
7242
|
+
|
|
7243
|
+
ASSERT_OK(db->PutEntity(WriteOptions(), db->DefaultColumnFamily(), foo,
|
|
7244
|
+
foo_columns));
|
|
7245
|
+
|
|
7246
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
7247
|
+
ASSERT_NE(txn, nullptr);
|
|
7248
|
+
|
|
7249
|
+
txn->SetSnapshot();
|
|
7250
|
+
|
|
7251
|
+
ReadOptions snapshot_read_options;
|
|
7252
|
+
snapshot_read_options.snapshot = txn->GetSnapshot();
|
|
7253
|
+
|
|
7254
|
+
{
|
|
7255
|
+
PinnableWideColumns columns;
|
|
7256
|
+
ASSERT_OK(txn->GetEntityForUpdate(
|
|
7257
|
+
snapshot_read_options, db->DefaultColumnFamily(), foo, &columns));
|
|
7258
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7259
|
+
}
|
|
7260
|
+
|
|
7261
|
+
// This PutEntity outside of a transaction will conflict with the previous
|
|
7262
|
+
// write
|
|
7263
|
+
const WideColumns foo_conflict_columns{{kDefaultWideColumnName, "X"},
|
|
7264
|
+
{"conflicting", "write"}};
|
|
7265
|
+
ASSERT_TRUE(db->PutEntity(WriteOptions(), db->DefaultColumnFamily(), foo,
|
|
7266
|
+
foo_conflict_columns)
|
|
7267
|
+
.IsTimedOut());
|
|
7268
|
+
|
|
7269
|
+
{
|
|
7270
|
+
PinnableWideColumns columns;
|
|
7271
|
+
ASSERT_OK(
|
|
7272
|
+
db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
|
|
7273
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7274
|
+
}
|
|
7275
|
+
|
|
7276
|
+
{
|
|
7277
|
+
PinnableWideColumns columns;
|
|
7278
|
+
ASSERT_OK(txn->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo,
|
|
7279
|
+
&columns));
|
|
7280
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7281
|
+
}
|
|
7282
|
+
|
|
7283
|
+
ASSERT_OK(txn->Commit());
|
|
7284
|
+
|
|
7285
|
+
{
|
|
7286
|
+
PinnableWideColumns columns;
|
|
7287
|
+
ASSERT_OK(
|
|
7288
|
+
db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
|
|
7289
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7290
|
+
}
|
|
7291
|
+
}
|
|
7292
|
+
|
|
7230
7293
|
TEST_P(TransactionTest, EntityReadSanityChecks) {
|
|
7231
7294
|
constexpr char foo[] = "foo";
|
|
7232
7295
|
constexpr char bar[] = "bar";
|
|
@@ -7314,6 +7377,91 @@ TEST_P(TransactionTest, EntityReadSanityChecks) {
|
|
|
7314
7377
|
ASSERT_TRUE(statuses[0].IsInvalidArgument());
|
|
7315
7378
|
ASSERT_TRUE(statuses[1].IsInvalidArgument());
|
|
7316
7379
|
}
|
|
7380
|
+
|
|
7381
|
+
{
|
|
7382
|
+
constexpr ColumnFamilyHandle* column_family = nullptr;
|
|
7383
|
+
PinnableWideColumns columns;
|
|
7384
|
+
ASSERT_TRUE(
|
|
7385
|
+
txn->GetEntityForUpdate(ReadOptions(), column_family, foo, &columns)
|
|
7386
|
+
.IsInvalidArgument());
|
|
7387
|
+
}
|
|
7388
|
+
|
|
7389
|
+
{
|
|
7390
|
+
constexpr PinnableWideColumns* columns = nullptr;
|
|
7391
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(ReadOptions(),
|
|
7392
|
+
db->DefaultColumnFamily(), foo, columns)
|
|
7393
|
+
.IsInvalidArgument());
|
|
7394
|
+
}
|
|
7395
|
+
|
|
7396
|
+
{
|
|
7397
|
+
ReadOptions read_options;
|
|
7398
|
+
read_options.io_activity = Env::IOActivity::kGet;
|
|
7399
|
+
|
|
7400
|
+
PinnableWideColumns columns;
|
|
7401
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(read_options, db->DefaultColumnFamily(),
|
|
7402
|
+
foo, &columns)
|
|
7403
|
+
.IsInvalidArgument());
|
|
7404
|
+
}
|
|
7405
|
+
|
|
7406
|
+
{
|
|
7407
|
+
txn->SetSnapshot();
|
|
7408
|
+
|
|
7409
|
+
ReadOptions read_options;
|
|
7410
|
+
read_options.snapshot = txn->GetSnapshot();
|
|
7411
|
+
|
|
7412
|
+
PinnableWideColumns columns;
|
|
7413
|
+
constexpr bool exclusive = true;
|
|
7414
|
+
constexpr bool do_validate = false;
|
|
7415
|
+
|
|
7416
|
+
ASSERT_TRUE(txn->GetEntityForUpdate(read_options, db->DefaultColumnFamily(),
|
|
7417
|
+
foo, &columns, exclusive, do_validate)
|
|
7418
|
+
.IsInvalidArgument());
|
|
7419
|
+
}
|
|
7420
|
+
}
|
|
7421
|
+
|
|
7422
|
+
TEST_P(TransactionTest, PutEntityRecovery) {
|
|
7423
|
+
const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
|
|
7424
|
+
if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
|
|
7425
|
+
ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
|
|
7426
|
+
return;
|
|
7427
|
+
}
|
|
7428
|
+
|
|
7429
|
+
constexpr char foo[] = "foo";
|
|
7430
|
+
const WideColumns foo_columns{
|
|
7431
|
+
{kDefaultWideColumnName, "bar"}, {"col1", "val1"}, {"col2", "val2"}};
|
|
7432
|
+
|
|
7433
|
+
constexpr char xid[] = "xid";
|
|
7434
|
+
|
|
7435
|
+
{
|
|
7436
|
+
WriteOptions write_options;
|
|
7437
|
+
write_options.sync = true;
|
|
7438
|
+
write_options.disableWAL = false;
|
|
7439
|
+
|
|
7440
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(write_options));
|
|
7441
|
+
ASSERT_NE(txn, nullptr);
|
|
7442
|
+
|
|
7443
|
+
ASSERT_OK(txn->SetName(xid));
|
|
7444
|
+
|
|
7445
|
+
ASSERT_OK(txn->PutEntity(db->DefaultColumnFamily(), foo, foo_columns));
|
|
7446
|
+
|
|
7447
|
+
ASSERT_OK(txn->Prepare());
|
|
7448
|
+
}
|
|
7449
|
+
|
|
7450
|
+
ASSERT_OK(ReOpenNoDelete());
|
|
7451
|
+
|
|
7452
|
+
{
|
|
7453
|
+
std::unique_ptr<Transaction> txn(db->GetTransactionByName(xid));
|
|
7454
|
+
ASSERT_NE(txn, nullptr);
|
|
7455
|
+
|
|
7456
|
+
ASSERT_OK(txn->Commit());
|
|
7457
|
+
}
|
|
7458
|
+
|
|
7459
|
+
{
|
|
7460
|
+
PinnableWideColumns columns;
|
|
7461
|
+
ASSERT_OK(
|
|
7462
|
+
db->GetEntity(ReadOptions(), db->DefaultColumnFamily(), foo, &columns));
|
|
7463
|
+
ASSERT_EQ(columns.columns(), foo_columns);
|
|
7464
|
+
}
|
|
7317
7465
|
}
|
|
7318
7466
|
|
|
7319
7467
|
TEST_F(TransactionDBTest, CollapseKey) {
|
|
@@ -463,7 +463,7 @@ class TransactionTestBase : public ::testing::Test {
|
|
|
463
463
|
}
|
|
464
464
|
db_impl = static_cast_with_check<DBImpl>(db->GetRootDB());
|
|
465
465
|
// Check that WAL is empty
|
|
466
|
-
|
|
466
|
+
VectorWalPtr log_files;
|
|
467
467
|
ASSERT_OK(db_impl->GetSortedWalFiles(log_files));
|
|
468
468
|
ASSERT_EQ(0, log_files.size());
|
|
469
469
|
|
|
@@ -288,12 +288,25 @@ TEST_P(WriteCommittedTxnWithTsTest, RecoverFromWal) {
|
|
|
288
288
|
|
|
289
289
|
txn0.reset();
|
|
290
290
|
|
|
291
|
+
std::unique_ptr<Transaction> txn3(
|
|
292
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
293
|
+
assert(txn3);
|
|
294
|
+
ASSERT_OK(txn3->Put(handles_[1], "baz", "baz_value"));
|
|
295
|
+
ASSERT_OK(txn3->SetName("txn3"));
|
|
296
|
+
ASSERT_OK(txn3->Prepare());
|
|
297
|
+
txn3.reset();
|
|
298
|
+
|
|
291
299
|
ASSERT_OK(ReOpenNoDelete(cf_descs, &handles_));
|
|
292
300
|
|
|
293
301
|
{
|
|
302
|
+
Transaction* recovered_txn0 = db->GetTransactionByName("txn0");
|
|
303
|
+
ASSERT_OK(recovered_txn0->SetCommitTimestamp(23));
|
|
304
|
+
ASSERT_OK(recovered_txn0->Commit());
|
|
305
|
+
delete recovered_txn0;
|
|
294
306
|
std::string value;
|
|
295
307
|
Status s = GetFromDb(ReadOptions(), handles_[1], "foo", /*ts=*/23, &value);
|
|
296
|
-
|
|
308
|
+
ASSERT_OK(s);
|
|
309
|
+
ASSERT_EQ("foo_value", value);
|
|
297
310
|
|
|
298
311
|
s = db->Get(ReadOptions(), handles_[0], "bar", &value);
|
|
299
312
|
ASSERT_OK(s);
|
|
@@ -314,6 +327,9 @@ TEST_P(WriteCommittedTxnWithTsTest, RecoverFromWal) {
|
|
|
314
327
|
s = GetFromDb(ReadOptions(), handles_[1], "key1", /*ts=*/24, &value);
|
|
315
328
|
ASSERT_OK(s);
|
|
316
329
|
ASSERT_EQ("value_3", value);
|
|
330
|
+
|
|
331
|
+
s = GetFromDb(ReadOptions(), handles_[1], "baz", /*ts=*/24, &value);
|
|
332
|
+
ASSERT_TRUE(s.IsNotFound());
|
|
317
333
|
}
|
|
318
334
|
}
|
|
319
335
|
|
|
@@ -717,6 +733,147 @@ TEST_P(WriteCommittedTxnWithTsTest, CheckKeysForConflicts) {
|
|
|
717
733
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
718
734
|
}
|
|
719
735
|
|
|
736
|
+
TEST_P(WriteCommittedTxnWithTsTest, GetEntityForUpdate) {
|
|
737
|
+
ASSERT_OK(ReOpenNoDelete());
|
|
738
|
+
|
|
739
|
+
ColumnFamilyOptions cf_options;
|
|
740
|
+
cf_options.comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
741
|
+
|
|
742
|
+
const std::string test_cf_name = "test_cf";
|
|
743
|
+
|
|
744
|
+
ColumnFamilyHandle* cfh = nullptr;
|
|
745
|
+
ASSERT_OK(db->CreateColumnFamily(cf_options, test_cf_name, &cfh));
|
|
746
|
+
std::unique_ptr<ColumnFamilyHandle> cfh_guard(cfh);
|
|
747
|
+
|
|
748
|
+
constexpr char foo[] = "foo";
|
|
749
|
+
constexpr char bar[] = "bar";
|
|
750
|
+
constexpr char baz[] = "baz";
|
|
751
|
+
constexpr char quux[] = "quux";
|
|
752
|
+
|
|
753
|
+
{
|
|
754
|
+
std::unique_ptr<Transaction> txn0(
|
|
755
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
756
|
+
|
|
757
|
+
{
|
|
758
|
+
std::unique_ptr<Transaction> txn1(
|
|
759
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
760
|
+
ASSERT_OK(txn1->Put(cfh, foo, bar));
|
|
761
|
+
ASSERT_OK(txn1->Put(cfh, baz, quux));
|
|
762
|
+
ASSERT_OK(txn1->SetCommitTimestamp(24));
|
|
763
|
+
ASSERT_OK(txn1->Commit());
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
ASSERT_OK(txn0->SetReadTimestampForValidation(23));
|
|
767
|
+
|
|
768
|
+
// Validation fails: timestamp from db(24) > validation timestamp(23)
|
|
769
|
+
PinnableWideColumns columns;
|
|
770
|
+
ASSERT_TRUE(
|
|
771
|
+
txn0->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns).IsBusy());
|
|
772
|
+
|
|
773
|
+
ASSERT_OK(txn0->Rollback());
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
{
|
|
777
|
+
std::unique_ptr<Transaction> txn2(
|
|
778
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
779
|
+
|
|
780
|
+
ASSERT_OK(txn2->SetReadTimestampForValidation(25));
|
|
781
|
+
|
|
782
|
+
// Validation successful: timestamp from db(24) < validation timestamp (25)
|
|
783
|
+
{
|
|
784
|
+
PinnableWideColumns columns;
|
|
785
|
+
ASSERT_OK(txn2->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns));
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// Using a different read timestamp in ReadOptions while doing validation is
|
|
789
|
+
// not allowed
|
|
790
|
+
{
|
|
791
|
+
ReadOptions read_options;
|
|
792
|
+
std::string read_timestamp;
|
|
793
|
+
Slice diff_read_ts = EncodeU64Ts(24, &read_timestamp);
|
|
794
|
+
read_options.timestamp = &diff_read_ts;
|
|
795
|
+
|
|
796
|
+
PinnableWideColumns columns;
|
|
797
|
+
ASSERT_TRUE(txn2->GetEntityForUpdate(read_options, cfh, foo, &columns)
|
|
798
|
+
.IsInvalidArgument());
|
|
799
|
+
|
|
800
|
+
ASSERT_OK(txn2->SetCommitTimestamp(26));
|
|
801
|
+
ASSERT_OK(txn2->Commit());
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// GetEntityForUpdate with validation timestamp set but no validation is not
|
|
806
|
+
// allowed
|
|
807
|
+
{
|
|
808
|
+
std::unique_ptr<Transaction> txn3(
|
|
809
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
810
|
+
|
|
811
|
+
ASSERT_OK(txn3->SetReadTimestampForValidation(27));
|
|
812
|
+
|
|
813
|
+
PinnableWideColumns columns;
|
|
814
|
+
ASSERT_TRUE(txn3->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns,
|
|
815
|
+
/*exclusive=*/true,
|
|
816
|
+
/*do_validate=*/false)
|
|
817
|
+
.IsInvalidArgument());
|
|
818
|
+
|
|
819
|
+
ASSERT_OK(txn3->Rollback());
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// GetEntityForUpdate with validation but no validation timestamp is not
|
|
823
|
+
// allowed
|
|
824
|
+
{
|
|
825
|
+
std::unique_ptr<Transaction> txn4(
|
|
826
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
827
|
+
|
|
828
|
+
// ReadOptions.timestamp is not set
|
|
829
|
+
{
|
|
830
|
+
PinnableWideColumns columns;
|
|
831
|
+
ASSERT_TRUE(txn4->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns)
|
|
832
|
+
.IsInvalidArgument());
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
// ReadOptions.timestamp is set
|
|
836
|
+
{
|
|
837
|
+
ReadOptions read_options;
|
|
838
|
+
std::string read_timestamp;
|
|
839
|
+
Slice read_ts = EncodeU64Ts(27, &read_timestamp);
|
|
840
|
+
read_options.timestamp = &read_ts;
|
|
841
|
+
|
|
842
|
+
PinnableWideColumns columns;
|
|
843
|
+
ASSERT_TRUE(txn4->GetEntityForUpdate(read_options, cfh, foo, &columns)
|
|
844
|
+
.IsInvalidArgument());
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
ASSERT_OK(txn4->Rollback());
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// Validation disabled
|
|
851
|
+
{
|
|
852
|
+
std::unique_ptr<Transaction> txn5(
|
|
853
|
+
NewTxn(WriteOptions(), TransactionOptions()));
|
|
854
|
+
|
|
855
|
+
// ReadOptions.timestamp is not set => success
|
|
856
|
+
{
|
|
857
|
+
PinnableWideColumns columns;
|
|
858
|
+
ASSERT_OK(txn5->GetEntityForUpdate(ReadOptions(), cfh, foo, &columns,
|
|
859
|
+
/*exclusive=*/true,
|
|
860
|
+
/*do_validate=*/false));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// ReadOptions.timestamp explicitly set to max timestamp => success
|
|
864
|
+
{
|
|
865
|
+
ReadOptions read_options;
|
|
866
|
+
Slice max_ts = MaxU64Ts();
|
|
867
|
+
read_options.timestamp = &max_ts;
|
|
868
|
+
|
|
869
|
+
PinnableWideColumns columns;
|
|
870
|
+
ASSERT_OK(txn5->GetEntityForUpdate(read_options, cfh, baz, &columns,
|
|
871
|
+
/*exclusive=*/true,
|
|
872
|
+
/*do_validate=*/false));
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
720
877
|
} // namespace ROCKSDB_NAMESPACE
|
|
721
878
|
|
|
722
879
|
int main(int argc, char** argv) {
|
|
@@ -724,4 +881,3 @@ int main(int argc, char** argv) {
|
|
|
724
881
|
::testing::InitGoogleTest(&argc, argv);
|
|
725
882
|
return RUN_ALL_TESTS();
|
|
726
883
|
}
|
|
727
|
-
|
|
@@ -154,8 +154,9 @@ Status WritePreparedTxn::PrepareInternal() {
|
|
|
154
154
|
const bool DISABLE_MEMTABLE = true;
|
|
155
155
|
uint64_t seq_used = kMaxSequenceNumber;
|
|
156
156
|
s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
|
|
157
|
-
/*callback*/ nullptr,
|
|
158
|
-
|
|
157
|
+
/*callback*/ nullptr, /*user_write_cb=*/nullptr,
|
|
158
|
+
&log_number_, /*log ref*/ 0, !DISABLE_MEMTABLE,
|
|
159
|
+
&seq_used, prepare_batch_cnt_,
|
|
159
160
|
&add_prepared_callback);
|
|
160
161
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
161
162
|
auto prepare_seq = seq_used;
|
|
@@ -247,9 +248,10 @@ Status WritePreparedTxn::CommitInternal() {
|
|
|
247
248
|
// TransactionOptions::use_only_the_last_commit_time_batch_for_recovery to
|
|
248
249
|
// true. See the comments about GetCommitTimeWriteBatch() in
|
|
249
250
|
// include/rocksdb/utilities/transaction.h.
|
|
250
|
-
s = db_impl_->WriteImpl(write_options_, working_batch, nullptr,
|
|
251
|
-
|
|
252
|
-
batch_cnt,
|
|
251
|
+
s = db_impl_->WriteImpl(write_options_, working_batch, nullptr,
|
|
252
|
+
/*user_write_cb=*/nullptr, nullptr, zero_log_number,
|
|
253
|
+
disable_memtable, &seq_used, batch_cnt,
|
|
254
|
+
pre_release_callback);
|
|
253
255
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
254
256
|
const SequenceNumber commit_batch_seq = seq_used;
|
|
255
257
|
if (LIKELY(do_one_write || !s.ok())) {
|
|
@@ -284,8 +286,9 @@ Status WritePreparedTxn::CommitInternal() {
|
|
|
284
286
|
const bool DISABLE_MEMTABLE = true;
|
|
285
287
|
const size_t ONE_BATCH = 1;
|
|
286
288
|
const uint64_t NO_REF_LOG = 0;
|
|
287
|
-
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
|
|
288
|
-
|
|
289
|
+
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
|
|
290
|
+
/*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
|
|
291
|
+
DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
|
|
289
292
|
&update_commit_map_with_aux_batch);
|
|
290
293
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
291
294
|
return s;
|
|
@@ -450,8 +453,9 @@ Status WritePreparedTxn::RollbackInternal() {
|
|
|
450
453
|
// DB in one shot. min_uncommitted still works since it requires capturing
|
|
451
454
|
// data that is written to DB but not yet committed, while
|
|
452
455
|
// the rollback batch commits with PreReleaseCallback.
|
|
453
|
-
s = db_impl_->WriteImpl(write_options_, &rollback_batch, nullptr,
|
|
454
|
-
|
|
456
|
+
s = db_impl_->WriteImpl(write_options_, &rollback_batch, nullptr,
|
|
457
|
+
/*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
|
|
458
|
+
!DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
|
|
455
459
|
pre_release_callback);
|
|
456
460
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
457
461
|
if (!s.ok()) {
|
|
@@ -476,8 +480,9 @@ Status WritePreparedTxn::RollbackInternal() {
|
|
|
476
480
|
// In the absence of Prepare markers, use Noop as a batch separator
|
|
477
481
|
s = WriteBatchInternal::InsertNoop(&empty_batch);
|
|
478
482
|
assert(s.ok());
|
|
479
|
-
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
|
|
480
|
-
|
|
483
|
+
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr,
|
|
484
|
+
/*user_write_cb=*/nullptr, nullptr, NO_REF_LOG,
|
|
485
|
+
DISABLE_MEMTABLE, &seq_used, ONE_BATCH,
|
|
481
486
|
&update_commit_map_with_prepare);
|
|
482
487
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
483
488
|
ROCKS_LOG_DETAILS(db_impl_->immutable_db_options().info_log,
|
|
@@ -213,8 +213,8 @@ Status WritePreparedTxnDB::WriteInternal(const WriteOptions& write_options_orig,
|
|
|
213
213
|
} else {
|
|
214
214
|
pre_release_callback = &add_prepared_callback;
|
|
215
215
|
}
|
|
216
|
-
s = db_impl_->WriteImpl(write_options, batch, nullptr, nullptr,
|
|
217
|
-
!DISABLE_MEMTABLE, &seq_used, batch_cnt,
|
|
216
|
+
s = db_impl_->WriteImpl(write_options, batch, nullptr, nullptr, nullptr,
|
|
217
|
+
no_log_ref, !DISABLE_MEMTABLE, &seq_used, batch_cnt,
|
|
218
218
|
pre_release_callback);
|
|
219
219
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
220
220
|
uint64_t prepare_seq = seq_used;
|
|
@@ -240,8 +240,8 @@ Status WritePreparedTxnDB::WriteInternal(const WriteOptions& write_options_orig,
|
|
|
240
240
|
write_options.sync = false;
|
|
241
241
|
const size_t ONE_BATCH = 1; // Just to inc the seq
|
|
242
242
|
s = db_impl_->WriteImpl(write_options, &empty_batch, nullptr, nullptr,
|
|
243
|
-
no_log_ref, DISABLE_MEMTABLE, &seq_used,
|
|
244
|
-
&update_commit_map_with_prepare);
|
|
243
|
+
nullptr, no_log_ref, DISABLE_MEMTABLE, &seq_used,
|
|
244
|
+
ONE_BATCH, &update_commit_map_with_prepare);
|
|
245
245
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
246
246
|
// Note: RemovePrepared is called from within PreReleaseCallback
|
|
247
247
|
return s;
|
|
@@ -378,7 +378,8 @@ Status WriteUnpreparedTxn::FlushWriteBatchToDBInternal(bool prepared) {
|
|
|
378
378
|
// WriteImpl should not overwrite that value, so set log_used to nullptr if
|
|
379
379
|
// log_number_ is already set.
|
|
380
380
|
s = db_impl_->WriteImpl(write_options, GetWriteBatch()->GetWriteBatch(),
|
|
381
|
-
/*callback*/ nullptr,
|
|
381
|
+
/*callback*/ nullptr, /*user_write_cb=*/nullptr,
|
|
382
|
+
&last_log_number_,
|
|
382
383
|
/*log ref*/ 0, !DISABLE_MEMTABLE, &seq_used,
|
|
383
384
|
prepare_batch_cnt_, &add_prepared_callback);
|
|
384
385
|
if (log_number_ == 0) {
|
|
@@ -595,7 +596,7 @@ Status WriteUnpreparedTxn::CommitInternal() {
|
|
|
595
596
|
const uint64_t zero_log_number = 0ull;
|
|
596
597
|
size_t batch_cnt = UNLIKELY(commit_batch_cnt) ? commit_batch_cnt : 1;
|
|
597
598
|
s = db_impl_->WriteImpl(write_options_, working_batch, nullptr, nullptr,
|
|
598
|
-
zero_log_number, disable_memtable, &seq_used,
|
|
599
|
+
nullptr, zero_log_number, disable_memtable, &seq_used,
|
|
599
600
|
batch_cnt, pre_release_callback);
|
|
600
601
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
601
602
|
const SequenceNumber commit_batch_seq = seq_used;
|
|
@@ -639,8 +640,8 @@ Status WriteUnpreparedTxn::CommitInternal() {
|
|
|
639
640
|
const size_t ONE_BATCH = 1;
|
|
640
641
|
const uint64_t NO_REF_LOG = 0;
|
|
641
642
|
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
|
|
642
|
-
NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
|
|
643
|
-
&update_commit_map_with_commit_batch);
|
|
643
|
+
nullptr, NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
|
|
644
|
+
ONE_BATCH, &update_commit_map_with_commit_batch);
|
|
644
645
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
645
646
|
// Note RemovePrepared should be called after WriteImpl that publishsed the
|
|
646
647
|
// seq. Otherwise SmallestUnCommittedSeq optimization breaks.
|
|
@@ -771,8 +772,8 @@ Status WriteUnpreparedTxn::RollbackInternal() {
|
|
|
771
772
|
// data that is written to DB but not yet committed, while the rollback
|
|
772
773
|
// batch commits with PreReleaseCallback.
|
|
773
774
|
s = db_impl_->WriteImpl(write_options_, rollback_batch.GetWriteBatch(),
|
|
774
|
-
nullptr, nullptr,
|
|
775
|
-
&seq_used, rollback_batch_cnt,
|
|
775
|
+
nullptr, nullptr, nullptr, NO_REF_LOG,
|
|
776
|
+
!DISABLE_MEMTABLE, &seq_used, rollback_batch_cnt,
|
|
776
777
|
do_one_write ? &update_commit_map : nullptr);
|
|
777
778
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
778
779
|
if (!s.ok()) {
|
|
@@ -807,8 +808,8 @@ Status WriteUnpreparedTxn::RollbackInternal() {
|
|
|
807
808
|
s = WriteBatchInternal::InsertNoop(&empty_batch);
|
|
808
809
|
assert(s.ok());
|
|
809
810
|
s = db_impl_->WriteImpl(write_options_, &empty_batch, nullptr, nullptr,
|
|
810
|
-
NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
|
|
811
|
-
&update_commit_map_with_rollback_batch);
|
|
811
|
+
nullptr, NO_REF_LOG, DISABLE_MEMTABLE, &seq_used,
|
|
812
|
+
ONE_BATCH, &update_commit_map_with_rollback_batch);
|
|
812
813
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
813
814
|
// Mark the txn as rolled back
|
|
814
815
|
if (s.ok()) {
|
|
@@ -180,7 +180,8 @@ Status WriteUnpreparedTxnDB::RollbackRecoveredTransaction(
|
|
|
180
180
|
const size_t kOneBatch = 1;
|
|
181
181
|
uint64_t seq_used = kMaxSequenceNumber;
|
|
182
182
|
s = db_impl_->WriteImpl(w_options, &rollback_batch, nullptr, nullptr,
|
|
183
|
-
kNoLogRef, !kDisableMemtable, &seq_used,
|
|
183
|
+
nullptr, kNoLogRef, !kDisableMemtable, &seq_used,
|
|
184
|
+
kOneBatch);
|
|
184
185
|
if (!s.ok()) {
|
|
185
186
|
return s;
|
|
186
187
|
}
|