@nxtedition/rocksdb 13.1.5 → 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 +37 -12
- 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
|
@@ -129,21 +129,6 @@ Status WideColumnSerialization::Deserialize(Slice& input,
|
|
|
129
129
|
return Status::OK();
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
WideColumns::const_iterator WideColumnSerialization::Find(
|
|
133
|
-
const WideColumns& columns, const Slice& column_name) {
|
|
134
|
-
const auto it =
|
|
135
|
-
std::lower_bound(columns.cbegin(), columns.cend(), column_name,
|
|
136
|
-
[](const WideColumn& lhs, const Slice& rhs) {
|
|
137
|
-
return lhs.name().compare(rhs) < 0;
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
if (it == columns.cend() || it->name() != column_name) {
|
|
141
|
-
return columns.cend();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return it;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
132
|
Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
|
|
148
133
|
Slice& value) {
|
|
149
134
|
WideColumns columns;
|
|
@@ -47,8 +47,6 @@ class WideColumnSerialization {
|
|
|
47
47
|
|
|
48
48
|
static Status Deserialize(Slice& input, WideColumns& columns);
|
|
49
49
|
|
|
50
|
-
static WideColumns::const_iterator Find(const WideColumns& columns,
|
|
51
|
-
const Slice& column_name);
|
|
52
50
|
static Status GetValueOfDefaultColumn(Slice& input, Slice& value);
|
|
53
51
|
|
|
54
52
|
static constexpr uint32_t kCurrentVersion = 1;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
#include "db/wide/wide_column_serialization.h"
|
|
7
7
|
|
|
8
|
+
#include "db/wide/wide_columns_helper.h"
|
|
8
9
|
#include "test_util/testharness.h"
|
|
9
10
|
#include "util/coding.h"
|
|
10
11
|
|
|
@@ -99,27 +100,28 @@ TEST(WideColumnSerializationTest, SerializeDeserialize) {
|
|
|
99
100
|
ASSERT_EQ(columns, deserialized_columns);
|
|
100
101
|
|
|
101
102
|
{
|
|
102
|
-
const auto it =
|
|
103
|
+
const auto it = WideColumnsHelper::Find(deserialized_columns.cbegin(),
|
|
104
|
+
deserialized_columns.cend(), "foo");
|
|
103
105
|
ASSERT_NE(it, deserialized_columns.cend());
|
|
104
106
|
ASSERT_EQ(*it, deserialized_columns.front());
|
|
105
107
|
}
|
|
106
108
|
|
|
107
109
|
{
|
|
108
|
-
const auto it =
|
|
109
|
-
|
|
110
|
+
const auto it = WideColumnsHelper::Find(
|
|
111
|
+
deserialized_columns.cbegin(), deserialized_columns.cend(), "hello");
|
|
110
112
|
ASSERT_NE(it, deserialized_columns.cend());
|
|
111
113
|
ASSERT_EQ(*it, deserialized_columns.back());
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
{
|
|
115
|
-
const auto it =
|
|
116
|
-
|
|
117
|
+
const auto it = WideColumnsHelper::Find(
|
|
118
|
+
deserialized_columns.cbegin(), deserialized_columns.cend(), "fubar");
|
|
117
119
|
ASSERT_EQ(it, deserialized_columns.cend());
|
|
118
120
|
}
|
|
119
121
|
|
|
120
122
|
{
|
|
121
|
-
const auto it =
|
|
122
|
-
|
|
123
|
+
const auto it = WideColumnsHelper::Find(
|
|
124
|
+
deserialized_columns.cbegin(), deserialized_columns.cend(), "snafu");
|
|
123
125
|
ASSERT_EQ(it, deserialized_columns.cend());
|
|
124
126
|
}
|
|
125
127
|
}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
#include "db/wide/wide_columns_helper.h"
|
|
7
7
|
|
|
8
|
-
#include <algorithm>
|
|
9
8
|
#include <ios>
|
|
10
9
|
|
|
11
10
|
#include "db/wide/wide_column_serialization.h"
|
|
@@ -42,11 +41,4 @@ Status WideColumnsHelper::DumpSliceAsWideColumns(const Slice& value,
|
|
|
42
41
|
return s;
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
void WideColumnsHelper::SortColumns(WideColumns& columns) {
|
|
46
|
-
std::sort(columns.begin(), columns.end(),
|
|
47
|
-
[](const WideColumn& lhs, const WideColumn& rhs) {
|
|
48
|
-
return lhs.name().compare(rhs.name()) < 0;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
44
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
|
|
6
6
|
#pragma once
|
|
7
|
+
|
|
8
|
+
#include <algorithm>
|
|
9
|
+
#include <cassert>
|
|
7
10
|
#include <ostream>
|
|
8
|
-
#include <string>
|
|
9
11
|
|
|
10
12
|
#include "rocksdb/rocksdb_namespace.h"
|
|
11
13
|
#include "rocksdb/wide_columns.h"
|
|
@@ -34,7 +36,31 @@ class WideColumnsHelper {
|
|
|
34
36
|
return columns.front().value();
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
static void SortColumns(WideColumns& columns)
|
|
39
|
+
static void SortColumns(WideColumns& columns) {
|
|
40
|
+
std::sort(columns.begin(), columns.end(),
|
|
41
|
+
[](const WideColumn& lhs, const WideColumn& rhs) {
|
|
42
|
+
return lhs.name().compare(rhs.name()) < 0;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
template <typename Iterator>
|
|
47
|
+
static Iterator Find(Iterator begin, Iterator end, const Slice& column_name) {
|
|
48
|
+
assert(std::is_sorted(begin, end,
|
|
49
|
+
[](const WideColumn& lhs, const WideColumn& rhs) {
|
|
50
|
+
return lhs.name().compare(rhs.name()) < 0;
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
auto it = std::lower_bound(begin, end, column_name,
|
|
54
|
+
[](const WideColumn& lhs, const Slice& rhs) {
|
|
55
|
+
return lhs.name().compare(rhs) < 0;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (it == end || it->name() != column_name) {
|
|
59
|
+
return end;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return it;
|
|
63
|
+
}
|
|
38
64
|
};
|
|
39
65
|
|
|
40
66
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -1160,6 +1160,34 @@ Status WriteBatchInternal::InsertNoop(WriteBatch* b) {
|
|
|
1160
1160
|
return Status::OK();
|
|
1161
1161
|
}
|
|
1162
1162
|
|
|
1163
|
+
ValueType WriteBatchInternal::GetBeginPrepareType(bool write_after_commit,
|
|
1164
|
+
bool unprepared_batch) {
|
|
1165
|
+
return write_after_commit
|
|
1166
|
+
? kTypeBeginPrepareXID
|
|
1167
|
+
: (unprepared_batch ? kTypeBeginUnprepareXID
|
|
1168
|
+
: kTypeBeginPersistedPrepareXID);
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
Status WriteBatchInternal::InsertBeginPrepare(WriteBatch* b,
|
|
1172
|
+
bool write_after_commit,
|
|
1173
|
+
bool unprepared_batch) {
|
|
1174
|
+
b->rep_.push_back(static_cast<char>(
|
|
1175
|
+
GetBeginPrepareType(write_after_commit, unprepared_batch)));
|
|
1176
|
+
b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
|
|
1177
|
+
ContentFlags::HAS_BEGIN_PREPARE,
|
|
1178
|
+
std::memory_order_relaxed);
|
|
1179
|
+
return Status::OK();
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
Status WriteBatchInternal::InsertEndPrepare(WriteBatch* b, const Slice& xid) {
|
|
1183
|
+
b->rep_.push_back(static_cast<char>(kTypeEndPrepareXID));
|
|
1184
|
+
PutLengthPrefixedSlice(&b->rep_, xid);
|
|
1185
|
+
b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
|
|
1186
|
+
ContentFlags::HAS_END_PREPARE,
|
|
1187
|
+
std::memory_order_relaxed);
|
|
1188
|
+
return Status::OK();
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1163
1191
|
Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
|
|
1164
1192
|
bool write_after_commit,
|
|
1165
1193
|
bool unprepared_batch) {
|
|
@@ -1175,13 +1203,8 @@ Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
|
|
|
1175
1203
|
|
|
1176
1204
|
// rewrite noop as begin marker
|
|
1177
1205
|
b->rep_[12] = static_cast<char>(
|
|
1178
|
-
write_after_commit
|
|
1179
|
-
: (unprepared_batch ? kTypeBeginUnprepareXID
|
|
1180
|
-
: kTypeBeginPersistedPrepareXID));
|
|
1181
|
-
b->rep_.push_back(static_cast<char>(kTypeEndPrepareXID));
|
|
1182
|
-
PutLengthPrefixedSlice(&b->rep_, xid);
|
|
1206
|
+
GetBeginPrepareType(write_after_commit, unprepared_batch));
|
|
1183
1207
|
b->content_flags_.store(b->content_flags_.load(std::memory_order_relaxed) |
|
|
1184
|
-
ContentFlags::HAS_END_PREPARE |
|
|
1185
1208
|
ContentFlags::HAS_BEGIN_PREPARE,
|
|
1186
1209
|
std::memory_order_relaxed);
|
|
1187
1210
|
if (unprepared_batch) {
|
|
@@ -1189,7 +1212,7 @@ Status WriteBatchInternal::MarkEndPrepare(WriteBatch* b, const Slice& xid,
|
|
|
1189
1212
|
ContentFlags::HAS_BEGIN_UNPREPARE,
|
|
1190
1213
|
std::memory_order_relaxed);
|
|
1191
1214
|
}
|
|
1192
|
-
return
|
|
1215
|
+
return WriteBatchInternal::InsertEndPrepare(b, xid);
|
|
1193
1216
|
}
|
|
1194
1217
|
|
|
1195
1218
|
Status WriteBatchInternal::MarkCommit(WriteBatch* b, const Slice& xid) {
|
|
@@ -2624,9 +2647,8 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
2624
2647
|
// TODO(ajkr): refactor `SeekToColumnFamily()` so it returns a `Status`.
|
|
2625
2648
|
ret_status.PermitUncheckedError();
|
|
2626
2649
|
return Status::NotSupported(
|
|
2627
|
-
std::string("
|
|
2628
|
-
|
|
2629
|
-
cfd->GetName());
|
|
2650
|
+
std::string("CF " + cfd->GetName() +
|
|
2651
|
+
" reports it does not support DeleteRange"));
|
|
2630
2652
|
}
|
|
2631
2653
|
int cmp =
|
|
2632
2654
|
cfd->user_comparator()->CompareWithoutTimestamp(begin_key, end_key);
|
|
@@ -122,6 +122,15 @@ class WriteBatchInternal {
|
|
|
122
122
|
static Status PutBlobIndex(WriteBatch* batch, uint32_t column_family_id,
|
|
123
123
|
const Slice& key, const Slice& value);
|
|
124
124
|
|
|
125
|
+
static ValueType GetBeginPrepareType(bool write_after_commit,
|
|
126
|
+
bool unprepared_batch);
|
|
127
|
+
|
|
128
|
+
static Status InsertBeginPrepare(WriteBatch* batch,
|
|
129
|
+
const bool write_after_commit = true,
|
|
130
|
+
bool unprepared_batch = false);
|
|
131
|
+
|
|
132
|
+
static Status InsertEndPrepare(WriteBatch* batch, const Slice& xid);
|
|
133
|
+
|
|
125
134
|
static Status MarkEndPrepare(WriteBatch* batch, const Slice& xid,
|
|
126
135
|
const bool write_after_commit = true,
|
|
127
136
|
const bool unprepared_batch = false);
|
|
@@ -59,7 +59,8 @@ static std::string PrintContents(WriteBatch* b,
|
|
|
59
59
|
InternalIterator* iter;
|
|
60
60
|
if (i == 0) {
|
|
61
61
|
iter = mem->NewIterator(ReadOptions(), /*seqno_to_time_mapping=*/nullptr,
|
|
62
|
-
&arena, /*prefix_extractor=*/nullptr
|
|
62
|
+
&arena, /*prefix_extractor=*/nullptr,
|
|
63
|
+
/*for_flush=*/false);
|
|
63
64
|
arena_iter_guard.reset(iter);
|
|
64
65
|
} else {
|
|
65
66
|
iter = mem->NewRangeTombstoneIterator(ReadOptions(),
|
|
@@ -523,8 +523,10 @@ size_t WriteThread::EnterAsBatchGroupLeader(Writer* leader,
|
|
|
523
523
|
// those are something else. They want to be alone
|
|
524
524
|
(w->callback != nullptr && !w->callback->AllowWriteBatching()) ||
|
|
525
525
|
// dont batch writes that don't want to be batched
|
|
526
|
-
(size + WriteBatchInternal::ByteSize(w->batch) > max_size)
|
|
526
|
+
(size + WriteBatchInternal::ByteSize(w->batch) > max_size) ||
|
|
527
527
|
// Do not make batch too big
|
|
528
|
+
(leader->ingest_wbwi || w->ingest_wbwi)
|
|
529
|
+
// ingesting WBWI needs to be its own group
|
|
528
530
|
) {
|
|
529
531
|
// remove from list
|
|
530
532
|
w->link_older->link_newer = w->link_newer;
|
|
@@ -148,6 +148,8 @@ class WriteThread {
|
|
|
148
148
|
Writer* link_older; // read/write only before linking, or as leader
|
|
149
149
|
Writer* link_newer; // lazy, read/write only before linking, or as leader
|
|
150
150
|
|
|
151
|
+
bool ingest_wbwi;
|
|
152
|
+
|
|
151
153
|
Writer()
|
|
152
154
|
: batch(nullptr),
|
|
153
155
|
sync(false),
|
|
@@ -174,7 +176,8 @@ class WriteThread {
|
|
|
174
176
|
WriteCallback* _callback, UserWriteCallback* _user_write_cb,
|
|
175
177
|
uint64_t _log_ref, bool _disable_memtable, size_t _batch_cnt = 0,
|
|
176
178
|
PreReleaseCallback* _pre_release_callback = nullptr,
|
|
177
|
-
PostMemTableCallback* _post_memtable_callback = nullptr
|
|
179
|
+
PostMemTableCallback* _post_memtable_callback = nullptr,
|
|
180
|
+
bool _ingest_wbwi = false)
|
|
178
181
|
: batch(_batch),
|
|
179
182
|
// TODO: store a copy of WriteOptions instead of its seperated data
|
|
180
183
|
// members
|
|
@@ -196,7 +199,8 @@ class WriteThread {
|
|
|
196
199
|
write_group(nullptr),
|
|
197
200
|
sequence(kMaxSequenceNumber),
|
|
198
201
|
link_older(nullptr),
|
|
199
|
-
link_newer(nullptr)
|
|
202
|
+
link_newer(nullptr),
|
|
203
|
+
ingest_wbwi(_ingest_wbwi) {}
|
|
200
204
|
|
|
201
205
|
~Writer() {
|
|
202
206
|
if (made_waitable) {
|
|
@@ -613,6 +613,21 @@ class BatchedOpsStressTest : public StressTest {
|
|
|
613
613
|
// no iterator should finish before the first one
|
|
614
614
|
assert(iters[i]->Valid() &&
|
|
615
615
|
iters[i]->key().starts_with(prefix_slices[i]));
|
|
616
|
+
|
|
617
|
+
if (ro_copies[i].allow_unprepared_value) {
|
|
618
|
+
// Save key in case PrepareValue fails and invalidates the iterator
|
|
619
|
+
const std::string prepare_value_key =
|
|
620
|
+
iters[i]->key().ToString(/* hex */ true);
|
|
621
|
+
|
|
622
|
+
if (!iters[i]->PrepareValue()) {
|
|
623
|
+
fprintf(stderr,
|
|
624
|
+
"prefix scan error: PrepareValue failed for key %s: %s\n",
|
|
625
|
+
prepare_value_key.c_str(),
|
|
626
|
+
iters[i]->status().ToString().c_str());
|
|
627
|
+
continue;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
616
631
|
values[i] = iters[i]->value().ToString();
|
|
617
632
|
|
|
618
633
|
// make sure the last character of the value is the expected digit
|
|
@@ -802,6 +802,13 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
802
802
|
iter->Next()) {
|
|
803
803
|
++count;
|
|
804
804
|
|
|
805
|
+
if (ro_copy.allow_unprepared_value) {
|
|
806
|
+
if (!iter->PrepareValue()) {
|
|
807
|
+
s = iter->status();
|
|
808
|
+
break;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
805
812
|
if (!VerifyWideColumns(iter->value(), iter->columns())) {
|
|
806
813
|
s = Status::Corruption("Value and columns inconsistent",
|
|
807
814
|
DebugString(iter->value(), iter->columns()));
|
|
@@ -417,6 +417,10 @@ DECLARE_bool(check_multiget_consistency);
|
|
|
417
417
|
DECLARE_bool(check_multiget_entity_consistency);
|
|
418
418
|
DECLARE_bool(inplace_update_support);
|
|
419
419
|
DECLARE_uint32(uncache_aggressiveness);
|
|
420
|
+
DECLARE_int32(test_ingest_standalone_range_deletion_one_in);
|
|
421
|
+
DECLARE_bool(allow_unprepared_value);
|
|
422
|
+
DECLARE_string(file_temperature_age_thresholds);
|
|
423
|
+
DECLARE_uint32(commit_bypass_memtable_one_in);
|
|
420
424
|
|
|
421
425
|
constexpr long KB = 1024;
|
|
422
426
|
constexpr int kRandomValueMaxFactor = 3;
|
|
@@ -546,6 +546,10 @@ DEFINE_uint32(use_timed_put_one_in, 0,
|
|
|
546
546
|
"If greater than zero, TimedPut is used per every N write ops on "
|
|
547
547
|
"on average.");
|
|
548
548
|
|
|
549
|
+
DEFINE_string(file_temperature_age_thresholds, "",
|
|
550
|
+
"See CompactionOptionsFIFO::file_temperature_age_thresholds. "
|
|
551
|
+
"empty == unset");
|
|
552
|
+
|
|
549
553
|
static const bool FLAGS_subcompactions_dummy __attribute__((__unused__)) =
|
|
550
554
|
RegisterFlagValidator(&FLAGS_subcompactions, &ValidateUint32Range);
|
|
551
555
|
|
|
@@ -835,6 +839,14 @@ DEFINE_bool(use_get_entity, false, "If set, use the GetEntity API for reads");
|
|
|
835
839
|
DEFINE_bool(use_multi_get_entity, false,
|
|
836
840
|
"If set, use the MultiGetEntity API for reads");
|
|
837
841
|
|
|
842
|
+
DEFINE_int32(test_ingest_standalone_range_deletion_one_in, 0,
|
|
843
|
+
"If non-zero, file ingestion flow will test standalone range "
|
|
844
|
+
"deletion file once every N file ingestion operations.");
|
|
845
|
+
|
|
846
|
+
DEFINE_bool(allow_unprepared_value,
|
|
847
|
+
ROCKSDB_NAMESPACE::ReadOptions().allow_unprepared_value,
|
|
848
|
+
"Allow lazy loading of values for range scans");
|
|
849
|
+
|
|
838
850
|
static bool ValidateInt32Percent(const char* flagname, int32_t value) {
|
|
839
851
|
if (value < 0 || value > 100) {
|
|
840
852
|
fprintf(stderr, "Invalid value for --%s: %d, 0<= pct <=100 \n", flagname,
|
|
@@ -1031,8 +1043,9 @@ DEFINE_int32(continuous_verification_interval, 1000,
|
|
|
1031
1043
|
"disables continuous verification.");
|
|
1032
1044
|
|
|
1033
1045
|
DEFINE_int32(approximate_size_one_in, 64,
|
|
1034
|
-
"If non-zero, DB::GetApproximateSizes()
|
|
1035
|
-
"
|
|
1046
|
+
"If non-zero, DB::GetApproximateSizes() and "
|
|
1047
|
+
"DB::GetApproximateMemTableStats() will be called against "
|
|
1048
|
+
"random key ranges.");
|
|
1036
1049
|
|
|
1037
1050
|
DEFINE_int32(read_fault_one_in, 1000,
|
|
1038
1051
|
"On non-zero, enables fault injection on read");
|
|
@@ -1456,4 +1469,7 @@ DEFINE_bool(paranoid_memory_checks,
|
|
|
1456
1469
|
ROCKSDB_NAMESPACE::Options().paranoid_memory_checks,
|
|
1457
1470
|
"Sets CF option paranoid_memory_checks.");
|
|
1458
1471
|
|
|
1472
|
+
DEFINE_uint32(commit_bypass_memtable_one_in, 0,
|
|
1473
|
+
"If greater than zero, transaction option will set "
|
|
1474
|
+
"commit_bypass_memtable to per every N transactions on average.");
|
|
1459
1475
|
#endif // GFLAGS
|
|
@@ -274,6 +274,8 @@ bool StressTest::BuildOptionsTable() {
|
|
|
274
274
|
return true;
|
|
275
275
|
}
|
|
276
276
|
|
|
277
|
+
bool keepRibbonFilterPolicyOnly = FLAGS_bloom_before_level != INT_MAX;
|
|
278
|
+
|
|
277
279
|
std::unordered_map<std::string, std::vector<std::string>> options_tbl = {
|
|
278
280
|
{"write_buffer_size",
|
|
279
281
|
{std::to_string(options_.write_buffer_size),
|
|
@@ -339,6 +341,17 @@ bool StressTest::BuildOptionsTable() {
|
|
|
339
341
|
"2",
|
|
340
342
|
}},
|
|
341
343
|
{"max_sequential_skip_in_iterations", {"4", "8", "12"}},
|
|
344
|
+
{"block_based_table_factory",
|
|
345
|
+
{
|
|
346
|
+
keepRibbonFilterPolicyOnly ? "{filter_policy=ribbonfilter:2.35}"
|
|
347
|
+
: "{filter_policy=bloomfilter:2.34}",
|
|
348
|
+
"{filter_policy=ribbonfilter:5.67:-1}",
|
|
349
|
+
keepRibbonFilterPolicyOnly ? "{filter_policy=ribbonfilter:8.9:3}"
|
|
350
|
+
: "{filter_policy=nullptr}",
|
|
351
|
+
"{block_size=" + std::to_string(FLAGS_block_size) + "}",
|
|
352
|
+
"{block_size=" +
|
|
353
|
+
std::to_string(FLAGS_block_size + (FLAGS_seed & 0xFFFU)) + "}",
|
|
354
|
+
}},
|
|
342
355
|
};
|
|
343
356
|
if (FLAGS_compaction_style == kCompactionStyleUniversal &&
|
|
344
357
|
FLAGS_universal_max_read_amp > 0) {
|
|
@@ -393,13 +406,23 @@ bool StressTest::BuildOptionsTable() {
|
|
|
393
406
|
std::vector<std::string>{"kDisable", "kFlushOnly"});
|
|
394
407
|
}
|
|
395
408
|
|
|
396
|
-
if (
|
|
409
|
+
if (keepRibbonFilterPolicyOnly) {
|
|
397
410
|
// Can modify RibbonFilterPolicy field
|
|
398
411
|
options_tbl.emplace("table_factory.filter_policy.bloom_before_level",
|
|
399
412
|
std::vector<std::string>{"-1", "0", "1", "2",
|
|
400
413
|
"2147483646", "2147483647"});
|
|
401
414
|
}
|
|
402
415
|
|
|
416
|
+
if (!FLAGS_file_temperature_age_thresholds.empty()) {
|
|
417
|
+
// Modify file_temperature_age_thresholds only if it is set initially
|
|
418
|
+
// (FIFO tiered storage setup)
|
|
419
|
+
options_tbl.emplace(
|
|
420
|
+
"file_temperature_age_thresholds",
|
|
421
|
+
std::vector<std::string>{
|
|
422
|
+
"{{temperature=kWarm;age=30}:{temperature=kCold;age=300}}",
|
|
423
|
+
"{{temperature=kCold;age=100}}", "{}"});
|
|
424
|
+
}
|
|
425
|
+
|
|
403
426
|
options_table_ = std::move(options_tbl);
|
|
404
427
|
|
|
405
428
|
for (const auto& iter : options_table_) {
|
|
@@ -782,8 +805,9 @@ void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
|
|
|
782
805
|
}
|
|
783
806
|
}
|
|
784
807
|
|
|
785
|
-
Status StressTest::NewTxn(WriteOptions& write_opts,
|
|
786
|
-
std::unique_ptr<Transaction>* out_txn
|
|
808
|
+
Status StressTest::NewTxn(WriteOptions& write_opts, ThreadState* thread,
|
|
809
|
+
std::unique_ptr<Transaction>* out_txn,
|
|
810
|
+
bool* commit_bypass_memtable) {
|
|
787
811
|
if (!FLAGS_use_txn) {
|
|
788
812
|
return Status::InvalidArgument("NewTxn when FLAGS_use_txn is not set");
|
|
789
813
|
}
|
|
@@ -798,6 +822,15 @@ Status StressTest::NewTxn(WriteOptions& write_opts,
|
|
|
798
822
|
FLAGS_use_only_the_last_commit_time_batch_for_recovery;
|
|
799
823
|
txn_options.lock_timeout = 600000; // 10 min
|
|
800
824
|
txn_options.deadlock_detect = true;
|
|
825
|
+
if (FLAGS_commit_bypass_memtable_one_in > 0) {
|
|
826
|
+
assert(FLAGS_txn_write_policy == 0);
|
|
827
|
+
assert(FLAGS_user_timestamp_size == 0);
|
|
828
|
+
txn_options.commit_bypass_memtable =
|
|
829
|
+
thread->rand.OneIn(FLAGS_commit_bypass_memtable_one_in);
|
|
830
|
+
if (commit_bypass_memtable) {
|
|
831
|
+
*commit_bypass_memtable = txn_options.commit_bypass_memtable;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
801
834
|
out_txn->reset(txn_db_->BeginTransaction(write_opts, txn_options));
|
|
802
835
|
auto istr = std::to_string(txn_id.fetch_add(1));
|
|
803
836
|
Status s = (*out_txn)->SetName("xid" + istr);
|
|
@@ -853,11 +886,12 @@ Status StressTest::CommitTxn(Transaction& txn, ThreadState* thread) {
|
|
|
853
886
|
return s;
|
|
854
887
|
}
|
|
855
888
|
|
|
856
|
-
Status StressTest::ExecuteTransaction(
|
|
857
|
-
|
|
858
|
-
|
|
889
|
+
Status StressTest::ExecuteTransaction(WriteOptions& write_opts,
|
|
890
|
+
ThreadState* thread,
|
|
891
|
+
std::function<Status(Transaction&)>&& ops,
|
|
892
|
+
bool* commit_bypass_memtable) {
|
|
859
893
|
std::unique_ptr<Transaction> txn;
|
|
860
|
-
Status s = NewTxn(write_opts, &txn);
|
|
894
|
+
Status s = NewTxn(write_opts, thread, &txn, commit_bypass_memtable);
|
|
861
895
|
std::string try_again_messages;
|
|
862
896
|
if (s.ok()) {
|
|
863
897
|
for (int tries = 1;; ++tries) {
|
|
@@ -905,6 +939,8 @@ void StressTest::OperateDb(ThreadState* thread) {
|
|
|
905
939
|
read_opts.auto_readahead_size = FLAGS_auto_readahead_size;
|
|
906
940
|
read_opts.fill_cache = FLAGS_fill_cache;
|
|
907
941
|
read_opts.optimize_multiget_for_io = FLAGS_optimize_multiget_for_io;
|
|
942
|
+
read_opts.allow_unprepared_value = FLAGS_allow_unprepared_value;
|
|
943
|
+
|
|
908
944
|
WriteOptions write_opts;
|
|
909
945
|
if (FLAGS_rate_limit_auto_wal_flush) {
|
|
910
946
|
write_opts.rate_limiter_priority = Env::IO_USER;
|
|
@@ -1733,6 +1769,15 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
|
|
|
1733
1769
|
op_logs += "S " + key.ToString(true) + " ";
|
|
1734
1770
|
}
|
|
1735
1771
|
|
|
1772
|
+
if (iter->Valid() && ro.allow_unprepared_value) {
|
|
1773
|
+
op_logs += "*";
|
|
1774
|
+
|
|
1775
|
+
if (!iter->PrepareValue()) {
|
|
1776
|
+
assert(!iter->Valid());
|
|
1777
|
+
assert(!iter->status().ok());
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1736
1781
|
if (!iter->status().ok() && IsErrorInjectedAndRetryable(iter->status())) {
|
|
1737
1782
|
return iter->status();
|
|
1738
1783
|
} else if (!cmp_iter->status().ok() &&
|
|
@@ -1764,6 +1809,15 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
|
|
|
1764
1809
|
|
|
1765
1810
|
last_op = kLastOpNextOrPrev;
|
|
1766
1811
|
|
|
1812
|
+
if (iter->Valid() && ro.allow_unprepared_value) {
|
|
1813
|
+
op_logs += "*";
|
|
1814
|
+
|
|
1815
|
+
if (!iter->PrepareValue()) {
|
|
1816
|
+
assert(!iter->Valid());
|
|
1817
|
+
assert(!iter->status().ok());
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1767
1821
|
if (!iter->status().ok() && IsErrorInjectedAndRetryable(iter->status())) {
|
|
1768
1822
|
return iter->status();
|
|
1769
1823
|
} else if (!cmp_iter->status().ok() &&
|
|
@@ -1893,7 +1947,9 @@ void StressTest::VerifyIterator(
|
|
|
1893
1947
|
<< ", iterate_lower_bound: "
|
|
1894
1948
|
<< (ro.iterate_lower_bound
|
|
1895
1949
|
? ro.iterate_lower_bound->ToString(true).c_str()
|
|
1896
|
-
: "")
|
|
1950
|
+
: "")
|
|
1951
|
+
<< ", allow_unprepared_value: " << ro.allow_unprepared_value;
|
|
1952
|
+
|
|
1897
1953
|
if (iter->Valid() && !cmp_iter->Valid()) {
|
|
1898
1954
|
if (pe != nullptr) {
|
|
1899
1955
|
if (!pe->InDomain(seek_key)) {
|
|
@@ -1987,6 +2043,7 @@ void StressTest::VerifyIterator(
|
|
|
1987
2043
|
*diverged = true;
|
|
1988
2044
|
}
|
|
1989
2045
|
}
|
|
2046
|
+
|
|
1990
2047
|
if (*diverged) {
|
|
1991
2048
|
fprintf(stderr, "VerifyIterator failed. Control CF %s\n",
|
|
1992
2049
|
cmp_cfh->GetName().c_str());
|
|
@@ -2427,22 +2484,31 @@ Status StressTest::TestApproximateSize(
|
|
|
2427
2484
|
std::string key1_str = Key(key1);
|
|
2428
2485
|
std::string key2_str = Key(key2);
|
|
2429
2486
|
Range range{Slice(key1_str), Slice(key2_str)};
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2487
|
+
if (thread->rand.OneIn(3)) {
|
|
2488
|
+
// Call GetApproximateMemTableStats instead
|
|
2489
|
+
uint64_t count, size;
|
|
2490
|
+
db_->GetApproximateMemTableStats(column_families_[rand_column_families[0]],
|
|
2491
|
+
range, &count, &size);
|
|
2492
|
+
return Status::OK();
|
|
2493
|
+
} else {
|
|
2494
|
+
// Call GetApproximateSizes
|
|
2495
|
+
SizeApproximationOptions sao;
|
|
2496
|
+
sao.include_memtables = thread->rand.OneIn(2);
|
|
2497
|
+
if (sao.include_memtables) {
|
|
2498
|
+
sao.include_files = thread->rand.OneIn(2);
|
|
2499
|
+
}
|
|
2436
2500
|
if (thread->rand.OneIn(2)) {
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2501
|
+
if (thread->rand.OneIn(2)) {
|
|
2502
|
+
sao.files_size_error_margin = 0.0;
|
|
2503
|
+
} else {
|
|
2504
|
+
sao.files_size_error_margin =
|
|
2505
|
+
static_cast<double>(thread->rand.Uniform(3));
|
|
2506
|
+
}
|
|
2441
2507
|
}
|
|
2508
|
+
uint64_t result;
|
|
2509
|
+
return db_->GetApproximateSizes(
|
|
2510
|
+
sao, column_families_[rand_column_families[0]], &range, 1, &result);
|
|
2442
2511
|
}
|
|
2443
|
-
uint64_t result;
|
|
2444
|
-
return db_->GetApproximateSizes(
|
|
2445
|
-
sao, column_families_[rand_column_families[0]], &range, 1, &result);
|
|
2446
2512
|
}
|
|
2447
2513
|
|
|
2448
2514
|
Status StressTest::TestCheckpoint(ThreadState* thread,
|
|
@@ -3674,7 +3740,7 @@ void StressTest::Reopen(ThreadState* thread) {
|
|
|
3674
3740
|
// crash-recovery verification does. Therefore it always expects no data loss
|
|
3675
3741
|
// and we should ensure no data loss in testing.
|
|
3676
3742
|
// TODO(hx235): eliminate the FlushWAL(true /* sync */)/SyncWAL() below
|
|
3677
|
-
if (!FLAGS_disable_wal
|
|
3743
|
+
if (!FLAGS_disable_wal) {
|
|
3678
3744
|
Status s;
|
|
3679
3745
|
if (FLAGS_manual_wal_flush_one_in > 0) {
|
|
3680
3746
|
s = db_->FlushWAL(/*sync=*/true);
|
|
@@ -4111,6 +4177,18 @@ void InitializeOptionsFromFlags(
|
|
|
4111
4177
|
options.default_temperature =
|
|
4112
4178
|
StringToTemperature(FLAGS_default_temperature.c_str());
|
|
4113
4179
|
|
|
4180
|
+
if (!FLAGS_file_temperature_age_thresholds.empty()) {
|
|
4181
|
+
Status s = GetColumnFamilyOptionsFromString(
|
|
4182
|
+
{}, options,
|
|
4183
|
+
"compaction_options_fifo={file_temperature_age_thresholds=" +
|
|
4184
|
+
FLAGS_file_temperature_age_thresholds + "}",
|
|
4185
|
+
&options);
|
|
4186
|
+
if (!s.ok()) {
|
|
4187
|
+
fprintf(stderr, "While setting file_temperature_age_thresholds: %s\n",
|
|
4188
|
+
s.ToString().c_str());
|
|
4189
|
+
exit(1);
|
|
4190
|
+
}
|
|
4191
|
+
}
|
|
4114
4192
|
options.preclude_last_level_data_seconds =
|
|
4115
4193
|
FLAGS_preclude_last_level_data_seconds;
|
|
4116
4194
|
options.preserve_internal_time_seconds = FLAGS_preserve_internal_time_seconds;
|
|
@@ -71,14 +71,19 @@ class StressTest {
|
|
|
71
71
|
void UpdateIfInitialWriteFails(Env* db_stress_env, const Status& write_s,
|
|
72
72
|
Status* initial_write_s,
|
|
73
73
|
bool* initial_wal_write_may_succeed,
|
|
74
|
-
uint64_t* wait_for_recover_start_time
|
|
74
|
+
uint64_t* wait_for_recover_start_time,
|
|
75
|
+
bool commit_bypass_memtable = false) {
|
|
75
76
|
assert(db_stress_env && initial_write_s && initial_wal_write_may_succeed &&
|
|
76
77
|
wait_for_recover_start_time);
|
|
77
78
|
// Only update `initial_write_s`, `initial_wal_write_may_succeed` when the
|
|
78
79
|
// first write fails
|
|
79
80
|
if (!write_s.ok() && (*initial_write_s).ok()) {
|
|
80
81
|
*initial_write_s = write_s;
|
|
82
|
+
// With commit_bypass_memtable, we create a new WAL after WAL write
|
|
83
|
+
// succeeds, that wal creation may fail due to injected error. So the
|
|
84
|
+
// initial wal write may succeed even if status is failed to write to wal
|
|
81
85
|
*initial_wal_write_may_succeed =
|
|
86
|
+
commit_bypass_memtable ||
|
|
82
87
|
!FaultInjectionTestFS::IsFailedToWriteToWALError(*initial_write_s);
|
|
83
88
|
*wait_for_recover_start_time = db_stress_env->NowMicros();
|
|
84
89
|
}
|
|
@@ -138,13 +143,19 @@ class StressTest {
|
|
|
138
143
|
SharedState* shared);
|
|
139
144
|
|
|
140
145
|
// ExecuteTransaction is recommended instead
|
|
141
|
-
|
|
142
|
-
|
|
146
|
+
// @param commit_bypass_memtable Whether commit_bypass_memtable is set to
|
|
147
|
+
// true in transaction options.
|
|
148
|
+
Status NewTxn(WriteOptions& write_opts, ThreadState* thread,
|
|
149
|
+
std::unique_ptr<Transaction>* out_txn,
|
|
150
|
+
bool* commit_bypass_memtable = nullptr);
|
|
143
151
|
Status CommitTxn(Transaction& txn, ThreadState* thread = nullptr);
|
|
144
152
|
|
|
145
153
|
// Creates a transaction, executes `ops`, and tries to commit
|
|
154
|
+
// @param commit_bypass_memtable Whether commit_bypass_memtable is set to
|
|
155
|
+
// true in transaction options.
|
|
146
156
|
Status ExecuteTransaction(WriteOptions& write_opts, ThreadState* thread,
|
|
147
|
-
std::function<Status(Transaction&)>&& ops
|
|
157
|
+
std::function<Status(Transaction&)>&& ops,
|
|
158
|
+
bool* commit_bypass_memtable = nullptr);
|
|
148
159
|
|
|
149
160
|
virtual void MaybeClearOneColumnFamily(ThreadState* /* thread */) {}
|
|
150
161
|
|