@nxtedition/rocksdb 7.1.32 → 7.1.34
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/deps/rocksdb/rocksdb/cache/clock_cache.cc +402 -345
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +121 -64
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +28 -18
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +563 -673
- package/deps/rocksdb/rocksdb/db/c_test.c +168 -169
- package/deps/rocksdb/rocksdb/db/column_family.cc +16 -15
- package/deps/rocksdb/rocksdb/db/column_family.h +7 -7
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -28
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +114 -0
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/convenience.cc +3 -5
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +10 -14
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +9 -13
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +14 -16
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +52 -72
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +1 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +26 -0
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +12 -6
- package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +6 -7
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +10 -8
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +15 -13
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -9
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +2 -4
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +7 -4
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +7 -5
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +8 -6
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +18 -23
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_test.cc +10 -5
- package/deps/rocksdb/rocksdb/db/db_test2.cc +172 -169
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +68 -66
- package/deps/rocksdb/rocksdb/db/db_test_util.h +1 -3
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +31 -39
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +182 -2
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +43 -40
- package/deps/rocksdb/rocksdb/db/dbformat.h +15 -0
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +35 -34
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +10 -11
- package/deps/rocksdb/rocksdb/db/error_handler.cc +6 -6
- package/deps/rocksdb/rocksdb/db/error_handler.h +93 -94
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -1
- package/deps/rocksdb/rocksdb/db/event_helpers.h +3 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -17
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -0
- package/deps/rocksdb/rocksdb/db/file_indexer.h +2 -1
- package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/filename_test.cc +27 -29
- package/deps/rocksdb/rocksdb/db/flush_job.cc +7 -13
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +15 -21
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +7 -6
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +2 -2
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +59 -14
- package/deps/rocksdb/rocksdb/db/internal_stats.h +27 -11
- package/deps/rocksdb/rocksdb/db/job_context.h +5 -6
- package/deps/rocksdb/rocksdb/db/listener_test.cc +21 -23
- package/deps/rocksdb/rocksdb/db/log_reader.cc +7 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +4 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +6 -12
- package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
- package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +0 -1
- package/deps/rocksdb/rocksdb/db/lookup_key.h +4 -1
- package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/memtable.cc +34 -22
- package/deps/rocksdb/rocksdb/db/memtable.h +4 -6
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +7 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -13
- package/deps/rocksdb/rocksdb/db/merge_context.h +1 -0
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +128 -14
- package/deps/rocksdb/rocksdb/db/merge_helper.h +15 -7
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +5 -6
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +55 -43
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +288 -299
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +22 -27
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +7 -8
- package/deps/rocksdb/rocksdb/db/repair_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +4 -5
- package/deps/rocksdb/rocksdb/db/snapshot_impl.h +10 -4
- package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -4
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +6 -7
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +22 -22
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +12 -12
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +6 -8
- package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +2 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -5
- package/deps/rocksdb/rocksdb/db/version_edit.h +8 -12
- package/deps/rocksdb/rocksdb/db/version_set.cc +74 -102
- package/deps/rocksdb/rocksdb/db/version_set.h +8 -10
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +0 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -45
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +6 -5
- package/deps/rocksdb/rocksdb/db/wal_manager.h +2 -2
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +144 -61
- package/deps/rocksdb/rocksdb/db/write_batch.cc +41 -24
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -7
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +105 -104
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/write_controller.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +8 -6
- package/deps/rocksdb/rocksdb/env/io_posix.h +6 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +134 -65
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +29 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +14 -4
- package/deps/rocksdb/rocksdb/table/get_context.cc +52 -7
- package/deps/rocksdb/rocksdb/table/get_context.h +1 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +13 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +36 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +23 -28
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +11 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +19 -17
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +10 -7
- package/index.js +14 -16
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -158,7 +158,7 @@ struct BatchContentClassifier : public WriteBatch::Handler {
|
|
|
158
158
|
}
|
|
159
159
|
};
|
|
160
160
|
|
|
161
|
-
} //
|
|
161
|
+
} // anonymous namespace
|
|
162
162
|
|
|
163
163
|
struct SavePoints {
|
|
164
164
|
std::stack<SavePoint, autovector<SavePoint>> stack;
|
|
@@ -231,18 +231,16 @@ WriteBatch& WriteBatch::operator=(WriteBatch&& src) {
|
|
|
231
231
|
return *this;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
WriteBatch::~WriteBatch() {
|
|
234
|
+
WriteBatch::~WriteBatch() {}
|
|
235
235
|
|
|
236
|
-
WriteBatch::Handler::~Handler() {
|
|
236
|
+
WriteBatch::Handler::~Handler() {}
|
|
237
237
|
|
|
238
238
|
void WriteBatch::Handler::LogData(const Slice& /*blob*/) {
|
|
239
239
|
// If the user has not specified something to do with blobs, then we ignore
|
|
240
240
|
// them.
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
-
bool WriteBatch::Handler::Continue() {
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
243
|
+
bool WriteBatch::Handler::Continue() { return true; }
|
|
246
244
|
|
|
247
245
|
void WriteBatch::Clear() {
|
|
248
246
|
rep_.clear();
|
|
@@ -779,7 +777,7 @@ Status CheckColumnFamilyTimestampSize(ColumnFamilyHandle* column_family,
|
|
|
779
777
|
}
|
|
780
778
|
return Status::OK();
|
|
781
779
|
}
|
|
782
|
-
} // namespace
|
|
780
|
+
} // anonymous namespace
|
|
783
781
|
|
|
784
782
|
Status WriteBatchInternal::Put(WriteBatch* b, uint32_t column_family_id,
|
|
785
783
|
const Slice& key, const Slice& value) {
|
|
@@ -1481,8 +1479,27 @@ Status WriteBatch::Merge(ColumnFamilyHandle* column_family, const Slice& key,
|
|
|
1481
1479
|
return WriteBatchInternal::Merge(this, cf_id, key, value);
|
|
1482
1480
|
}
|
|
1483
1481
|
|
|
1484
|
-
|
|
1485
|
-
|
|
1482
|
+
needs_in_place_update_ts_ = true;
|
|
1483
|
+
has_key_with_ts_ = true;
|
|
1484
|
+
std::string dummy_ts(ts_sz, '\0');
|
|
1485
|
+
std::array<Slice, 2> key_with_ts{{key, dummy_ts}};
|
|
1486
|
+
|
|
1487
|
+
return WriteBatchInternal::Merge(
|
|
1488
|
+
this, cf_id, SliceParts(key_with_ts.data(), 2), SliceParts(&value, 1));
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
Status WriteBatch::Merge(ColumnFamilyHandle* column_family, const Slice& key,
|
|
1492
|
+
const Slice& ts, const Slice& value) {
|
|
1493
|
+
const Status s = CheckColumnFamilyTimestampSize(column_family, ts);
|
|
1494
|
+
if (!s.ok()) {
|
|
1495
|
+
return s;
|
|
1496
|
+
}
|
|
1497
|
+
has_key_with_ts_ = true;
|
|
1498
|
+
assert(column_family);
|
|
1499
|
+
uint32_t cf_id = column_family->GetID();
|
|
1500
|
+
std::array<Slice, 2> key_with_ts{{key, ts}};
|
|
1501
|
+
return WriteBatchInternal::Merge(
|
|
1502
|
+
this, cf_id, SliceParts(key_with_ts.data(), 2), SliceParts(&value, 1));
|
|
1486
1503
|
}
|
|
1487
1504
|
|
|
1488
1505
|
Status WriteBatchInternal::Merge(WriteBatch* b, uint32_t column_family_id,
|
|
@@ -1727,7 +1744,6 @@ Status WriteBatch::VerifyChecksum() const {
|
|
|
1727
1744
|
namespace {
|
|
1728
1745
|
|
|
1729
1746
|
class MemTableInserter : public WriteBatch::Handler {
|
|
1730
|
-
|
|
1731
1747
|
SequenceNumber sequence_;
|
|
1732
1748
|
ColumnFamilyMemTables* const cf_mems_;
|
|
1733
1749
|
FlushScheduler* const flush_scheduler_;
|
|
@@ -1738,7 +1754,7 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1738
1754
|
uint64_t log_number_ref_;
|
|
1739
1755
|
DBImpl* db_;
|
|
1740
1756
|
const bool concurrent_memtable_writes_;
|
|
1741
|
-
bool
|
|
1757
|
+
bool post_info_created_;
|
|
1742
1758
|
const WriteBatch::ProtectionInfo* prot_info_;
|
|
1743
1759
|
size_t prot_info_idx_;
|
|
1744
1760
|
|
|
@@ -1764,8 +1780,8 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1764
1780
|
// Whether this batch was unprepared or not
|
|
1765
1781
|
bool unprepared_batch_;
|
|
1766
1782
|
using DupDetector = std::aligned_storage<sizeof(DuplicateDetector)>::type;
|
|
1767
|
-
DupDetector
|
|
1768
|
-
bool
|
|
1783
|
+
DupDetector duplicate_detector_;
|
|
1784
|
+
bool dup_dectector_on_;
|
|
1769
1785
|
|
|
1770
1786
|
bool hint_per_batch_;
|
|
1771
1787
|
bool hint_created_;
|
|
@@ -1785,7 +1801,7 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1785
1801
|
|
|
1786
1802
|
MemPostInfoMap& GetPostMap() {
|
|
1787
1803
|
assert(concurrent_memtable_writes_);
|
|
1788
|
-
if(!post_info_created_) {
|
|
1804
|
+
if (!post_info_created_) {
|
|
1789
1805
|
new (&mem_post_info_map_) MemPostInfoMap();
|
|
1790
1806
|
post_info_created_ = true;
|
|
1791
1807
|
}
|
|
@@ -1799,8 +1815,8 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1799
1815
|
new (&duplicate_detector_) DuplicateDetector(db_);
|
|
1800
1816
|
dup_dectector_on_ = true;
|
|
1801
1817
|
}
|
|
1802
|
-
return reinterpret_cast<DuplicateDetector*>
|
|
1803
|
-
|
|
1818
|
+
return reinterpret_cast<DuplicateDetector*>(&duplicate_detector_)
|
|
1819
|
+
->IsDuplicateKeySeq(column_family_id, key, sequence_);
|
|
1804
1820
|
}
|
|
1805
1821
|
|
|
1806
1822
|
const ProtectionInfoKVOC64* NextProtectionInfo() {
|
|
@@ -1876,12 +1892,11 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1876
1892
|
|
|
1877
1893
|
~MemTableInserter() override {
|
|
1878
1894
|
if (dup_dectector_on_) {
|
|
1879
|
-
reinterpret_cast<DuplicateDetector*>
|
|
1880
|
-
|
|
1895
|
+
reinterpret_cast<DuplicateDetector*>(&duplicate_detector_)
|
|
1896
|
+
->~DuplicateDetector();
|
|
1881
1897
|
}
|
|
1882
1898
|
if (post_info_created_) {
|
|
1883
|
-
reinterpret_cast<MemPostInfoMap*>
|
|
1884
|
-
(&mem_post_info_map_)->~MemPostInfoMap();
|
|
1899
|
+
reinterpret_cast<MemPostInfoMap*>(&mem_post_info_map_)->~MemPostInfoMap();
|
|
1885
1900
|
}
|
|
1886
1901
|
if (hint_created_) {
|
|
1887
1902
|
for (auto iter : GetHintMap()) {
|
|
@@ -1923,7 +1938,7 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
1923
1938
|
assert(concurrent_memtable_writes_);
|
|
1924
1939
|
// If post info was not created there is nothing
|
|
1925
1940
|
// to process and no need to create on demand
|
|
1926
|
-
if(post_info_created_) {
|
|
1941
|
+
if (post_info_created_) {
|
|
1927
1942
|
for (auto& pair : GetPostMap()) {
|
|
1928
1943
|
pair.first->BatchPostProcess(pair.second);
|
|
1929
1944
|
}
|
|
@@ -2036,6 +2051,7 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
2036
2051
|
if (cf_handle == nullptr) {
|
|
2037
2052
|
cf_handle = db_->DefaultColumnFamily();
|
|
2038
2053
|
}
|
|
2054
|
+
// TODO (yanqin): fix when user-defined timestamp is enabled.
|
|
2039
2055
|
get_status = db_->Get(ropts, cf_handle, key, &prev_value);
|
|
2040
2056
|
}
|
|
2041
2057
|
// Intentionally overwrites the `NotFound` in `ret_status`.
|
|
@@ -2486,7 +2502,8 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
2486
2502
|
Status merge_status = MergeHelper::TimedFullMerge(
|
|
2487
2503
|
merge_operator, key, &get_value_slice, {value}, &new_value,
|
|
2488
2504
|
moptions->info_log, moptions->statistics,
|
|
2489
|
-
SystemClock::Default().get()
|
|
2505
|
+
SystemClock::Default().get(), /* result_operand */ nullptr,
|
|
2506
|
+
/* update_num_ops_stats */ false);
|
|
2490
2507
|
|
|
2491
2508
|
if (!merge_status.ok()) {
|
|
2492
2509
|
// Failed to merge!
|
|
@@ -2844,7 +2861,7 @@ class MemTableInserter : public WriteBatch::Handler {
|
|
|
2844
2861
|
}
|
|
2845
2862
|
};
|
|
2846
2863
|
|
|
2847
|
-
} // namespace
|
|
2864
|
+
} // anonymous namespace
|
|
2848
2865
|
|
|
2849
2866
|
// This function can only be called in these conditions:
|
|
2850
2867
|
// 1) During Recovery()
|
|
@@ -3015,7 +3032,7 @@ class ProtectionInfoUpdater : public WriteBatch::Handler {
|
|
|
3015
3032
|
WriteBatch::ProtectionInfo* const prot_info_ = nullptr;
|
|
3016
3033
|
};
|
|
3017
3034
|
|
|
3018
|
-
} // namespace
|
|
3035
|
+
} // anonymous namespace
|
|
3019
3036
|
|
|
3020
3037
|
Status WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
|
|
3021
3038
|
assert(contents.size() >= WriteBatchInternal::kHeader);
|
|
@@ -77,7 +77,6 @@ struct WriteBatch::ProtectionInfo {
|
|
|
77
77
|
// WriteBatch that we don't want in the public WriteBatch interface.
|
|
78
78
|
class WriteBatchInternal {
|
|
79
79
|
public:
|
|
80
|
-
|
|
81
80
|
// WriteBatch header has an 8-byte sequence number followed by a 4-byte count.
|
|
82
81
|
static constexpr size_t kHeader = 12;
|
|
83
82
|
|
|
@@ -149,13 +148,9 @@ class WriteBatchInternal {
|
|
|
149
148
|
// This offset is only valid if the batch is not empty.
|
|
150
149
|
static size_t GetFirstOffset(WriteBatch* batch);
|
|
151
150
|
|
|
152
|
-
static Slice Contents(const WriteBatch* batch) {
|
|
153
|
-
return Slice(batch->rep_);
|
|
154
|
-
}
|
|
151
|
+
static Slice Contents(const WriteBatch* batch) { return Slice(batch->rep_); }
|
|
155
152
|
|
|
156
|
-
static size_t ByteSize(const WriteBatch* batch) {
|
|
157
|
-
return batch->rep_.size();
|
|
158
|
-
}
|
|
153
|
+
static size_t ByteSize(const WriteBatch* batch) { return batch->rep_.size(); }
|
|
159
154
|
|
|
160
155
|
static Status SetContents(WriteBatch* batch, const Slice& contents);
|
|
161
156
|
|
|
@@ -174,9 +174,10 @@ TEST_F(WriteBatchTest, Corruption) {
|
|
|
174
174
|
Slice contents = WriteBatchInternal::Contents(&batch);
|
|
175
175
|
ASSERT_OK(WriteBatchInternal::SetContents(
|
|
176
176
|
&batch, Slice(contents.data(), contents.size() - 1)));
|
|
177
|
-
ASSERT_EQ(
|
|
178
|
-
|
|
179
|
-
|
|
177
|
+
ASSERT_EQ(
|
|
178
|
+
"Put(foo, bar)@200"
|
|
179
|
+
"Corruption: bad WriteBatch Delete",
|
|
180
|
+
PrintContents(&batch));
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
TEST_F(WriteBatchTest, Append) {
|
|
@@ -184,28 +185,28 @@ TEST_F(WriteBatchTest, Append) {
|
|
|
184
185
|
WriteBatchInternal::SetSequence(&b1, 200);
|
|
185
186
|
WriteBatchInternal::SetSequence(&b2, 300);
|
|
186
187
|
ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
|
|
187
|
-
ASSERT_EQ("",
|
|
188
|
-
PrintContents(&b1));
|
|
188
|
+
ASSERT_EQ("", PrintContents(&b1));
|
|
189
189
|
ASSERT_EQ(0u, b1.Count());
|
|
190
190
|
ASSERT_OK(b2.Put("a", "va"));
|
|
191
191
|
ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
|
|
192
|
-
ASSERT_EQ("Put(a, va)@200",
|
|
193
|
-
PrintContents(&b1));
|
|
192
|
+
ASSERT_EQ("Put(a, va)@200", PrintContents(&b1));
|
|
194
193
|
ASSERT_EQ(1u, b1.Count());
|
|
195
194
|
b2.Clear();
|
|
196
195
|
ASSERT_OK(b2.Put("b", "vb"));
|
|
197
196
|
ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
|
|
198
|
-
ASSERT_EQ(
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
ASSERT_EQ(
|
|
198
|
+
"Put(a, va)@200"
|
|
199
|
+
"Put(b, vb)@201",
|
|
200
|
+
PrintContents(&b1));
|
|
201
201
|
ASSERT_EQ(2u, b1.Count());
|
|
202
202
|
ASSERT_OK(b2.Delete("foo"));
|
|
203
203
|
ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
|
|
204
|
-
ASSERT_EQ(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
ASSERT_EQ(
|
|
205
|
+
"Put(a, va)@200"
|
|
206
|
+
"Put(b, vb)@202"
|
|
207
|
+
"Put(b, vb)@201"
|
|
208
|
+
"Delete(foo)@203",
|
|
209
|
+
PrintContents(&b1));
|
|
209
210
|
ASSERT_EQ(4u, b1.Count());
|
|
210
211
|
b2.Clear();
|
|
211
212
|
ASSERT_OK(b2.Put("c", "cc"));
|
|
@@ -247,89 +248,88 @@ TEST_F(WriteBatchTest, SingleDeletion) {
|
|
|
247
248
|
}
|
|
248
249
|
|
|
249
250
|
namespace {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
return Status::OK();
|
|
261
|
-
}
|
|
262
|
-
Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
|
|
263
|
-
if (column_family_id == 0) {
|
|
264
|
-
seen += "Delete(" + key.ToString() + ")";
|
|
265
|
-
} else {
|
|
266
|
-
seen += "DeleteCF(" + std::to_string(column_family_id) + ", " +
|
|
267
|
-
key.ToString() + ")";
|
|
268
|
-
}
|
|
269
|
-
return Status::OK();
|
|
270
|
-
}
|
|
271
|
-
Status SingleDeleteCF(uint32_t column_family_id,
|
|
272
|
-
const Slice& key) override {
|
|
273
|
-
if (column_family_id == 0) {
|
|
274
|
-
seen += "SingleDelete(" + key.ToString() + ")";
|
|
275
|
-
} else {
|
|
276
|
-
seen += "SingleDeleteCF(" + std::to_string(column_family_id) + ", " +
|
|
277
|
-
key.ToString() + ")";
|
|
278
|
-
}
|
|
279
|
-
return Status::OK();
|
|
280
|
-
}
|
|
281
|
-
Status DeleteRangeCF(uint32_t column_family_id, const Slice& begin_key,
|
|
282
|
-
const Slice& end_key) override {
|
|
283
|
-
if (column_family_id == 0) {
|
|
284
|
-
seen += "DeleteRange(" + begin_key.ToString() + ", " +
|
|
285
|
-
end_key.ToString() + ")";
|
|
286
|
-
} else {
|
|
287
|
-
seen += "DeleteRangeCF(" + std::to_string(column_family_id) + ", " +
|
|
288
|
-
begin_key.ToString() + ", " + end_key.ToString() + ")";
|
|
289
|
-
}
|
|
290
|
-
return Status::OK();
|
|
291
|
-
}
|
|
292
|
-
Status MergeCF(uint32_t column_family_id, const Slice& key,
|
|
293
|
-
const Slice& value) override {
|
|
294
|
-
if (column_family_id == 0) {
|
|
295
|
-
seen += "Merge(" + key.ToString() + ", " + value.ToString() + ")";
|
|
296
|
-
} else {
|
|
297
|
-
seen += "MergeCF(" + std::to_string(column_family_id) + ", " +
|
|
298
|
-
key.ToString() + ", " + value.ToString() + ")";
|
|
299
|
-
}
|
|
300
|
-
return Status::OK();
|
|
301
|
-
}
|
|
302
|
-
void LogData(const Slice& blob) override {
|
|
303
|
-
seen += "LogData(" + blob.ToString() + ")";
|
|
304
|
-
}
|
|
305
|
-
Status MarkBeginPrepare(bool unprepare) override {
|
|
306
|
-
seen +=
|
|
307
|
-
"MarkBeginPrepare(" + std::string(unprepare ? "true" : "false") + ")";
|
|
308
|
-
return Status::OK();
|
|
309
|
-
}
|
|
310
|
-
Status MarkEndPrepare(const Slice& xid) override {
|
|
311
|
-
seen += "MarkEndPrepare(" + xid.ToString() + ")";
|
|
312
|
-
return Status::OK();
|
|
251
|
+
struct TestHandler : public WriteBatch::Handler {
|
|
252
|
+
std::string seen;
|
|
253
|
+
Status PutCF(uint32_t column_family_id, const Slice& key,
|
|
254
|
+
const Slice& value) override {
|
|
255
|
+
if (column_family_id == 0) {
|
|
256
|
+
seen += "Put(" + key.ToString() + ", " + value.ToString() + ")";
|
|
257
|
+
} else {
|
|
258
|
+
seen += "PutCF(" + std::to_string(column_family_id) + ", " +
|
|
259
|
+
key.ToString() + ", " + value.ToString() + ")";
|
|
313
260
|
}
|
|
314
|
-
Status
|
|
315
|
-
|
|
316
|
-
|
|
261
|
+
return Status::OK();
|
|
262
|
+
}
|
|
263
|
+
Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
|
|
264
|
+
if (column_family_id == 0) {
|
|
265
|
+
seen += "Delete(" + key.ToString() + ")";
|
|
266
|
+
} else {
|
|
267
|
+
seen += "DeleteCF(" + std::to_string(column_family_id) + ", " +
|
|
268
|
+
key.ToString() + ")";
|
|
317
269
|
}
|
|
318
|
-
Status
|
|
319
|
-
|
|
320
|
-
|
|
270
|
+
return Status::OK();
|
|
271
|
+
}
|
|
272
|
+
Status SingleDeleteCF(uint32_t column_family_id, const Slice& key) override {
|
|
273
|
+
if (column_family_id == 0) {
|
|
274
|
+
seen += "SingleDelete(" + key.ToString() + ")";
|
|
275
|
+
} else {
|
|
276
|
+
seen += "SingleDeleteCF(" + std::to_string(column_family_id) + ", " +
|
|
277
|
+
key.ToString() + ")";
|
|
321
278
|
}
|
|
322
|
-
Status
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
279
|
+
return Status::OK();
|
|
280
|
+
}
|
|
281
|
+
Status DeleteRangeCF(uint32_t column_family_id, const Slice& begin_key,
|
|
282
|
+
const Slice& end_key) override {
|
|
283
|
+
if (column_family_id == 0) {
|
|
284
|
+
seen += "DeleteRange(" + begin_key.ToString() + ", " +
|
|
285
|
+
end_key.ToString() + ")";
|
|
286
|
+
} else {
|
|
287
|
+
seen += "DeleteRangeCF(" + std::to_string(column_family_id) + ", " +
|
|
288
|
+
begin_key.ToString() + ", " + end_key.ToString() + ")";
|
|
326
289
|
}
|
|
327
|
-
Status
|
|
328
|
-
|
|
329
|
-
|
|
290
|
+
return Status::OK();
|
|
291
|
+
}
|
|
292
|
+
Status MergeCF(uint32_t column_family_id, const Slice& key,
|
|
293
|
+
const Slice& value) override {
|
|
294
|
+
if (column_family_id == 0) {
|
|
295
|
+
seen += "Merge(" + key.ToString() + ", " + value.ToString() + ")";
|
|
296
|
+
} else {
|
|
297
|
+
seen += "MergeCF(" + std::to_string(column_family_id) + ", " +
|
|
298
|
+
key.ToString() + ", " + value.ToString() + ")";
|
|
330
299
|
}
|
|
331
|
-
|
|
332
|
-
}
|
|
300
|
+
return Status::OK();
|
|
301
|
+
}
|
|
302
|
+
void LogData(const Slice& blob) override {
|
|
303
|
+
seen += "LogData(" + blob.ToString() + ")";
|
|
304
|
+
}
|
|
305
|
+
Status MarkBeginPrepare(bool unprepare) override {
|
|
306
|
+
seen +=
|
|
307
|
+
"MarkBeginPrepare(" + std::string(unprepare ? "true" : "false") + ")";
|
|
308
|
+
return Status::OK();
|
|
309
|
+
}
|
|
310
|
+
Status MarkEndPrepare(const Slice& xid) override {
|
|
311
|
+
seen += "MarkEndPrepare(" + xid.ToString() + ")";
|
|
312
|
+
return Status::OK();
|
|
313
|
+
}
|
|
314
|
+
Status MarkNoop(bool empty_batch) override {
|
|
315
|
+
seen += "MarkNoop(" + std::string(empty_batch ? "true" : "false") + ")";
|
|
316
|
+
return Status::OK();
|
|
317
|
+
}
|
|
318
|
+
Status MarkCommit(const Slice& xid) override {
|
|
319
|
+
seen += "MarkCommit(" + xid.ToString() + ")";
|
|
320
|
+
return Status::OK();
|
|
321
|
+
}
|
|
322
|
+
Status MarkCommitWithTimestamp(const Slice& xid, const Slice& ts) override {
|
|
323
|
+
seen += "MarkCommitWithTimestamp(" + xid.ToString() + ", " +
|
|
324
|
+
ts.ToString(true) + ")";
|
|
325
|
+
return Status::OK();
|
|
326
|
+
}
|
|
327
|
+
Status MarkRollback(const Slice& xid) override {
|
|
328
|
+
seen += "MarkRollback(" + xid.ToString() + ")";
|
|
329
|
+
return Status::OK();
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
} // anonymous namespace
|
|
333
333
|
|
|
334
334
|
TEST_F(WriteBatchTest, PutNotImplemented) {
|
|
335
335
|
WriteBatch batch;
|
|
@@ -609,24 +609,25 @@ TEST_F(WriteBatchTest, PutGatherSlices) {
|
|
|
609
609
|
{
|
|
610
610
|
// Try a write where the key is one slice but the value is two
|
|
611
611
|
Slice key_slice("baz");
|
|
612
|
-
Slice value_slices[2] = {
|
|
612
|
+
Slice value_slices[2] = {Slice("header"), Slice("payload")};
|
|
613
613
|
ASSERT_OK(
|
|
614
614
|
batch.Put(SliceParts(&key_slice, 1), SliceParts(value_slices, 2)));
|
|
615
615
|
}
|
|
616
616
|
|
|
617
617
|
{
|
|
618
618
|
// One where the key is composite but the value is a single slice
|
|
619
|
-
Slice key_slices[3] = {
|
|
619
|
+
Slice key_slices[3] = {Slice("key"), Slice("part2"), Slice("part3")};
|
|
620
620
|
Slice value_slice("value");
|
|
621
621
|
ASSERT_OK(
|
|
622
622
|
batch.Put(SliceParts(key_slices, 3), SliceParts(&value_slice, 1)));
|
|
623
623
|
}
|
|
624
624
|
|
|
625
625
|
WriteBatchInternal::SetSequence(&batch, 100);
|
|
626
|
-
ASSERT_EQ(
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
626
|
+
ASSERT_EQ(
|
|
627
|
+
"Put(baz, headerpayload)@101"
|
|
628
|
+
"Put(foo, bar)@100"
|
|
629
|
+
"Put(keypart2part3, value)@102",
|
|
630
|
+
PrintContents(&batch));
|
|
630
631
|
ASSERT_EQ(3u, batch.Count());
|
|
631
632
|
}
|
|
632
633
|
|
|
@@ -646,7 +647,7 @@ class ColumnFamilyHandleImplDummy : public ColumnFamilyHandleImpl {
|
|
|
646
647
|
uint32_t id_;
|
|
647
648
|
const Comparator* const ucmp_ = BytewiseComparator();
|
|
648
649
|
};
|
|
649
|
-
} // namespace
|
|
650
|
+
} // anonymous namespace
|
|
650
651
|
|
|
651
652
|
TEST_F(WriteBatchTest, ColumnFamiliesBatchTest) {
|
|
652
653
|
WriteBatch batch;
|
|
@@ -948,7 +949,7 @@ Status CheckTimestampsInWriteBatch(
|
|
|
948
949
|
TimestampChecker ts_checker(cf_to_ucmps, timestamp);
|
|
949
950
|
return wb.Iterate(&ts_checker);
|
|
950
951
|
}
|
|
951
|
-
} // namespace
|
|
952
|
+
} // anonymous namespace
|
|
952
953
|
|
|
953
954
|
TEST_F(WriteBatchTest, SanityChecks) {
|
|
954
955
|
ColumnFamilyHandleImplDummy cf0(0,
|
|
@@ -961,14 +962,14 @@ TEST_F(WriteBatchTest, SanityChecks) {
|
|
|
961
962
|
ASSERT_TRUE(wb.Put(nullptr, "key", "ts", "value").IsInvalidArgument());
|
|
962
963
|
ASSERT_TRUE(wb.Delete(nullptr, "key", "ts").IsInvalidArgument());
|
|
963
964
|
ASSERT_TRUE(wb.SingleDelete(nullptr, "key", "ts").IsInvalidArgument());
|
|
964
|
-
ASSERT_TRUE(wb.Merge(nullptr, "key", "ts", "value").
|
|
965
|
+
ASSERT_TRUE(wb.Merge(nullptr, "key", "ts", "value").IsInvalidArgument());
|
|
965
966
|
ASSERT_TRUE(wb.DeleteRange(nullptr, "begin_key", "end_key", "ts")
|
|
966
967
|
.IsInvalidArgument());
|
|
967
968
|
|
|
968
969
|
ASSERT_TRUE(wb.Put(&cf4, "key", "ts", "value").IsInvalidArgument());
|
|
969
970
|
ASSERT_TRUE(wb.Delete(&cf4, "key", "ts").IsInvalidArgument());
|
|
970
971
|
ASSERT_TRUE(wb.SingleDelete(&cf4, "key", "ts").IsInvalidArgument());
|
|
971
|
-
ASSERT_TRUE(wb.Merge(&cf4, "key", "ts", "value").
|
|
972
|
+
ASSERT_TRUE(wb.Merge(&cf4, "key", "ts", "value").IsInvalidArgument());
|
|
972
973
|
ASSERT_TRUE(
|
|
973
974
|
wb.DeleteRange(&cf4, "begin_key", "end_key", "ts").IsInvalidArgument());
|
|
974
975
|
|
|
@@ -978,7 +979,7 @@ TEST_F(WriteBatchTest, SanityChecks) {
|
|
|
978
979
|
ASSERT_TRUE(wb.Put(&cf0, "key", ts, "value").IsInvalidArgument());
|
|
979
980
|
ASSERT_TRUE(wb.Delete(&cf0, "key", ts).IsInvalidArgument());
|
|
980
981
|
ASSERT_TRUE(wb.SingleDelete(&cf0, "key", ts).IsInvalidArgument());
|
|
981
|
-
ASSERT_TRUE(wb.Merge(&cf0, "key", ts, "value").
|
|
982
|
+
ASSERT_TRUE(wb.Merge(&cf0, "key", ts, "value").IsInvalidArgument());
|
|
982
983
|
ASSERT_TRUE(
|
|
983
984
|
wb.DeleteRange(&cf0, "begin_key", "end_key", ts).IsInvalidArgument());
|
|
984
985
|
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
#ifndef ROCKSDB_LITE
|
|
7
7
|
|
|
8
|
+
#include "db/write_callback.h"
|
|
9
|
+
|
|
8
10
|
#include <atomic>
|
|
9
11
|
#include <functional>
|
|
10
12
|
#include <string>
|
|
@@ -12,7 +14,6 @@
|
|
|
12
14
|
#include <vector>
|
|
13
15
|
|
|
14
16
|
#include "db/db_impl/db_impl.h"
|
|
15
|
-
#include "db/write_callback.h"
|
|
16
17
|
#include "port/port.h"
|
|
17
18
|
#include "rocksdb/db.h"
|
|
18
19
|
#include "rocksdb/write_batch.h"
|
|
@@ -37,11 +38,11 @@ class WriteCallbackTestWriteCallback1 : public WriteCallback {
|
|
|
37
38
|
public:
|
|
38
39
|
bool was_called = false;
|
|
39
40
|
|
|
40
|
-
Status Callback(DB
|
|
41
|
+
Status Callback(DB* db) override {
|
|
41
42
|
was_called = true;
|
|
42
43
|
|
|
43
44
|
// Make sure db is a DBImpl
|
|
44
|
-
DBImpl* db_impl = dynamic_cast<DBImpl*>
|
|
45
|
+
DBImpl* db_impl = dynamic_cast<DBImpl*>(db);
|
|
45
46
|
if (db_impl == nullptr) {
|
|
46
47
|
return Status::InvalidArgument("");
|
|
47
48
|
}
|
|
@@ -397,7 +398,7 @@ TEST_F(WriteCallbackTest, WriteCallBackTest) {
|
|
|
397
398
|
Status s = DB::Open(options, dbname, &db);
|
|
398
399
|
ASSERT_OK(s);
|
|
399
400
|
|
|
400
|
-
db_impl = dynamic_cast<DBImpl*>
|
|
401
|
+
db_impl = dynamic_cast<DBImpl*>(db);
|
|
401
402
|
ASSERT_TRUE(db_impl);
|
|
402
403
|
|
|
403
404
|
WriteBatch wb;
|
|
@@ -20,7 +20,7 @@ class TimeSetClock : public SystemClockWrapper {
|
|
|
20
20
|
uint64_t now_micros_ = 6666;
|
|
21
21
|
uint64_t NowNanos() override { return now_micros_ * std::milli::den; }
|
|
22
22
|
};
|
|
23
|
-
} // namespace
|
|
23
|
+
} // anonymous namespace
|
|
24
24
|
class WriteControllerTest : public testing::Test {
|
|
25
25
|
public:
|
|
26
26
|
WriteControllerTest() { clock_ = std::make_shared<TimeSetClock>(); }
|
|
@@ -397,8 +397,9 @@ void WriteThread::JoinBatchGroup(Writer* w) {
|
|
|
397
397
|
* writes in parallel.
|
|
398
398
|
*/
|
|
399
399
|
TEST_SYNC_POINT_CALLBACK("WriteThread::JoinBatchGroup:BeganWaiting", w);
|
|
400
|
-
AwaitState(w,
|
|
401
|
-
|
|
400
|
+
AwaitState(w,
|
|
401
|
+
STATE_GROUP_LEADER | STATE_MEMTABLE_WRITER_LEADER |
|
|
402
|
+
STATE_PARALLEL_MEMTABLE_WRITER | STATE_COMPLETED,
|
|
402
403
|
&jbg_ctx);
|
|
403
404
|
TEST_SYNC_POINT_CALLBACK("WriteThread::JoinBatchGroup:DoneWaiting", w);
|
|
404
405
|
}
|
|
@@ -595,10 +596,10 @@ void WriteThread::LaunchParallelMemTableWriters(WriteGroup* write_group) {
|
|
|
595
596
|
}
|
|
596
597
|
}
|
|
597
598
|
|
|
598
|
-
static WriteThread::AdaptationContext cpmtw_ctx(
|
|
599
|
+
static WriteThread::AdaptationContext cpmtw_ctx(
|
|
600
|
+
"CompleteParallelMemTableWriter");
|
|
599
601
|
// This method is called by both the leader and parallel followers
|
|
600
602
|
bool WriteThread::CompleteParallelMemTableWriter(Writer* w) {
|
|
601
|
-
|
|
602
603
|
auto* write_group = w->write_group;
|
|
603
604
|
if (!w->status.ok()) {
|
|
604
605
|
std::lock_guard<std::mutex> guard(write_group->leader->StateMutex());
|
|
@@ -718,8 +719,9 @@ void WriteThread::ExitAsBatchGroupLeader(WriteGroup& write_group,
|
|
|
718
719
|
SetState(new_leader, STATE_GROUP_LEADER);
|
|
719
720
|
}
|
|
720
721
|
|
|
721
|
-
AwaitState(leader,
|
|
722
|
-
|
|
722
|
+
AwaitState(leader,
|
|
723
|
+
STATE_MEMTABLE_WRITER_LEADER | STATE_PARALLEL_MEMTABLE_WRITER |
|
|
724
|
+
STATE_COMPLETED,
|
|
723
725
|
&eabgl_ctx);
|
|
724
726
|
} else {
|
|
725
727
|
Writer* head = newest_writer_.load(std::memory_order_acquire);
|
|
@@ -35,6 +35,12 @@
|
|
|
35
35
|
#define POSIX_FADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */
|
|
36
36
|
#define POSIX_FADV_WILLNEED 3 /* [MC1] will need these pages */
|
|
37
37
|
#define POSIX_FADV_DONTNEED 4 /* [MC1] don't need these pages */
|
|
38
|
+
|
|
39
|
+
#define POSIX_MADV_NORMAL 0 /* [MC1] no further special treatment */
|
|
40
|
+
#define POSIX_MADV_RANDOM 1 /* [MC1] expect random page refs */
|
|
41
|
+
#define POSIX_MADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */
|
|
42
|
+
#define POSIX_MADV_WILLNEED 3 /* [MC1] will need these pages */
|
|
43
|
+
#define POSIX_MADV_DONTNEED 4 /* [MC1] don't need these pages */
|
|
38
44
|
#endif
|
|
39
45
|
|
|
40
46
|
namespace ROCKSDB_NAMESPACE {
|