@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
|
@@ -301,7 +301,10 @@ Status DBImpl::NewDB(std::vector<std::string>* new_filenames) {
|
|
|
301
301
|
}
|
|
302
302
|
if (immutable_db_options_.write_dbid_to_manifest) {
|
|
303
303
|
std::string temp_db_id;
|
|
304
|
-
GetDbIdentityFromIdentityFile(&temp_db_id);
|
|
304
|
+
s = GetDbIdentityFromIdentityFile(&temp_db_id);
|
|
305
|
+
if (!s.ok()) {
|
|
306
|
+
return s;
|
|
307
|
+
}
|
|
305
308
|
new_db.SetDBId(temp_db_id);
|
|
306
309
|
}
|
|
307
310
|
new_db.SetLogNumber(0);
|
|
@@ -637,7 +640,7 @@ Status DBImpl::Recover(
|
|
|
637
640
|
f->fd.smallest_seqno, f->fd.largest_seqno,
|
|
638
641
|
f->marked_for_compaction,
|
|
639
642
|
f->temperature, // this can be different from
|
|
640
|
-
|
|
643
|
+
// `last_level_temperature`
|
|
641
644
|
f->oldest_blob_file_number, f->oldest_ancester_time,
|
|
642
645
|
f->file_creation_time, f->epoch_number,
|
|
643
646
|
f->file_checksum, f->file_checksum_func_name,
|
|
@@ -1670,6 +1673,8 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
|
|
|
1670
1673
|
SequenceNumber earliest_write_conflict_snapshot;
|
|
1671
1674
|
std::vector<SequenceNumber> snapshot_seqs =
|
|
1672
1675
|
snapshots_.GetAll(&earliest_write_conflict_snapshot);
|
|
1676
|
+
SequenceNumber earliest_snapshot =
|
|
1677
|
+
(snapshot_seqs.empty() ? kMaxSequenceNumber : snapshot_seqs.at(0));
|
|
1673
1678
|
auto snapshot_checker = snapshot_checker_.get();
|
|
1674
1679
|
if (use_custom_gc_ && snapshot_checker == nullptr) {
|
|
1675
1680
|
snapshot_checker = DisableGCSnapshotChecker::Instance();
|
|
@@ -1689,6 +1694,7 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
|
|
|
1689
1694
|
IOStatus io_s;
|
|
1690
1695
|
const ReadOptions read_option(Env::IOActivity::kDBOpen);
|
|
1691
1696
|
const WriteOptions write_option(Env::IO_HIGH, Env::IOActivity::kDBOpen);
|
|
1697
|
+
|
|
1692
1698
|
TableBuilderOptions tboptions(
|
|
1693
1699
|
*cfd->ioptions(), mutable_cf_options, read_option, write_option,
|
|
1694
1700
|
cfd->internal_comparator(), cfd->internal_tbl_prop_coll_factories(),
|
|
@@ -1697,21 +1703,22 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
|
|
|
1697
1703
|
0 /* level */, false /* is_bottommost */,
|
|
1698
1704
|
TableFileCreationReason::kRecovery, 0 /* oldest_key_time */,
|
|
1699
1705
|
0 /* file_creation_time */, db_id_, db_session_id_,
|
|
1700
|
-
0 /* target_file_size */, meta.fd.GetNumber());
|
|
1706
|
+
0 /* target_file_size */, meta.fd.GetNumber(), kMaxSequenceNumber);
|
|
1701
1707
|
Version* version = cfd->current();
|
|
1702
1708
|
version->Ref();
|
|
1703
1709
|
uint64_t num_input_entries = 0;
|
|
1704
|
-
s = BuildTable(
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1710
|
+
s = BuildTable(dbname_, versions_.get(), immutable_db_options_, tboptions,
|
|
1711
|
+
file_options_for_compaction_, cfd->table_cache(),
|
|
1712
|
+
iter.get(), std::move(range_del_iters), &meta,
|
|
1713
|
+
&blob_file_additions, snapshot_seqs, earliest_snapshot,
|
|
1714
|
+
earliest_write_conflict_snapshot, kMaxSequenceNumber,
|
|
1715
|
+
snapshot_checker, paranoid_file_checks,
|
|
1716
|
+
cfd->internal_stats(), &io_s, io_tracer_,
|
|
1717
|
+
BlobFileCreationReason::kRecovery,
|
|
1718
|
+
nullptr /* seqno_to_time_mapping */, &event_logger_,
|
|
1719
|
+
job_id, nullptr /* table_properties */, write_hint,
|
|
1720
|
+
nullptr /*full_history_ts_low*/, &blob_callback_, version,
|
|
1721
|
+
&num_input_entries);
|
|
1715
1722
|
version->Unref();
|
|
1716
1723
|
LogFlush(immutable_db_options_.info_log);
|
|
1717
1724
|
ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
|
|
@@ -155,21 +155,36 @@ Status DBImpl::Write(const WriteOptions& write_options, WriteBatch* my_batch) {
|
|
|
155
155
|
}
|
|
156
156
|
if (s.ok()) {
|
|
157
157
|
s = WriteImpl(write_options, my_batch, /*callback=*/nullptr,
|
|
158
|
+
/*user_write_cb=*/nullptr,
|
|
158
159
|
/*log_used=*/nullptr);
|
|
159
160
|
}
|
|
160
161
|
return s;
|
|
161
162
|
}
|
|
162
163
|
|
|
164
|
+
Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
|
|
165
|
+
WriteBatch* my_batch, WriteCallback* callback,
|
|
166
|
+
UserWriteCallback* user_write_cb) {
|
|
167
|
+
Status s;
|
|
168
|
+
if (write_options.protection_bytes_per_key > 0) {
|
|
169
|
+
s = WriteBatchInternal::UpdateProtectionInfo(
|
|
170
|
+
my_batch, write_options.protection_bytes_per_key);
|
|
171
|
+
}
|
|
172
|
+
if (s.ok()) {
|
|
173
|
+
s = WriteImpl(write_options, my_batch, callback, user_write_cb);
|
|
174
|
+
}
|
|
175
|
+
return s;
|
|
176
|
+
}
|
|
177
|
+
|
|
163
178
|
Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
|
|
164
179
|
WriteBatch* my_batch,
|
|
165
|
-
|
|
180
|
+
UserWriteCallback* user_write_cb) {
|
|
166
181
|
Status s;
|
|
167
182
|
if (write_options.protection_bytes_per_key > 0) {
|
|
168
183
|
s = WriteBatchInternal::UpdateProtectionInfo(
|
|
169
184
|
my_batch, write_options.protection_bytes_per_key);
|
|
170
185
|
}
|
|
171
186
|
if (s.ok()) {
|
|
172
|
-
s = WriteImpl(write_options, my_batch, callback,
|
|
187
|
+
s = WriteImpl(write_options, my_batch, /*callback=*/nullptr, user_write_cb);
|
|
173
188
|
}
|
|
174
189
|
return s;
|
|
175
190
|
}
|
|
@@ -179,9 +194,9 @@ Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
|
|
|
179
194
|
// published sequence.
|
|
180
195
|
Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
181
196
|
WriteBatch* my_batch, WriteCallback* callback,
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
size_t batch_cnt,
|
|
197
|
+
UserWriteCallback* user_write_cb, uint64_t* log_used,
|
|
198
|
+
uint64_t log_ref, bool disable_memtable,
|
|
199
|
+
uint64_t* seq_used, size_t batch_cnt,
|
|
185
200
|
PreReleaseCallback* pre_release_callback,
|
|
186
201
|
PostMemTableCallback* post_memtable_callback) {
|
|
187
202
|
assert(!seq_per_batch_ || batch_cnt != 0);
|
|
@@ -268,6 +283,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
268
283
|
return Status::NotSupported(
|
|
269
284
|
"seq_per_batch currently does not honor post_memtable_callback");
|
|
270
285
|
}
|
|
286
|
+
if (my_batch->HasDeleteRange() && immutable_db_options_.row_cache) {
|
|
287
|
+
return Status::NotSupported(
|
|
288
|
+
"DeleteRange is not compatible with row cache.");
|
|
289
|
+
}
|
|
271
290
|
// Otherwise IsLatestPersistentState optimization does not make sense
|
|
272
291
|
assert(!WriteBatchInternal::IsLatestPersistentState(my_batch) ||
|
|
273
292
|
disable_memtable);
|
|
@@ -284,10 +303,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
284
303
|
seq_per_batch_ ? kDoAssignOrder : kDontAssignOrder;
|
|
285
304
|
// Otherwise it is WAL-only Prepare batches in WriteCommitted policy and
|
|
286
305
|
// they don't consume sequence.
|
|
287
|
-
return WriteImplWALOnly(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
306
|
+
return WriteImplWALOnly(
|
|
307
|
+
&nonmem_write_thread_, write_options, my_batch, callback, user_write_cb,
|
|
308
|
+
log_used, log_ref, seq_used, batch_cnt, pre_release_callback,
|
|
309
|
+
assign_order, kDontPublishLastSeq, disable_memtable);
|
|
291
310
|
}
|
|
292
311
|
|
|
293
312
|
if (immutable_db_options_.unordered_write) {
|
|
@@ -299,9 +318,9 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
299
318
|
// Use a write thread to i) optimize for WAL write, ii) publish last
|
|
300
319
|
// sequence in in increasing order, iii) call pre_release_callback serially
|
|
301
320
|
Status status = WriteImplWALOnly(
|
|
302
|
-
&write_thread_, write_options, my_batch, callback,
|
|
303
|
-
&seq, sub_batch_cnt, pre_release_callback,
|
|
304
|
-
kDoPublishLastSeq, disable_memtable);
|
|
321
|
+
&write_thread_, write_options, my_batch, callback, user_write_cb,
|
|
322
|
+
log_used, log_ref, &seq, sub_batch_cnt, pre_release_callback,
|
|
323
|
+
kDoAssignOrder, kDoPublishLastSeq, disable_memtable);
|
|
305
324
|
TEST_SYNC_POINT("DBImpl::WriteImpl:UnorderedWriteAfterWriteWAL");
|
|
306
325
|
if (!status.ok()) {
|
|
307
326
|
return status;
|
|
@@ -318,17 +337,20 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
318
337
|
}
|
|
319
338
|
|
|
320
339
|
if (immutable_db_options_.enable_pipelined_write) {
|
|
321
|
-
return PipelinedWriteImpl(write_options, my_batch, callback,
|
|
322
|
-
log_ref, disable_memtable, seq_used);
|
|
340
|
+
return PipelinedWriteImpl(write_options, my_batch, callback, user_write_cb,
|
|
341
|
+
log_used, log_ref, disable_memtable, seq_used);
|
|
323
342
|
}
|
|
324
343
|
|
|
325
344
|
PERF_TIMER_GUARD(write_pre_and_post_process_time);
|
|
326
|
-
WriteThread::Writer w(write_options, my_batch, callback,
|
|
327
|
-
disable_memtable, batch_cnt,
|
|
328
|
-
post_memtable_callback);
|
|
345
|
+
WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
|
|
346
|
+
log_ref, disable_memtable, batch_cnt,
|
|
347
|
+
pre_release_callback, post_memtable_callback);
|
|
329
348
|
StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
|
|
330
349
|
|
|
331
350
|
write_thread_.JoinBatchGroup(&w);
|
|
351
|
+
if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_CALLER) {
|
|
352
|
+
write_thread_.SetMemWritersEachStride(&w);
|
|
353
|
+
}
|
|
332
354
|
if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_WRITER) {
|
|
333
355
|
// we are a non-leader in a parallel group
|
|
334
356
|
|
|
@@ -534,6 +556,35 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
534
556
|
const SequenceNumber current_sequence = last_sequence + 1;
|
|
535
557
|
last_sequence += seq_inc;
|
|
536
558
|
|
|
559
|
+
if (log_context.need_log_sync) {
|
|
560
|
+
VersionEdit synced_wals;
|
|
561
|
+
log_write_mutex_.Lock();
|
|
562
|
+
if (status.ok()) {
|
|
563
|
+
MarkLogsSynced(logfile_number_, log_context.need_log_dir_sync,
|
|
564
|
+
&synced_wals);
|
|
565
|
+
} else {
|
|
566
|
+
MarkLogsNotSynced(logfile_number_);
|
|
567
|
+
}
|
|
568
|
+
log_write_mutex_.Unlock();
|
|
569
|
+
if (status.ok() && synced_wals.IsWalAddition()) {
|
|
570
|
+
InstrumentedMutexLock l(&mutex_);
|
|
571
|
+
// TODO: plumb Env::IOActivity, Env::IOPriority
|
|
572
|
+
const ReadOptions read_options;
|
|
573
|
+
status = ApplyWALToManifest(read_options, write_options, &synced_wals);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Requesting sync with two_write_queues_ is expected to be very rare. We
|
|
577
|
+
// hence provide a simple implementation that is not necessarily
|
|
578
|
+
// efficient.
|
|
579
|
+
if (status.ok() && two_write_queues_) {
|
|
580
|
+
if (manual_wal_flush_) {
|
|
581
|
+
status = FlushWAL(true);
|
|
582
|
+
} else {
|
|
583
|
+
status = SyncWAL();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
537
588
|
// PreReleaseCallback is called after WAL write and before memtable write
|
|
538
589
|
if (status.ok()) {
|
|
539
590
|
SequenceNumber next_sequence = current_sequence;
|
|
@@ -617,34 +668,6 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
617
668
|
assert(pre_release_cb_status.ok());
|
|
618
669
|
}
|
|
619
670
|
|
|
620
|
-
if (log_context.need_log_sync) {
|
|
621
|
-
VersionEdit synced_wals;
|
|
622
|
-
log_write_mutex_.Lock();
|
|
623
|
-
if (status.ok()) {
|
|
624
|
-
MarkLogsSynced(logfile_number_, log_context.need_log_dir_sync,
|
|
625
|
-
&synced_wals);
|
|
626
|
-
} else {
|
|
627
|
-
MarkLogsNotSynced(logfile_number_);
|
|
628
|
-
}
|
|
629
|
-
log_write_mutex_.Unlock();
|
|
630
|
-
if (status.ok() && synced_wals.IsWalAddition()) {
|
|
631
|
-
InstrumentedMutexLock l(&mutex_);
|
|
632
|
-
// TODO: plumb Env::IOActivity, Env::IOPriority
|
|
633
|
-
const ReadOptions read_options;
|
|
634
|
-
status = ApplyWALToManifest(read_options, write_options, &synced_wals);
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
// Requesting sync with two_write_queues_ is expected to be very rare. We
|
|
638
|
-
// hence provide a simple implementation that is not necessarily efficient.
|
|
639
|
-
if (two_write_queues_) {
|
|
640
|
-
if (manual_wal_flush_) {
|
|
641
|
-
status = FlushWAL(true);
|
|
642
|
-
} else {
|
|
643
|
-
status = SyncWAL();
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
671
|
bool should_exit_batch_group = true;
|
|
649
672
|
if (in_parallel_group) {
|
|
650
673
|
// CompleteParallelWorker returns true if this thread should
|
|
@@ -679,6 +702,7 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
|
|
|
679
702
|
|
|
680
703
|
Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
|
|
681
704
|
WriteBatch* my_batch, WriteCallback* callback,
|
|
705
|
+
UserWriteCallback* user_write_cb,
|
|
682
706
|
uint64_t* log_used, uint64_t log_ref,
|
|
683
707
|
bool disable_memtable, uint64_t* seq_used) {
|
|
684
708
|
PERF_TIMER_GUARD(write_pre_and_post_process_time);
|
|
@@ -686,8 +710,8 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
|
|
|
686
710
|
|
|
687
711
|
WriteContext write_context;
|
|
688
712
|
|
|
689
|
-
WriteThread::Writer w(write_options, my_batch, callback,
|
|
690
|
-
disable_memtable, /*_batch_cnt=*/0,
|
|
713
|
+
WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
|
|
714
|
+
log_ref, disable_memtable, /*_batch_cnt=*/0,
|
|
691
715
|
/*_pre_release_callback=*/nullptr);
|
|
692
716
|
write_thread_.JoinBatchGroup(&w);
|
|
693
717
|
TEST_SYNC_POINT("DBImplWrite::PipelinedWriteImpl:AfterJoinBatchGroup");
|
|
@@ -826,7 +850,9 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
|
|
|
826
850
|
// so we need to set its status to pass ASSERT_STATUS_CHECKED
|
|
827
851
|
memtable_write_group.status.PermitUncheckedError();
|
|
828
852
|
}
|
|
829
|
-
|
|
853
|
+
if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_CALLER) {
|
|
854
|
+
write_thread_.SetMemWritersEachStride(&w);
|
|
855
|
+
}
|
|
830
856
|
if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_WRITER) {
|
|
831
857
|
PERF_TIMER_STOP(write_pre_and_post_process_time);
|
|
832
858
|
PERF_TIMER_FOR_WAIT_GUARD(write_memtable_time);
|
|
@@ -866,7 +892,8 @@ Status DBImpl::UnorderedWriteMemtable(const WriteOptions& write_options,
|
|
|
866
892
|
PERF_TIMER_GUARD(write_pre_and_post_process_time);
|
|
867
893
|
StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
|
|
868
894
|
|
|
869
|
-
WriteThread::Writer w(write_options, my_batch, callback,
|
|
895
|
+
WriteThread::Writer w(write_options, my_batch, callback,
|
|
896
|
+
/*user_write_cb=*/nullptr, log_ref,
|
|
870
897
|
false /*disable_memtable*/);
|
|
871
898
|
|
|
872
899
|
if (w.CheckCallback(this) && w.ShouldWriteToMemtable()) {
|
|
@@ -916,13 +943,15 @@ Status DBImpl::UnorderedWriteMemtable(const WriteOptions& write_options,
|
|
|
916
943
|
// applicable in a two-queue setting.
|
|
917
944
|
Status DBImpl::WriteImplWALOnly(
|
|
918
945
|
WriteThread* write_thread, const WriteOptions& write_options,
|
|
919
|
-
WriteBatch* my_batch, WriteCallback* callback,
|
|
946
|
+
WriteBatch* my_batch, WriteCallback* callback,
|
|
947
|
+
UserWriteCallback* user_write_cb, uint64_t* log_used,
|
|
920
948
|
const uint64_t log_ref, uint64_t* seq_used, const size_t sub_batch_cnt,
|
|
921
949
|
PreReleaseCallback* pre_release_callback, const AssignOrder assign_order,
|
|
922
950
|
const PublishLastSeq publish_last_seq, const bool disable_memtable) {
|
|
923
951
|
PERF_TIMER_GUARD(write_pre_and_post_process_time);
|
|
924
|
-
WriteThread::Writer w(write_options, my_batch, callback,
|
|
925
|
-
disable_memtable, sub_batch_cnt,
|
|
952
|
+
WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
|
|
953
|
+
log_ref, disable_memtable, sub_batch_cnt,
|
|
954
|
+
pre_release_callback);
|
|
926
955
|
StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
|
|
927
956
|
|
|
928
957
|
write_thread->JoinBatchGroup(&w);
|
|
@@ -1176,8 +1205,7 @@ void DBImpl::MemTableInsertStatusCheck(const Status& status) {
|
|
|
1176
1205
|
mutex_.Lock();
|
|
1177
1206
|
assert(!error_handler_.IsBGWorkStopped());
|
|
1178
1207
|
// Maybe change the return status to void?
|
|
1179
|
-
error_handler_.SetBGError(status, BackgroundErrorReason::kMemTable)
|
|
1180
|
-
.PermitUncheckedError();
|
|
1208
|
+
error_handler_.SetBGError(status, BackgroundErrorReason::kMemTable);
|
|
1181
1209
|
mutex_.Unlock();
|
|
1182
1210
|
}
|
|
1183
1211
|
}
|
|
@@ -1489,6 +1517,11 @@ IOStatus DBImpl::WriteToWAL(const WriteThread::WriteGroup& write_group,
|
|
|
1489
1517
|
RecordTick(stats_, WAL_FILE_BYTES, log_size);
|
|
1490
1518
|
stats->AddDBStats(InternalStats::kIntStatsWriteWithWal, write_with_wal);
|
|
1491
1519
|
RecordTick(stats_, WRITE_WITH_WAL, write_with_wal);
|
|
1520
|
+
for (auto* writer : write_group) {
|
|
1521
|
+
if (!writer->CallbackFailed()) {
|
|
1522
|
+
writer->CheckPostWalWriteCallback();
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1492
1525
|
}
|
|
1493
1526
|
return io_s;
|
|
1494
1527
|
}
|
|
@@ -1553,6 +1586,11 @@ IOStatus DBImpl::ConcurrentWriteToWAL(
|
|
|
1553
1586
|
stats->AddDBStats(InternalStats::kIntStatsWriteWithWal, write_with_wal,
|
|
1554
1587
|
concurrent);
|
|
1555
1588
|
RecordTick(stats_, WRITE_WITH_WAL, write_with_wal);
|
|
1589
|
+
for (auto* writer : write_group) {
|
|
1590
|
+
if (!writer->CallbackFailed()) {
|
|
1591
|
+
writer->CheckPostWalWriteCallback();
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1556
1594
|
}
|
|
1557
1595
|
return io_s;
|
|
1558
1596
|
}
|
|
@@ -2201,6 +2239,11 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
|
|
|
2201
2239
|
memtable_info.earliest_seqno = cfd->mem()->GetEarliestSequenceNumber();
|
|
2202
2240
|
memtable_info.num_entries = cfd->mem()->num_entries();
|
|
2203
2241
|
memtable_info.num_deletes = cfd->mem()->num_deletes();
|
|
2242
|
+
if (!cfd->ioptions()->persist_user_defined_timestamps &&
|
|
2243
|
+
cfd->user_comparator()->timestamp_size() > 0) {
|
|
2244
|
+
const Slice& newest_udt = cfd->mem()->GetNewestUDT();
|
|
2245
|
+
memtable_info.newest_udt.assign(newest_udt.data(), newest_udt.size());
|
|
2246
|
+
}
|
|
2204
2247
|
// Log this later after lock release. It may be outdated, e.g., if background
|
|
2205
2248
|
// flush happens before logging, but that should be ok.
|
|
2206
2249
|
int num_imm_unflushed = cfd->imm()->NumNotFlushed();
|
|
@@ -2220,14 +2263,15 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
|
|
|
2220
2263
|
SequenceNumber seq = versions_->LastSequence();
|
|
2221
2264
|
new_mem = cfd->ConstructNewMemtable(mutable_cf_options, seq);
|
|
2222
2265
|
context->superversion_context.NewSuperVersion();
|
|
2266
|
+
|
|
2267
|
+
ROCKS_LOG_INFO(immutable_db_options_.info_log,
|
|
2268
|
+
"[%s] New memtable created with log file: #%" PRIu64
|
|
2269
|
+
". Immutable memtables: %d.\n",
|
|
2270
|
+
cfd->GetName().c_str(), new_log_number, num_imm_unflushed);
|
|
2271
|
+
// There should be no concurrent write as the thread is at the front of
|
|
2272
|
+
// writer queue
|
|
2273
|
+
cfd->mem()->ConstructFragmentedRangeTombstones();
|
|
2223
2274
|
}
|
|
2224
|
-
ROCKS_LOG_INFO(immutable_db_options_.info_log,
|
|
2225
|
-
"[%s] New memtable created with log file: #%" PRIu64
|
|
2226
|
-
". Immutable memtables: %d.\n",
|
|
2227
|
-
cfd->GetName().c_str(), new_log_number, num_imm_unflushed);
|
|
2228
|
-
// There should be no concurrent write as the thread is at the front of
|
|
2229
|
-
// writer queue
|
|
2230
|
-
cfd->mem()->ConstructFragmentedRangeTombstones();
|
|
2231
2275
|
|
|
2232
2276
|
mutex_.Lock();
|
|
2233
2277
|
if (recycle_log_number != 0) {
|
|
@@ -2319,8 +2363,8 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
|
|
|
2319
2363
|
read_options, write_options, &wal_deletion, &mutex_,
|
|
2320
2364
|
directories_.GetDbDir());
|
|
2321
2365
|
if (!s.ok() && versions_->io_status().IsIOError()) {
|
|
2322
|
-
|
|
2323
|
-
|
|
2366
|
+
error_handler_.SetBGError(versions_->io_status(),
|
|
2367
|
+
BackgroundErrorReason::kManifestWrite);
|
|
2324
2368
|
}
|
|
2325
2369
|
if (!s.ok()) {
|
|
2326
2370
|
return s;
|
|
@@ -192,6 +192,49 @@ TEST_F(DBPropertiesTest, GetAggregatedIntPropertyTest) {
|
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
+
TEST_F(DBPropertiesTest, AggregateBlockCacheProperty) {
|
|
196
|
+
constexpr size_t kCapacity = 1000;
|
|
197
|
+
LRUCacheOptions co;
|
|
198
|
+
co.capacity = kCapacity;
|
|
199
|
+
co.num_shard_bits = 0;
|
|
200
|
+
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
201
|
+
auto block_cache = NewLRUCache(co);
|
|
202
|
+
|
|
203
|
+
// All columns families share the same block cache.
|
|
204
|
+
Options options = CurrentOptions();
|
|
205
|
+
BlockBasedTableOptions table_opt;
|
|
206
|
+
table_opt.no_block_cache = false;
|
|
207
|
+
table_opt.block_cache = block_cache;
|
|
208
|
+
options.table_factory.reset(NewBlockBasedTableFactory(table_opt));
|
|
209
|
+
|
|
210
|
+
CreateAndReopenWithCF({"one", "two", "three", "four"}, options);
|
|
211
|
+
|
|
212
|
+
// Insert unpinned block to the cache
|
|
213
|
+
constexpr size_t kSize1 = 100;
|
|
214
|
+
ASSERT_OK(block_cache->Insert("block1", nullptr /*value*/,
|
|
215
|
+
&kNoopCacheItemHelper, kSize1));
|
|
216
|
+
// Insert pinned block to the cache
|
|
217
|
+
constexpr size_t kSize2 = 200;
|
|
218
|
+
Cache::Handle* block2 = nullptr;
|
|
219
|
+
ASSERT_OK(block_cache->Insert("block2", nullptr /*value*/,
|
|
220
|
+
&kNoopCacheItemHelper, kSize2, &block2));
|
|
221
|
+
|
|
222
|
+
uint64_t value;
|
|
223
|
+
ASSERT_TRUE(db_->GetAggregatedIntProperty(DB::Properties::kBlockCacheCapacity,
|
|
224
|
+
&value));
|
|
225
|
+
ASSERT_EQ(value, kCapacity);
|
|
226
|
+
|
|
227
|
+
ASSERT_TRUE(
|
|
228
|
+
db_->GetAggregatedIntProperty(DB::Properties::kBlockCacheUsage, &value));
|
|
229
|
+
ASSERT_EQ(value, kSize1 + kSize2);
|
|
230
|
+
|
|
231
|
+
ASSERT_TRUE(db_->GetAggregatedIntProperty(
|
|
232
|
+
DB::Properties::kBlockCachePinnedUsage, &value));
|
|
233
|
+
ASSERT_EQ(value, kSize2);
|
|
234
|
+
|
|
235
|
+
block_cache->Release(block2);
|
|
236
|
+
}
|
|
237
|
+
|
|
195
238
|
namespace {
|
|
196
239
|
void VerifySimilar(uint64_t a, uint64_t b, double bias) {
|
|
197
240
|
ASSERT_EQ(a == 0U, b == 0U);
|
|
@@ -1083,7 +1126,6 @@ TEST_F(DBPropertiesTest, EstimateCompressionRatio) {
|
|
|
1083
1126
|
ASSERT_GT(CompressionRatioAtLevel(1), 10.0);
|
|
1084
1127
|
}
|
|
1085
1128
|
|
|
1086
|
-
|
|
1087
1129
|
class CountingUserTblPropCollector : public TablePropertiesCollector {
|
|
1088
1130
|
public:
|
|
1089
1131
|
const char* Name() const override { return "CountingUserTblPropCollector"; }
|
|
@@ -2366,7 +2408,6 @@ TEST_F(DBPropertiesTest, TableMetaIndexKeys) {
|
|
|
2366
2408
|
} while (ChangeOptions());
|
|
2367
2409
|
}
|
|
2368
2410
|
|
|
2369
|
-
|
|
2370
2411
|
} // namespace ROCKSDB_NAMESPACE
|
|
2371
2412
|
|
|
2372
2413
|
int main(int argc, char** argv) {
|
|
@@ -3820,6 +3820,10 @@ TEST_F(DBRangeDelTest, RowCache) {
|
|
|
3820
3820
|
ASSERT_OK(wb.DeleteRange(Key(1), Key(5)));
|
|
3821
3821
|
ASSERT_TRUE(db_->Write(WriteOptions(), &wb).IsNotSupported());
|
|
3822
3822
|
ASSERT_EQ(Get(Key(3)), "val");
|
|
3823
|
+
// By default, memtable insertion failure will turn the DB to read-only mode.
|
|
3824
|
+
// The check for delete range should happen before that to fail early
|
|
3825
|
+
// and should not turn db into read-only mdoe.
|
|
3826
|
+
ASSERT_OK(Put(Key(5), "foo"));
|
|
3823
3827
|
}
|
|
3824
3828
|
} // namespace ROCKSDB_NAMESPACE
|
|
3825
3829
|
|
|
@@ -245,7 +245,13 @@ TEST_P(DBRateLimiterOnReadTest, VerifyChecksum) {
|
|
|
245
245
|
// In DirectIO, where we support tail prefetching, during table open, we only
|
|
246
246
|
// do 1 read instead of 4 as described above. Actual checksum verification
|
|
247
247
|
// reads stay the same.
|
|
248
|
+
#ifdef OS_WIN
|
|
249
|
+
// No file system prefetch implemented for OS Win. During table open,
|
|
250
|
+
// we only do 1 read for BufferedIO.
|
|
251
|
+
int num_read_per_file = 4;
|
|
252
|
+
#else
|
|
248
253
|
int num_read_per_file = (!use_direct_io_) ? 7 : 4;
|
|
254
|
+
#endif
|
|
249
255
|
int expected = kNumFiles * num_read_per_file;
|
|
250
256
|
|
|
251
257
|
ASSERT_EQ(expected, options_.rate_limiter->GetTotalRequests(Env::IO_USER));
|
|
@@ -5645,6 +5645,8 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
|
|
|
5645
5645
|
ASSERT_EQ(
|
|
5646
5646
|
dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
|
|
5647
5647
|
false);
|
|
5648
|
+
ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
|
|
5649
|
+
-1);
|
|
5648
5650
|
|
|
5649
5651
|
ASSERT_OK(dbfull()->SetOptions(
|
|
5650
5652
|
{{"compaction_options_universal", "{size_ratio=7;}"}}));
|
|
@@ -5666,9 +5668,11 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
|
|
|
5666
5668
|
ASSERT_EQ(
|
|
5667
5669
|
dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
|
|
5668
5670
|
false);
|
|
5671
|
+
ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
|
|
5672
|
+
-1);
|
|
5669
5673
|
|
|
5670
|
-
ASSERT_OK(dbfull()->SetOptions(
|
|
5671
|
-
|
|
5674
|
+
ASSERT_OK(dbfull()->SetOptions({{"compaction_options_universal",
|
|
5675
|
+
"{min_merge_width=11;max_read_amp=0;}"}}));
|
|
5672
5676
|
ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.size_ratio, 7u);
|
|
5673
5677
|
ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.min_merge_width,
|
|
5674
5678
|
11u);
|
|
@@ -5687,6 +5691,8 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
|
|
|
5687
5691
|
ASSERT_EQ(
|
|
5688
5692
|
dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
|
|
5689
5693
|
false);
|
|
5694
|
+
ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
|
|
5695
|
+
0);
|
|
5690
5696
|
}
|
|
5691
5697
|
|
|
5692
5698
|
TEST_F(DBTest, FileCreationRandomFailure) {
|
|
@@ -6347,6 +6353,8 @@ TEST_F(DBTest, PromoteL0) {
|
|
|
6347
6353
|
Options options = CurrentOptions();
|
|
6348
6354
|
options.disable_auto_compactions = true;
|
|
6349
6355
|
options.write_buffer_size = 10 * 1024 * 1024;
|
|
6356
|
+
// Exercise what was a use-after-free (ASAN failure) under ~VersionSet()
|
|
6357
|
+
options.uncache_aggressiveness = 300;
|
|
6350
6358
|
DestroyAndReopen(options);
|
|
6351
6359
|
|
|
6352
6360
|
// non overlapping ranges
|
|
@@ -4154,7 +4154,7 @@ TEST_F(DBTest2, LiveFilesOmitObsoleteFiles) {
|
|
|
4154
4154
|
TEST_SYNC_POINT("DBTest2::LiveFilesOmitObsoleteFiles:FlushTriggered");
|
|
4155
4155
|
|
|
4156
4156
|
ASSERT_OK(db_->DisableFileDeletions());
|
|
4157
|
-
|
|
4157
|
+
VectorWalPtr log_files;
|
|
4158
4158
|
ASSERT_OK(db_->GetSortedWalFiles(log_files));
|
|
4159
4159
|
TEST_SYNC_POINT("DBTest2::LiveFilesOmitObsoleteFiles:LiveFilesCaptured");
|
|
4160
4160
|
for (const auto& log_file : log_files) {
|
|
@@ -565,6 +565,11 @@ Options DBTestBase::GetOptions(
|
|
|
565
565
|
options.unordered_write = false;
|
|
566
566
|
break;
|
|
567
567
|
}
|
|
568
|
+
case kBlockBasedTableWithBinarySearchWithFirstKeyIndex: {
|
|
569
|
+
table_options.index_type =
|
|
570
|
+
BlockBasedTableOptions::kBinarySearchWithFirstKey;
|
|
571
|
+
break;
|
|
572
|
+
}
|
|
568
573
|
|
|
569
574
|
default:
|
|
570
575
|
break;
|
|
@@ -276,16 +276,16 @@ class SpecialEnv : public EnvWrapper {
|
|
|
276
276
|
SpecialEnv* env_;
|
|
277
277
|
std::unique_ptr<WritableFile> base_;
|
|
278
278
|
};
|
|
279
|
-
class
|
|
279
|
+
class SpecialWalFile : public WritableFile {
|
|
280
280
|
public:
|
|
281
|
-
|
|
281
|
+
SpecialWalFile(SpecialEnv* env, std::unique_ptr<WritableFile>&& b)
|
|
282
282
|
: env_(env), base_(std::move(b)) {
|
|
283
283
|
env_->num_open_wal_file_.fetch_add(1);
|
|
284
284
|
}
|
|
285
|
-
virtual ~
|
|
285
|
+
virtual ~SpecialWalFile() { env_->num_open_wal_file_.fetch_add(-1); }
|
|
286
286
|
Status Append(const Slice& data) override {
|
|
287
287
|
#if !(defined NDEBUG) || !defined(OS_WIN)
|
|
288
|
-
TEST_SYNC_POINT("SpecialEnv::
|
|
288
|
+
TEST_SYNC_POINT("SpecialEnv::SpecialWalFile::Append:1");
|
|
289
289
|
#endif
|
|
290
290
|
Status s;
|
|
291
291
|
if (env_->log_write_error_.load(std::memory_order_acquire)) {
|
|
@@ -299,7 +299,7 @@ class SpecialEnv : public EnvWrapper {
|
|
|
299
299
|
s = base_->Append(data);
|
|
300
300
|
}
|
|
301
301
|
#if !(defined NDEBUG) || !defined(OS_WIN)
|
|
302
|
-
TEST_SYNC_POINT("SpecialEnv::
|
|
302
|
+
TEST_SYNC_POINT("SpecialEnv::SpecialWalFile::Append:2");
|
|
303
303
|
#endif
|
|
304
304
|
return s;
|
|
305
305
|
}
|
|
@@ -419,7 +419,7 @@ class SpecialEnv : public EnvWrapper {
|
|
|
419
419
|
} else if (strstr(f.c_str(), "MANIFEST") != nullptr) {
|
|
420
420
|
r->reset(new ManifestFile(this, std::move(*r)));
|
|
421
421
|
} else if (strstr(f.c_str(), "log") != nullptr) {
|
|
422
|
-
r->reset(new
|
|
422
|
+
r->reset(new SpecialWalFile(this, std::move(*r)));
|
|
423
423
|
} else {
|
|
424
424
|
r->reset(new OtherFile(this, std::move(*r)));
|
|
425
425
|
}
|
|
@@ -1041,6 +1041,7 @@ class DBTestBase : public testing::Test {
|
|
|
1041
1041
|
kPartitionedFilterWithNewTableReaderForCompactions,
|
|
1042
1042
|
kUniversalSubcompactions,
|
|
1043
1043
|
kUnorderedWrite,
|
|
1044
|
+
kBlockBasedTableWithBinarySearchWithFirstKeyIndex,
|
|
1044
1045
|
// This must be the last line
|
|
1045
1046
|
kEnd,
|
|
1046
1047
|
};
|