@nxtedition/rocksdb 13.1.4 → 13.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 +43 -16
- package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
- package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
- package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
- package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
- package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
- package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
- package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
- package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
- package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
- package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
- package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
- package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
- package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
- package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
- package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
- package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
- package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
- package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
- package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
- package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
- package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
- package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
- package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
- package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
- package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
- package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
- package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
- package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
- package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
- package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
- package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
- package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
- package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
- package/deps/rocksdb/rocksdb/port/port.h +5 -9
- package/deps/rocksdb/rocksdb/src.mk +8 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/format.cc +3 -3
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
- package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
- package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
- package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
- package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
- package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
|
@@ -2222,6 +2222,443 @@ TEST_P(OptimisticTransactionTest, EntityReadSanityChecks) {
|
|
|
2222
2222
|
}
|
|
2223
2223
|
}
|
|
2224
2224
|
|
|
2225
|
+
TEST_P(OptimisticTransactionTest, CoalescingIterator) {
|
|
2226
|
+
ColumnFamilyOptions cf_opts;
|
|
2227
|
+
cf_opts.enable_blob_files = true;
|
|
2228
|
+
|
|
2229
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
2230
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf1", &cfh1));
|
|
2231
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
2232
|
+
|
|
2233
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
2234
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf2", &cfh2));
|
|
2235
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
2236
|
+
|
|
2237
|
+
// Note: "cf1" keys are present only in CF1; "cf2" keys are only present in
|
|
2238
|
+
// CF2; "cf12" keys are present in both CFs. "a" keys are present only in the
|
|
2239
|
+
// database; "b" keys are present only in the transaction; "c" keys are
|
|
2240
|
+
// present in both the database and the transaction. The values indicate the
|
|
2241
|
+
// column family as well as whether the entry came from the database or the
|
|
2242
|
+
// transaction.
|
|
2243
|
+
|
|
2244
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_a", "cf1_a_db_cf1"));
|
|
2245
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_c", "cf1_c_db_cf1"));
|
|
2246
|
+
|
|
2247
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_a", "cf2_a_db_cf2"));
|
|
2248
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_c", "cf2_c_db_cf2"));
|
|
2249
|
+
|
|
2250
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_a", "cf12_a_db_cf1"));
|
|
2251
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_a", "cf12_a_db_cf2"));
|
|
2252
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_c", "cf12_c_db_cf1"));
|
|
2253
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_c", "cf12_c_db_cf2"));
|
|
2254
|
+
|
|
2255
|
+
ASSERT_OK(txn_db->Flush(FlushOptions(), cfh1));
|
|
2256
|
+
ASSERT_OK(txn_db->Flush(FlushOptions(), cfh2));
|
|
2257
|
+
|
|
2258
|
+
std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
|
|
2259
|
+
|
|
2260
|
+
ASSERT_OK(txn->Put(cfh1, "cf1_b", "cf1_b_txn_cf1"));
|
|
2261
|
+
ASSERT_OK(txn->Put(cfh1, "cf1_c", "cf1_c_txn_cf1"));
|
|
2262
|
+
|
|
2263
|
+
ASSERT_OK(txn->Put(cfh2, "cf2_b", "cf2_b_txn_cf2"));
|
|
2264
|
+
ASSERT_OK(txn->Put(cfh2, "cf2_c", "cf2_c_txn_cf2"));
|
|
2265
|
+
|
|
2266
|
+
ASSERT_OK(txn->Put(cfh1, "cf12_b", "cf12_b_txn_cf1"));
|
|
2267
|
+
ASSERT_OK(txn->Put(cfh2, "cf12_b", "cf12_b_txn_cf2"));
|
|
2268
|
+
ASSERT_OK(txn->Put(cfh1, "cf12_c", "cf12_c_txn_cf1"));
|
|
2269
|
+
ASSERT_OK(txn->Put(cfh2, "cf12_c", "cf12_c_txn_cf2"));
|
|
2270
|
+
|
|
2271
|
+
auto verify = [&](bool allow_unprepared_value, auto prepare_if_needed) {
|
|
2272
|
+
ReadOptions read_options;
|
|
2273
|
+
read_options.allow_unprepared_value = allow_unprepared_value;
|
|
2274
|
+
|
|
2275
|
+
std::unique_ptr<Iterator> iter(
|
|
2276
|
+
txn->GetCoalescingIterator(read_options, {cfh1, cfh2}));
|
|
2277
|
+
|
|
2278
|
+
{
|
|
2279
|
+
iter->SeekToFirst();
|
|
2280
|
+
ASSERT_TRUE(iter->Valid());
|
|
2281
|
+
ASSERT_OK(iter->status());
|
|
2282
|
+
ASSERT_EQ(iter->key(), "cf12_a");
|
|
2283
|
+
|
|
2284
|
+
prepare_if_needed(iter.get());
|
|
2285
|
+
|
|
2286
|
+
ASSERT_EQ(iter->value(), "cf12_a_db_cf2");
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
{
|
|
2290
|
+
iter->Next();
|
|
2291
|
+
ASSERT_TRUE(iter->Valid());
|
|
2292
|
+
ASSERT_OK(iter->status());
|
|
2293
|
+
ASSERT_EQ(iter->key(), "cf12_b");
|
|
2294
|
+
|
|
2295
|
+
prepare_if_needed(iter.get());
|
|
2296
|
+
|
|
2297
|
+
ASSERT_EQ(iter->value(), "cf12_b_txn_cf2");
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
{
|
|
2301
|
+
iter->Next();
|
|
2302
|
+
ASSERT_TRUE(iter->Valid());
|
|
2303
|
+
ASSERT_OK(iter->status());
|
|
2304
|
+
ASSERT_EQ(iter->key(), "cf12_c");
|
|
2305
|
+
|
|
2306
|
+
prepare_if_needed(iter.get());
|
|
2307
|
+
|
|
2308
|
+
ASSERT_EQ(iter->value(), "cf12_c_txn_cf2");
|
|
2309
|
+
}
|
|
2310
|
+
|
|
2311
|
+
{
|
|
2312
|
+
iter->Next();
|
|
2313
|
+
ASSERT_TRUE(iter->Valid());
|
|
2314
|
+
ASSERT_OK(iter->status());
|
|
2315
|
+
ASSERT_EQ(iter->key(), "cf1_a");
|
|
2316
|
+
|
|
2317
|
+
prepare_if_needed(iter.get());
|
|
2318
|
+
|
|
2319
|
+
ASSERT_EQ(iter->value(), "cf1_a_db_cf1");
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
{
|
|
2323
|
+
iter->Next();
|
|
2324
|
+
ASSERT_TRUE(iter->Valid());
|
|
2325
|
+
ASSERT_OK(iter->status());
|
|
2326
|
+
ASSERT_EQ(iter->key(), "cf1_b");
|
|
2327
|
+
|
|
2328
|
+
prepare_if_needed(iter.get());
|
|
2329
|
+
|
|
2330
|
+
ASSERT_EQ(iter->value(), "cf1_b_txn_cf1");
|
|
2331
|
+
}
|
|
2332
|
+
|
|
2333
|
+
{
|
|
2334
|
+
iter->Next();
|
|
2335
|
+
ASSERT_TRUE(iter->Valid());
|
|
2336
|
+
ASSERT_OK(iter->status());
|
|
2337
|
+
ASSERT_EQ(iter->key(), "cf1_c");
|
|
2338
|
+
|
|
2339
|
+
prepare_if_needed(iter.get());
|
|
2340
|
+
|
|
2341
|
+
ASSERT_EQ(iter->value(), "cf1_c_txn_cf1");
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
{
|
|
2345
|
+
iter->Next();
|
|
2346
|
+
ASSERT_TRUE(iter->Valid());
|
|
2347
|
+
ASSERT_OK(iter->status());
|
|
2348
|
+
ASSERT_EQ(iter->key(), "cf2_a");
|
|
2349
|
+
|
|
2350
|
+
prepare_if_needed(iter.get());
|
|
2351
|
+
|
|
2352
|
+
ASSERT_EQ(iter->value(), "cf2_a_db_cf2");
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
{
|
|
2356
|
+
iter->Next();
|
|
2357
|
+
ASSERT_TRUE(iter->Valid());
|
|
2358
|
+
ASSERT_OK(iter->status());
|
|
2359
|
+
ASSERT_EQ(iter->key(), "cf2_b");
|
|
2360
|
+
|
|
2361
|
+
prepare_if_needed(iter.get());
|
|
2362
|
+
|
|
2363
|
+
ASSERT_EQ(iter->value(), "cf2_b_txn_cf2");
|
|
2364
|
+
}
|
|
2365
|
+
|
|
2366
|
+
{
|
|
2367
|
+
iter->Next();
|
|
2368
|
+
ASSERT_TRUE(iter->Valid());
|
|
2369
|
+
ASSERT_OK(iter->status());
|
|
2370
|
+
ASSERT_EQ(iter->key(), "cf2_c");
|
|
2371
|
+
|
|
2372
|
+
prepare_if_needed(iter.get());
|
|
2373
|
+
|
|
2374
|
+
ASSERT_EQ(iter->value(), "cf2_c_txn_cf2");
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
{
|
|
2378
|
+
iter->Next();
|
|
2379
|
+
ASSERT_FALSE(iter->Valid());
|
|
2380
|
+
ASSERT_OK(iter->status());
|
|
2381
|
+
}
|
|
2382
|
+
};
|
|
2383
|
+
|
|
2384
|
+
verify(/* allow_unprepared_value */ false, [](Iterator*) {});
|
|
2385
|
+
verify(/* allow_unprepared_value */ true, [](Iterator* iter) {
|
|
2386
|
+
ASSERT_TRUE(iter->value().empty());
|
|
2387
|
+
ASSERT_TRUE(iter->PrepareValue());
|
|
2388
|
+
});
|
|
2389
|
+
}
|
|
2390
|
+
|
|
2391
|
+
TEST_P(OptimisticTransactionTest, CoalescingIteratorSanityChecks) {
|
|
2392
|
+
ColumnFamilyOptions cf1_opts;
|
|
2393
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
2394
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
2395
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
2396
|
+
|
|
2397
|
+
ColumnFamilyOptions cf2_opts;
|
|
2398
|
+
cf2_opts.comparator = ReverseBytewiseComparator();
|
|
2399
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
2400
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
2401
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
2402
|
+
|
|
2403
|
+
std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
|
|
2404
|
+
|
|
2405
|
+
{
|
|
2406
|
+
std::unique_ptr<Iterator> iter(
|
|
2407
|
+
txn->GetCoalescingIterator(ReadOptions(), {}));
|
|
2408
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2409
|
+
}
|
|
2410
|
+
|
|
2411
|
+
{
|
|
2412
|
+
std::unique_ptr<Iterator> iter(
|
|
2413
|
+
txn->GetCoalescingIterator(ReadOptions(), {cfh1, cfh2}));
|
|
2414
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
{
|
|
2418
|
+
ReadOptions read_options;
|
|
2419
|
+
read_options.io_activity = Env::IOActivity::kCompaction;
|
|
2420
|
+
|
|
2421
|
+
std::unique_ptr<Iterator> iter(
|
|
2422
|
+
txn->GetCoalescingIterator(read_options, {cfh1}));
|
|
2423
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2424
|
+
}
|
|
2425
|
+
}
|
|
2426
|
+
|
|
2427
|
+
TEST_P(OptimisticTransactionTest, AttributeGroupIterator) {
|
|
2428
|
+
ColumnFamilyOptions cf_opts;
|
|
2429
|
+
cf_opts.enable_blob_files = true;
|
|
2430
|
+
|
|
2431
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
2432
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf1", &cfh1));
|
|
2433
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
2434
|
+
|
|
2435
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
2436
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf_opts, "cf2", &cfh2));
|
|
2437
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
2438
|
+
|
|
2439
|
+
// Note: "cf1" keys are present only in CF1; "cf2" keys are only present in
|
|
2440
|
+
// CF2; "cf12" keys are present in both CFs. "a" keys are present only in the
|
|
2441
|
+
// database; "b" keys are present only in the transaction; "c" keys are
|
|
2442
|
+
// present in both the database and the transaction. The values indicate the
|
|
2443
|
+
// column family as well as whether the entry came from the database or the
|
|
2444
|
+
// transaction.
|
|
2445
|
+
|
|
2446
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_a", "cf1_a_db_cf1"));
|
|
2447
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf1_c", "cf1_c_db_cf1"));
|
|
2448
|
+
|
|
2449
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_a", "cf2_a_db_cf2"));
|
|
2450
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf2_c", "cf2_c_db_cf2"));
|
|
2451
|
+
|
|
2452
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_a", "cf12_a_db_cf1"));
|
|
2453
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_a", "cf12_a_db_cf2"));
|
|
2454
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh1, "cf12_c", "cf12_c_db_cf1"));
|
|
2455
|
+
ASSERT_OK(txn_db->Put(WriteOptions(), cfh2, "cf12_c", "cf12_c_db_cf2"));
|
|
2456
|
+
|
|
2457
|
+
ASSERT_OK(txn_db->Flush(FlushOptions(), cfh1));
|
|
2458
|
+
ASSERT_OK(txn_db->Flush(FlushOptions(), cfh2));
|
|
2459
|
+
|
|
2460
|
+
std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
|
|
2461
|
+
|
|
2462
|
+
ASSERT_OK(txn->Put(cfh1, "cf1_b", "cf1_b_txn_cf1"));
|
|
2463
|
+
ASSERT_OK(txn->Put(cfh1, "cf1_c", "cf1_c_txn_cf1"));
|
|
2464
|
+
|
|
2465
|
+
ASSERT_OK(txn->Put(cfh2, "cf2_b", "cf2_b_txn_cf2"));
|
|
2466
|
+
ASSERT_OK(txn->Put(cfh2, "cf2_c", "cf2_c_txn_cf2"));
|
|
2467
|
+
|
|
2468
|
+
ASSERT_OK(txn->Put(cfh1, "cf12_b", "cf12_b_txn_cf1"));
|
|
2469
|
+
ASSERT_OK(txn->Put(cfh2, "cf12_b", "cf12_b_txn_cf2"));
|
|
2470
|
+
ASSERT_OK(txn->Put(cfh1, "cf12_c", "cf12_c_txn_cf1"));
|
|
2471
|
+
ASSERT_OK(txn->Put(cfh2, "cf12_c", "cf12_c_txn_cf2"));
|
|
2472
|
+
|
|
2473
|
+
auto verify = [&](bool allow_unprepared_value, auto prepare_if_needed) {
|
|
2474
|
+
ReadOptions read_options;
|
|
2475
|
+
read_options.allow_unprepared_value = allow_unprepared_value;
|
|
2476
|
+
|
|
2477
|
+
std::unique_ptr<AttributeGroupIterator> iter(
|
|
2478
|
+
txn->GetAttributeGroupIterator(read_options, {cfh1, cfh2}));
|
|
2479
|
+
|
|
2480
|
+
{
|
|
2481
|
+
iter->SeekToFirst();
|
|
2482
|
+
ASSERT_TRUE(iter->Valid());
|
|
2483
|
+
ASSERT_OK(iter->status());
|
|
2484
|
+
ASSERT_EQ(iter->key(), "cf12_a");
|
|
2485
|
+
|
|
2486
|
+
prepare_if_needed(iter.get());
|
|
2487
|
+
|
|
2488
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_a_db_cf1"}};
|
|
2489
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_a_db_cf2"}};
|
|
2490
|
+
IteratorAttributeGroups expected{
|
|
2491
|
+
IteratorAttributeGroup{cfh1, &cf1_columns},
|
|
2492
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2493
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2496
|
+
{
|
|
2497
|
+
iter->Next();
|
|
2498
|
+
ASSERT_TRUE(iter->Valid());
|
|
2499
|
+
ASSERT_OK(iter->status());
|
|
2500
|
+
ASSERT_EQ(iter->key(), "cf12_b");
|
|
2501
|
+
|
|
2502
|
+
prepare_if_needed(iter.get());
|
|
2503
|
+
|
|
2504
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_b_txn_cf1"}};
|
|
2505
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_b_txn_cf2"}};
|
|
2506
|
+
IteratorAttributeGroups expected{
|
|
2507
|
+
IteratorAttributeGroup{cfh1, &cf1_columns},
|
|
2508
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2509
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
{
|
|
2513
|
+
iter->Next();
|
|
2514
|
+
ASSERT_TRUE(iter->Valid());
|
|
2515
|
+
ASSERT_OK(iter->status());
|
|
2516
|
+
ASSERT_EQ(iter->key(), "cf12_c");
|
|
2517
|
+
|
|
2518
|
+
prepare_if_needed(iter.get());
|
|
2519
|
+
|
|
2520
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf12_c_txn_cf1"}};
|
|
2521
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf12_c_txn_cf2"}};
|
|
2522
|
+
IteratorAttributeGroups expected{
|
|
2523
|
+
IteratorAttributeGroup{cfh1, &cf1_columns},
|
|
2524
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2525
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2526
|
+
}
|
|
2527
|
+
|
|
2528
|
+
{
|
|
2529
|
+
iter->Next();
|
|
2530
|
+
ASSERT_TRUE(iter->Valid());
|
|
2531
|
+
ASSERT_OK(iter->status());
|
|
2532
|
+
ASSERT_EQ(iter->key(), "cf1_a");
|
|
2533
|
+
|
|
2534
|
+
prepare_if_needed(iter.get());
|
|
2535
|
+
|
|
2536
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_a_db_cf1"}};
|
|
2537
|
+
IteratorAttributeGroups expected{
|
|
2538
|
+
IteratorAttributeGroup{cfh1, &cf1_columns}};
|
|
2539
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2542
|
+
{
|
|
2543
|
+
iter->Next();
|
|
2544
|
+
ASSERT_TRUE(iter->Valid());
|
|
2545
|
+
ASSERT_OK(iter->status());
|
|
2546
|
+
ASSERT_EQ(iter->key(), "cf1_b");
|
|
2547
|
+
|
|
2548
|
+
prepare_if_needed(iter.get());
|
|
2549
|
+
|
|
2550
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_b_txn_cf1"}};
|
|
2551
|
+
IteratorAttributeGroups expected{
|
|
2552
|
+
IteratorAttributeGroup{cfh1, &cf1_columns}};
|
|
2553
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2554
|
+
}
|
|
2555
|
+
|
|
2556
|
+
{
|
|
2557
|
+
iter->Next();
|
|
2558
|
+
ASSERT_TRUE(iter->Valid());
|
|
2559
|
+
ASSERT_OK(iter->status());
|
|
2560
|
+
ASSERT_EQ(iter->key(), "cf1_c");
|
|
2561
|
+
|
|
2562
|
+
prepare_if_needed(iter.get());
|
|
2563
|
+
|
|
2564
|
+
WideColumns cf1_columns{{kDefaultWideColumnName, "cf1_c_txn_cf1"}};
|
|
2565
|
+
IteratorAttributeGroups expected{
|
|
2566
|
+
IteratorAttributeGroup{cfh1, &cf1_columns}};
|
|
2567
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2570
|
+
{
|
|
2571
|
+
iter->Next();
|
|
2572
|
+
ASSERT_TRUE(iter->Valid());
|
|
2573
|
+
ASSERT_OK(iter->status());
|
|
2574
|
+
ASSERT_EQ(iter->key(), "cf2_a");
|
|
2575
|
+
|
|
2576
|
+
prepare_if_needed(iter.get());
|
|
2577
|
+
|
|
2578
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_a_db_cf2"}};
|
|
2579
|
+
IteratorAttributeGroups expected{
|
|
2580
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2581
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2582
|
+
}
|
|
2583
|
+
|
|
2584
|
+
{
|
|
2585
|
+
iter->Next();
|
|
2586
|
+
ASSERT_TRUE(iter->Valid());
|
|
2587
|
+
ASSERT_OK(iter->status());
|
|
2588
|
+
ASSERT_EQ(iter->key(), "cf2_b");
|
|
2589
|
+
|
|
2590
|
+
prepare_if_needed(iter.get());
|
|
2591
|
+
|
|
2592
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_b_txn_cf2"}};
|
|
2593
|
+
IteratorAttributeGroups expected{
|
|
2594
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2595
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2596
|
+
}
|
|
2597
|
+
|
|
2598
|
+
{
|
|
2599
|
+
iter->Next();
|
|
2600
|
+
ASSERT_TRUE(iter->Valid());
|
|
2601
|
+
ASSERT_OK(iter->status());
|
|
2602
|
+
ASSERT_EQ(iter->key(), "cf2_c");
|
|
2603
|
+
|
|
2604
|
+
prepare_if_needed(iter.get());
|
|
2605
|
+
|
|
2606
|
+
WideColumns cf2_columns{{kDefaultWideColumnName, "cf2_c_txn_cf2"}};
|
|
2607
|
+
IteratorAttributeGroups expected{
|
|
2608
|
+
IteratorAttributeGroup{cfh2, &cf2_columns}};
|
|
2609
|
+
ASSERT_EQ(iter->attribute_groups(), expected);
|
|
2610
|
+
}
|
|
2611
|
+
|
|
2612
|
+
{
|
|
2613
|
+
iter->Next();
|
|
2614
|
+
ASSERT_FALSE(iter->Valid());
|
|
2615
|
+
ASSERT_OK(iter->status());
|
|
2616
|
+
}
|
|
2617
|
+
};
|
|
2618
|
+
|
|
2619
|
+
verify(/* allow_unprepared_value */ false, [](AttributeGroupIterator*) {});
|
|
2620
|
+
verify(/* allow_unprepared_value */ true, [](AttributeGroupIterator* iter) {
|
|
2621
|
+
ASSERT_TRUE(iter->attribute_groups().empty());
|
|
2622
|
+
ASSERT_TRUE(iter->PrepareValue());
|
|
2623
|
+
});
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2626
|
+
TEST_P(OptimisticTransactionTest, AttributeGroupIteratorSanityChecks) {
|
|
2627
|
+
ColumnFamilyOptions cf1_opts;
|
|
2628
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
2629
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
2630
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
2631
|
+
|
|
2632
|
+
ColumnFamilyOptions cf2_opts;
|
|
2633
|
+
cf2_opts.comparator = ReverseBytewiseComparator();
|
|
2634
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
2635
|
+
ASSERT_OK(txn_db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
2636
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
2637
|
+
|
|
2638
|
+
std::unique_ptr<Transaction> txn(txn_db->BeginTransaction(WriteOptions()));
|
|
2639
|
+
|
|
2640
|
+
{
|
|
2641
|
+
std::unique_ptr<AttributeGroupIterator> iter(
|
|
2642
|
+
txn->GetAttributeGroupIterator(ReadOptions(), {}));
|
|
2643
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2644
|
+
}
|
|
2645
|
+
|
|
2646
|
+
{
|
|
2647
|
+
std::unique_ptr<AttributeGroupIterator> iter(
|
|
2648
|
+
txn->GetAttributeGroupIterator(ReadOptions(), {cfh1, cfh2}));
|
|
2649
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2650
|
+
}
|
|
2651
|
+
|
|
2652
|
+
{
|
|
2653
|
+
ReadOptions read_options;
|
|
2654
|
+
read_options.io_activity = Env::IOActivity::kCompaction;
|
|
2655
|
+
|
|
2656
|
+
std::unique_ptr<AttributeGroupIterator> iter(
|
|
2657
|
+
txn->GetAttributeGroupIterator(read_options, {cfh1}));
|
|
2658
|
+
ASSERT_TRUE(iter->status().IsInvalidArgument());
|
|
2659
|
+
}
|
|
2660
|
+
}
|
|
2661
|
+
|
|
2225
2662
|
INSTANTIATE_TEST_CASE_P(
|
|
2226
2663
|
InstanceOccGroup, OptimisticTransactionTest,
|
|
2227
2664
|
testing::Values(OccValidationPolicy::kValidateSerial,
|
|
@@ -103,6 +103,9 @@ void PessimisticTransaction::Initialize(const TransactionOptions& txn_options) {
|
|
|
103
103
|
|
|
104
104
|
read_timestamp_ = kMaxTxnTimestamp;
|
|
105
105
|
commit_timestamp_ = kMaxTxnTimestamp;
|
|
106
|
+
|
|
107
|
+
commit_bypass_memtable_ = txn_options.commit_bypass_memtable;
|
|
108
|
+
write_batch_.SetTrackPerCFStat(txn_options.commit_bypass_memtable);
|
|
106
109
|
}
|
|
107
110
|
|
|
108
111
|
PessimisticTransaction::~PessimisticTransaction() {
|
|
@@ -843,6 +846,7 @@ Status WriteCommittedTxn::CommitInternal() {
|
|
|
843
846
|
if (!needs_ts) {
|
|
844
847
|
s = WriteBatchInternal::MarkCommit(working_batch, name_);
|
|
845
848
|
} else {
|
|
849
|
+
assert(!commit_bypass_memtable_);
|
|
846
850
|
assert(commit_timestamp_ != kMaxTxnTimestamp);
|
|
847
851
|
char commit_ts_buf[sizeof(kMaxTxnTimestamp)];
|
|
848
852
|
EncodeFixed64(commit_ts_buf, commit_timestamp_);
|
|
@@ -878,11 +882,14 @@ Status WriteCommittedTxn::CommitInternal() {
|
|
|
878
882
|
// any operations appended to this working_batch will be ignored from WAL
|
|
879
883
|
working_batch->MarkWalTerminationPoint();
|
|
880
884
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
885
|
+
const bool bypass_memtable = commit_bypass_memtable_ && wb->Count() > 0;
|
|
886
|
+
if (!bypass_memtable) {
|
|
887
|
+
// insert prepared batch into Memtable only skipping WAL.
|
|
888
|
+
// Memtable will ignore BeginPrepare/EndPrepare markers
|
|
889
|
+
// in non recovery mode and simply insert the values
|
|
890
|
+
s = WriteBatchInternal::Append(working_batch, wb);
|
|
891
|
+
assert(s.ok());
|
|
892
|
+
}
|
|
886
893
|
|
|
887
894
|
uint64_t seq_used = kMaxSequenceNumber;
|
|
888
895
|
SnapshotCreationCallback snapshot_creation_cb(db_impl_, commit_timestamp_,
|
|
@@ -896,12 +903,28 @@ Status WriteCommittedTxn::CommitInternal() {
|
|
|
896
903
|
post_mem_cb = &snapshot_creation_cb;
|
|
897
904
|
}
|
|
898
905
|
}
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
906
|
+
assert(log_number_ > 0);
|
|
907
|
+
if (bypass_memtable) {
|
|
908
|
+
s = db_impl_->WriteImpl(
|
|
909
|
+
write_options_, working_batch, /*callback*/ nullptr,
|
|
910
|
+
/*user_write_cb=*/nullptr,
|
|
911
|
+
/*log_used*/ nullptr, /*log_ref*/ log_number_,
|
|
912
|
+
/*disable_memtable*/ false, &seq_used,
|
|
913
|
+
/*batch_cnt=*/0, /*pre_release_callback=*/nullptr, post_mem_cb,
|
|
914
|
+
/*wbwi=*/std::make_shared<WriteBatchWithIndex>(std::move(write_batch_)),
|
|
915
|
+
/*min_prep_log=*/log_number_);
|
|
916
|
+
// Reset write_batch_ since it's accessed in transaction clean up and
|
|
917
|
+
// might be used for transaction reuse.
|
|
918
|
+
write_batch_ = WriteBatchWithIndex(cmp_, 0, true, 0,
|
|
919
|
+
write_options_.protection_bytes_per_key);
|
|
920
|
+
} else {
|
|
921
|
+
s = db_impl_->WriteImpl(write_options_, working_batch, /*callback*/ nullptr,
|
|
922
|
+
/*user_write_cb=*/nullptr,
|
|
923
|
+
/*log_used*/ nullptr, /*log_ref*/ log_number_,
|
|
924
|
+
/*disable_memtable*/ false, &seq_used,
|
|
925
|
+
/*batch_cnt=*/0, /*pre_release_callback=*/nullptr,
|
|
926
|
+
post_mem_cb);
|
|
927
|
+
}
|
|
905
928
|
assert(!s.ok() || seq_used != kMaxSequenceNumber);
|
|
906
929
|
if (s.ok()) {
|
|
907
930
|
SetId(seq_used);
|
|
@@ -122,13 +122,6 @@ class PessimisticTransaction : public TransactionBaseImpl {
|
|
|
122
122
|
ColumnFamilyHandle* column_family = nullptr) override;
|
|
123
123
|
|
|
124
124
|
protected:
|
|
125
|
-
// Refer to
|
|
126
|
-
// TransactionOptions::use_only_the_last_commit_time_batch_for_recovery
|
|
127
|
-
bool use_only_the_last_commit_time_batch_for_recovery_ = false;
|
|
128
|
-
// Refer to
|
|
129
|
-
// TransactionOptions::skip_prepare
|
|
130
|
-
bool skip_prepare_ = false;
|
|
131
|
-
|
|
132
125
|
virtual Status PrepareInternal() = 0;
|
|
133
126
|
|
|
134
127
|
virtual Status CommitWithoutPrepareInternal() = 0;
|
|
@@ -167,6 +160,16 @@ class PessimisticTransaction : public TransactionBaseImpl {
|
|
|
167
160
|
TxnTimestamp read_timestamp_{kMaxTxnTimestamp};
|
|
168
161
|
TxnTimestamp commit_timestamp_{kMaxTxnTimestamp};
|
|
169
162
|
|
|
163
|
+
// Refer to
|
|
164
|
+
// TransactionOptions::use_only_the_last_commit_time_batch_for_recovery
|
|
165
|
+
bool use_only_the_last_commit_time_batch_for_recovery_ = false;
|
|
166
|
+
// Refer to
|
|
167
|
+
// TransactionOptions::skip_prepare
|
|
168
|
+
bool skip_prepare_ = false;
|
|
169
|
+
// Refer to
|
|
170
|
+
// TransactionOptions::commit_bypass_memtable
|
|
171
|
+
bool commit_bypass_memtable_ = false;
|
|
172
|
+
|
|
170
173
|
private:
|
|
171
174
|
friend class TransactionTest_ValidateSnapshotTest_Test;
|
|
172
175
|
// Used to create unique ids for transactions.
|
|
@@ -304,6 +307,10 @@ class WriteCommittedTxn : public PessimisticTransaction {
|
|
|
304
307
|
Status SetCommitTimestamp(TxnTimestamp ts) override;
|
|
305
308
|
TxnTimestamp GetCommitTimestamp() const override { return commit_timestamp_; }
|
|
306
309
|
|
|
310
|
+
bool GetCommitBypassMemTable() const override {
|
|
311
|
+
return commit_bypass_memtable_;
|
|
312
|
+
}
|
|
313
|
+
|
|
307
314
|
private:
|
|
308
315
|
template <typename TValue>
|
|
309
316
|
Status GetForUpdateImpl(const ReadOptions& read_options,
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
#include "test_util/sync_point.h"
|
|
21
21
|
#include "util/cast_util.h"
|
|
22
22
|
#include "util/mutexlock.h"
|
|
23
|
+
#include "utilities/secondary_index/secondary_index_mixin.h"
|
|
23
24
|
#include "utilities/transactions/pessimistic_transaction.h"
|
|
24
25
|
#include "utilities/transactions/transaction_db_mutex_impl.h"
|
|
25
26
|
#include "utilities/transactions/write_prepared_txn_db.h"
|
|
@@ -183,7 +184,12 @@ Transaction* WriteCommittedTxnDB::BeginTransaction(
|
|
|
183
184
|
ReinitializeTransaction(old_txn, write_options, txn_options);
|
|
184
185
|
return old_txn;
|
|
185
186
|
} else {
|
|
186
|
-
|
|
187
|
+
if (!txn_db_options_.secondary_indices.empty()) {
|
|
188
|
+
return new SecondaryIndexMixin<WriteCommittedTxn>(
|
|
189
|
+
&txn_db_options_.secondary_indices, this, write_options, txn_options);
|
|
190
|
+
} else {
|
|
191
|
+
return new WriteCommittedTxn(this, write_options, txn_options);
|
|
192
|
+
}
|
|
187
193
|
}
|
|
188
194
|
}
|
|
189
195
|
|
|
@@ -34,4 +34,21 @@ DisableGCSnapshotChecker* DisableGCSnapshotChecker::Instance() {
|
|
|
34
34
|
STATIC_AVOID_DESTRUCTION(DisableGCSnapshotChecker, instance);
|
|
35
35
|
return &instance;
|
|
36
36
|
}
|
|
37
|
+
|
|
38
|
+
bool DataIsDefinitelyInSnapshot(SequenceNumber seqno, SequenceNumber snapshot,
|
|
39
|
+
const SnapshotChecker* snapshot_checker) {
|
|
40
|
+
return ((seqno) <= (snapshot) &&
|
|
41
|
+
(snapshot_checker == nullptr ||
|
|
42
|
+
LIKELY(snapshot_checker->CheckInSnapshot((seqno), (snapshot)) ==
|
|
43
|
+
SnapshotCheckerResult::kInSnapshot)));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
bool DataIsDefinitelyNotInSnapshot(SequenceNumber seqno,
|
|
47
|
+
SequenceNumber snapshot,
|
|
48
|
+
const SnapshotChecker* snapshot_checker) {
|
|
49
|
+
return ((seqno) > (snapshot) ||
|
|
50
|
+
(snapshot_checker != nullptr &&
|
|
51
|
+
UNLIKELY(snapshot_checker->CheckInSnapshot((seqno), (snapshot)) ==
|
|
52
|
+
SnapshotCheckerResult::kNotInSnapshot)));
|
|
53
|
+
}
|
|
37
54
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
#include <cinttypes>
|
|
9
9
|
|
|
10
|
+
#include "db/attribute_group_iterator_impl.h"
|
|
11
|
+
#include "db/coalescing_iterator.h"
|
|
10
12
|
#include "db/column_family.h"
|
|
11
13
|
#include "db/db_impl/db_impl.h"
|
|
12
14
|
#include "logging/logging.h"
|
|
@@ -486,6 +488,73 @@ Iterator* TransactionBaseImpl::GetIterator(const ReadOptions& read_options,
|
|
|
486
488
|
&read_options);
|
|
487
489
|
}
|
|
488
490
|
|
|
491
|
+
template <typename IterType, typename ImplType, typename ErrorIteratorFuncType>
|
|
492
|
+
std::unique_ptr<IterType> TransactionBaseImpl::NewMultiCfIterator(
|
|
493
|
+
const ReadOptions& read_options,
|
|
494
|
+
const std::vector<ColumnFamilyHandle*>& column_families,
|
|
495
|
+
ErrorIteratorFuncType error_iterator_func) {
|
|
496
|
+
if (column_families.empty()) {
|
|
497
|
+
return error_iterator_func(
|
|
498
|
+
Status::InvalidArgument("No Column Family was provided"));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
const Comparator* const first_comparator =
|
|
502
|
+
column_families[0]->GetComparator();
|
|
503
|
+
assert(first_comparator);
|
|
504
|
+
|
|
505
|
+
for (size_t i = 1; i < column_families.size(); ++i) {
|
|
506
|
+
const Comparator* cf_comparator = column_families[i]->GetComparator();
|
|
507
|
+
assert(cf_comparator);
|
|
508
|
+
|
|
509
|
+
if (first_comparator != cf_comparator &&
|
|
510
|
+
first_comparator->GetId() != cf_comparator->GetId()) {
|
|
511
|
+
return error_iterator_func(Status::InvalidArgument(
|
|
512
|
+
"Different comparators are being used across CFs"));
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
std::vector<Iterator*> child_iterators;
|
|
517
|
+
const Status s =
|
|
518
|
+
db_->NewIterators(read_options, column_families, &child_iterators);
|
|
519
|
+
if (!s.ok()) {
|
|
520
|
+
return error_iterator_func(s);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
assert(column_families.size() == child_iterators.size());
|
|
524
|
+
|
|
525
|
+
std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>
|
|
526
|
+
cfh_iter_pairs;
|
|
527
|
+
cfh_iter_pairs.reserve(column_families.size());
|
|
528
|
+
for (size_t i = 0; i < column_families.size(); ++i) {
|
|
529
|
+
cfh_iter_pairs.emplace_back(
|
|
530
|
+
column_families[i],
|
|
531
|
+
write_batch_.NewIteratorWithBase(column_families[i], child_iterators[i],
|
|
532
|
+
&read_options));
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
return std::make_unique<ImplType>(read_options,
|
|
536
|
+
column_families[0]->GetComparator(),
|
|
537
|
+
std::move(cfh_iter_pairs));
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
std::unique_ptr<Iterator> TransactionBaseImpl::GetCoalescingIterator(
|
|
541
|
+
const ReadOptions& read_options,
|
|
542
|
+
const std::vector<ColumnFamilyHandle*>& column_families) {
|
|
543
|
+
return NewMultiCfIterator<Iterator, CoalescingIterator>(
|
|
544
|
+
read_options, column_families, [](const Status& s) {
|
|
545
|
+
return std::unique_ptr<Iterator>(NewErrorIterator(s));
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
std::unique_ptr<AttributeGroupIterator>
|
|
550
|
+
TransactionBaseImpl::GetAttributeGroupIterator(
|
|
551
|
+
const ReadOptions& read_options,
|
|
552
|
+
const std::vector<ColumnFamilyHandle*>& column_families) {
|
|
553
|
+
return NewMultiCfIterator<AttributeGroupIterator, AttributeGroupIteratorImpl>(
|
|
554
|
+
read_options, column_families,
|
|
555
|
+
[](const Status& s) { return NewAttributeGroupErrorIterator(s); });
|
|
556
|
+
}
|
|
557
|
+
|
|
489
558
|
Status TransactionBaseImpl::PutEntityImpl(ColumnFamilyHandle* column_family,
|
|
490
559
|
const Slice& key,
|
|
491
560
|
const WideColumns& columns,
|