@nxtedition/rocksdb 15.1.2 → 15.1.4
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/.claude/settings.local.json +15 -0
- package/binding.cc +79 -38
- package/build.sh +1 -2
- package/deps/rocksdb/rocksdb/BUCK +10 -8
- package/deps/rocksdb/rocksdb/CMakeLists.txt +27 -2
- package/deps/rocksdb/rocksdb/Makefile +27 -116
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +101 -124
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +47 -30
- package/deps/rocksdb/rocksdb/db/c.cc +793 -131
- package/deps/rocksdb/rocksdb/db/c_test.c +571 -0
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +226 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +95 -59
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +45 -35
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +47 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +82 -0
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +69 -24
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +9 -1
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +65 -0
- package/deps/rocksdb/rocksdb/db/db_etc3_test.cc +161 -0
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +20 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +13 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +114 -39
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +3 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +39 -25
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +361 -0
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +83 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +249 -4
- package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/listener_test.cc +7 -17
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +41 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +7 -4
- package/deps/rocksdb/rocksdb/db/version_set.cc +299 -90
- package/deps/rocksdb/rocksdb/db/version_set.h +56 -9
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +41 -39
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +7 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +48 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +5 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +16 -5
- package/deps/rocksdb/rocksdb/env/env_test.cc +126 -41
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +14 -7
- package/deps/rocksdb/rocksdb/env/io_posix.cc +304 -112
- package/deps/rocksdb/rocksdb/env/io_posix.h +16 -4
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
- package/deps/rocksdb/rocksdb/folly.mk +148 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +29 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +73 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +246 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +15 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +19 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +67 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +1 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +6 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +8 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +0 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +33 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +2 -0
- package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +5 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +6 -6
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +2 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +10 -5
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +15 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +7 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +27 -36
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -2
- package/deps/rocksdb/rocksdb/options/options.cc +4 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +19 -3
- package/deps/rocksdb/rocksdb/src.mk +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +155 -32
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +7 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +169 -125
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +22 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +43 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +9 -8
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +17 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +15 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +13 -18
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +29 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +15 -0
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +79 -19
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +48 -20
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +51 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +19 -0
- package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +1 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +3 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +3 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
- package/deps/rocksdb/rocksdb/table/table_reader.h +4 -2
- package/deps/rocksdb/rocksdb/table/table_test.cc +48 -39
- package/deps/rocksdb/rocksdb/test_util/sync_point.cc +4 -0
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +32 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +14 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +3 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +63 -12
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +16 -1
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +5 -1
- package/deps/rocksdb/rocksdb/util/bit_fields.h +133 -23
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +2 -5
- package/deps/rocksdb/rocksdb/util/compression.cc +51 -23
- package/deps/rocksdb/rocksdb/util/compression_test.cc +525 -270
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +3 -4
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +11 -2
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -1
- package/deps/rocksdb/rocksdb/util/slice_test.cc +92 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -2
- package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +19 -2
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +75 -0
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +303 -111
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +379 -0
- package/deps/rocksdb/rocksdb.gyp +1 -0
- package/iterator.js +66 -70
- package/package.json +6 -6
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/deps/rocksdb/rocksdb/table/block_based/index_builder_test.cc +0 -183
|
@@ -1655,42 +1655,6 @@ void GenerateFilesAndRequest(Env* env, const std::string& fname,
|
|
|
1655
1655
|
}
|
|
1656
1656
|
}
|
|
1657
1657
|
|
|
1658
|
-
TEST_F(EnvPosixTest, MultiReadIOUringError) {
|
|
1659
|
-
// In this test we don't do aligned read, so we can't do direct I/O.
|
|
1660
|
-
EnvOptions soptions;
|
|
1661
|
-
soptions.use_direct_reads = soptions.use_direct_writes = false;
|
|
1662
|
-
std::string fname = test::PerThreadDBPath(env_, "testfile");
|
|
1663
|
-
|
|
1664
|
-
std::vector<std::string> scratches;
|
|
1665
|
-
std::vector<ReadRequest> reqs;
|
|
1666
|
-
GenerateFilesAndRequest(env_, fname, &reqs, &scratches);
|
|
1667
|
-
// Query the data
|
|
1668
|
-
std::unique_ptr<RandomAccessFile> file;
|
|
1669
|
-
ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
|
|
1670
|
-
|
|
1671
|
-
bool io_uring_wait_cqe_called = false;
|
|
1672
|
-
SyncPoint::GetInstance()->SetCallBack(
|
|
1673
|
-
"PosixRandomAccessFile::MultiRead:io_uring_wait_cqe:return",
|
|
1674
|
-
[&](void* arg) {
|
|
1675
|
-
if (!io_uring_wait_cqe_called) {
|
|
1676
|
-
io_uring_wait_cqe_called = true;
|
|
1677
|
-
ssize_t& ret = *(static_cast<ssize_t*>(arg));
|
|
1678
|
-
ret = 1;
|
|
1679
|
-
}
|
|
1680
|
-
});
|
|
1681
|
-
SyncPoint::GetInstance()->EnableProcessing();
|
|
1682
|
-
|
|
1683
|
-
Status s = file->MultiRead(reqs.data(), reqs.size());
|
|
1684
|
-
if (io_uring_wait_cqe_called) {
|
|
1685
|
-
ASSERT_NOK(s);
|
|
1686
|
-
} else {
|
|
1687
|
-
s.PermitUncheckedError();
|
|
1688
|
-
}
|
|
1689
|
-
|
|
1690
|
-
SyncPoint::GetInstance()->DisableProcessing();
|
|
1691
|
-
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
1692
|
-
}
|
|
1693
|
-
|
|
1694
1658
|
TEST_F(EnvPosixTest, MultiReadIOUringError2) {
|
|
1695
1659
|
// In this test we don't do aligned read, so we can't do direct I/O.
|
|
1696
1660
|
EnvOptions soptions;
|
|
@@ -1706,19 +1670,20 @@ TEST_F(EnvPosixTest, MultiReadIOUringError2) {
|
|
|
1706
1670
|
|
|
1707
1671
|
bool io_uring_submit_and_wait_called = false;
|
|
1708
1672
|
SyncPoint::GetInstance()->SetCallBack(
|
|
1709
|
-
"PosixRandomAccessFile::MultiRead:
|
|
1673
|
+
"PosixRandomAccessFile::MultiRead:io_uring_sq_ready:return1",
|
|
1710
1674
|
[&](void* arg) {
|
|
1711
1675
|
io_uring_submit_and_wait_called = true;
|
|
1712
|
-
|
|
1713
|
-
|
|
1676
|
+
unsigned* ret = static_cast<unsigned*>(arg);
|
|
1677
|
+
*ret = 1;
|
|
1714
1678
|
});
|
|
1715
1679
|
SyncPoint::GetInstance()->SetCallBack(
|
|
1716
1680
|
"PosixRandomAccessFile::MultiRead:io_uring_submit_and_wait:return2",
|
|
1717
1681
|
[&](void* arg) {
|
|
1718
1682
|
struct io_uring* iu = static_cast<struct io_uring*>(arg);
|
|
1719
1683
|
struct io_uring_cqe* cqe;
|
|
1720
|
-
|
|
1721
|
-
|
|
1684
|
+
// CQ should be empty after drain - peek should fail
|
|
1685
|
+
int ret = io_uring_peek_cqe(iu, &cqe);
|
|
1686
|
+
assert(-EAGAIN == ret); // No CQEs available
|
|
1722
1687
|
});
|
|
1723
1688
|
SyncPoint::GetInstance()->EnableProcessing();
|
|
1724
1689
|
|
|
@@ -3640,6 +3605,126 @@ TEST_F(TestAsyncRead, ReadAsync) {
|
|
|
3640
3605
|
}
|
|
3641
3606
|
}
|
|
3642
3607
|
|
|
3608
|
+
// Test ReadAsync -> MultiRead -> Poll with real io_uring (not mock).
|
|
3609
|
+
// This verifies that MultiRead doesn't interfere with async read buffers.
|
|
3610
|
+
TEST_F(TestAsyncRead, InterleavingIOUringOperations) {
|
|
3611
|
+
#if defined(ROCKSDB_IOURING_PRESENT)
|
|
3612
|
+
// Use the real filesystem directly (not the mock ReadAsyncFS).
|
|
3613
|
+
std::shared_ptr<FileSystem> fs = env_->GetFileSystem();
|
|
3614
|
+
std::string fname = test::PerThreadDBPath(env_, "testfile_iouring");
|
|
3615
|
+
|
|
3616
|
+
constexpr size_t kSectorSize = 4096;
|
|
3617
|
+
constexpr size_t kNumSectors = 8;
|
|
3618
|
+
|
|
3619
|
+
// 1. Create & write to a file.
|
|
3620
|
+
{
|
|
3621
|
+
std::unique_ptr<FSWritableFile> wfile;
|
|
3622
|
+
ASSERT_OK(
|
|
3623
|
+
fs->NewWritableFile(fname, FileOptions(), &wfile, nullptr /*dbg*/));
|
|
3624
|
+
|
|
3625
|
+
for (size_t i = 0; i < kNumSectors; ++i) {
|
|
3626
|
+
auto data = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
|
|
3627
|
+
Slice slice(data.get(), kSectorSize);
|
|
3628
|
+
ASSERT_OK(wfile->Append(slice, IOOptions(), nullptr));
|
|
3629
|
+
}
|
|
3630
|
+
ASSERT_OK(wfile->Close(IOOptions(), nullptr));
|
|
3631
|
+
}
|
|
3632
|
+
|
|
3633
|
+
// 2. Test interleaved ReadAsync and MultiRead operations.
|
|
3634
|
+
{
|
|
3635
|
+
std::unique_ptr<FSRandomAccessFile> file;
|
|
3636
|
+
ASSERT_OK(fs->NewRandomAccessFile(fname, FileOptions(), &file, nullptr));
|
|
3637
|
+
|
|
3638
|
+
IOOptions opts;
|
|
3639
|
+
std::vector<void*> io_handles(kNumSectors);
|
|
3640
|
+
std::vector<FSReadRequest> async_reqs(kNumSectors);
|
|
3641
|
+
std::vector<std::unique_ptr<char, Deleter>> async_data;
|
|
3642
|
+
std::vector<size_t> vals;
|
|
3643
|
+
IOHandleDeleter del_fn;
|
|
3644
|
+
|
|
3645
|
+
// Initialize async read requests.
|
|
3646
|
+
for (size_t i = 0; i < kNumSectors; i++) {
|
|
3647
|
+
async_reqs[i].offset = i * kSectorSize;
|
|
3648
|
+
async_reqs[i].len = kSectorSize;
|
|
3649
|
+
async_data.emplace_back(NewAligned(kSectorSize, 0));
|
|
3650
|
+
async_reqs[i].scratch = async_data.back().get();
|
|
3651
|
+
vals.push_back(i);
|
|
3652
|
+
}
|
|
3653
|
+
|
|
3654
|
+
// Callback function for async reads.
|
|
3655
|
+
std::function<void(FSReadRequest&, void*)> callback =
|
|
3656
|
+
[&](FSReadRequest& req, void* cb_arg) {
|
|
3657
|
+
assert(cb_arg != nullptr);
|
|
3658
|
+
size_t i = *(reinterpret_cast<size_t*>(cb_arg));
|
|
3659
|
+
async_reqs[i].offset = req.offset;
|
|
3660
|
+
async_reqs[i].result = req.result;
|
|
3661
|
+
async_reqs[i].status = req.status;
|
|
3662
|
+
};
|
|
3663
|
+
|
|
3664
|
+
// Submit asynchronous read requests.
|
|
3665
|
+
for (size_t i = 0; i < kNumSectors; i++) {
|
|
3666
|
+
void* cb_arg = static_cast<void*>(&(vals[i]));
|
|
3667
|
+
IOStatus s = file->ReadAsync(async_reqs[i], opts, callback, cb_arg,
|
|
3668
|
+
&(io_handles[i]), &del_fn, nullptr);
|
|
3669
|
+
if (s.IsNotSupported()) {
|
|
3670
|
+
// io_uring not supported on this system, skip the test.
|
|
3671
|
+
fprintf(stderr, "Skipping test - io_uring not supported: %s\n",
|
|
3672
|
+
s.ToString().c_str());
|
|
3673
|
+
for (size_t j = 0; j < i; j++) {
|
|
3674
|
+
if (io_handles[j] != nullptr) {
|
|
3675
|
+
del_fn(io_handles[j]);
|
|
3676
|
+
}
|
|
3677
|
+
}
|
|
3678
|
+
return;
|
|
3679
|
+
}
|
|
3680
|
+
// For any other error, fail the test.
|
|
3681
|
+
ASSERT_OK(s);
|
|
3682
|
+
}
|
|
3683
|
+
|
|
3684
|
+
// Do a MultiRead on same sectors while async reads are submitted.
|
|
3685
|
+
std::vector<FSReadRequest> multi_reqs(kNumSectors);
|
|
3686
|
+
std::vector<std::unique_ptr<char, Deleter>> multi_data;
|
|
3687
|
+
for (size_t i = 0; i < kNumSectors; i++) {
|
|
3688
|
+
multi_reqs[i].offset = i * kSectorSize;
|
|
3689
|
+
multi_reqs[i].len = kSectorSize;
|
|
3690
|
+
multi_data.emplace_back(NewAligned(kSectorSize, 0));
|
|
3691
|
+
multi_reqs[i].scratch = multi_data.back().get();
|
|
3692
|
+
}
|
|
3693
|
+
ASSERT_OK(file->MultiRead(multi_reqs.data(), kNumSectors, opts, nullptr));
|
|
3694
|
+
|
|
3695
|
+
// Check the status of MultiRead requests (should all succeed).
|
|
3696
|
+
for (size_t i = 0; i < kNumSectors; i++) {
|
|
3697
|
+
auto buf = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
|
|
3698
|
+
Slice expected_data(buf.get(), kSectorSize);
|
|
3699
|
+
|
|
3700
|
+
ASSERT_EQ(multi_reqs[i].offset, i * kSectorSize);
|
|
3701
|
+
ASSERT_OK(multi_reqs[i].status);
|
|
3702
|
+
ASSERT_EQ(expected_data.ToString(), multi_reqs[i].result.ToString());
|
|
3703
|
+
}
|
|
3704
|
+
|
|
3705
|
+
// Poll for the submitted async requests.
|
|
3706
|
+
ASSERT_OK(fs->Poll(io_handles, kNumSectors));
|
|
3707
|
+
|
|
3708
|
+
// Check the status of async read requests (should all succeed).
|
|
3709
|
+
for (size_t i = 0; i < kNumSectors; i++) {
|
|
3710
|
+
auto buf = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
|
|
3711
|
+
Slice expected_data(buf.get(), kSectorSize);
|
|
3712
|
+
|
|
3713
|
+
ASSERT_EQ(async_reqs[i].offset, i * kSectorSize);
|
|
3714
|
+
ASSERT_OK(async_reqs[i].status);
|
|
3715
|
+
ASSERT_EQ(expected_data.ToString(), async_reqs[i].result.ToString());
|
|
3716
|
+
}
|
|
3717
|
+
|
|
3718
|
+
// Delete io_handles.
|
|
3719
|
+
for (size_t i = 0; i < io_handles.size(); i++) {
|
|
3720
|
+
del_fn(io_handles[i]);
|
|
3721
|
+
}
|
|
3722
|
+
}
|
|
3723
|
+
#else
|
|
3724
|
+
fprintf(stderr, "Skipping test - ROCKSDB_IOURING_PRESENT not defined\n");
|
|
3725
|
+
#endif
|
|
3726
|
+
}
|
|
3727
|
+
|
|
3643
3728
|
struct StaticDestructionTester {
|
|
3644
3729
|
bool activated = false;
|
|
3645
3730
|
~StaticDestructionTester() {
|
|
@@ -270,7 +270,10 @@ class PosixFileSystem : public FileSystem {
|
|
|
270
270
|
options
|
|
271
271
|
#if defined(ROCKSDB_IOURING_PRESENT)
|
|
272
272
|
,
|
|
273
|
-
!IsIOUringEnabled() ? nullptr
|
|
273
|
+
!IsIOUringEnabled() ? nullptr
|
|
274
|
+
: thread_local_async_read_io_urings_.get(),
|
|
275
|
+
!IsIOUringEnabled() ? nullptr
|
|
276
|
+
: thread_local_multi_read_io_urings_.get()
|
|
274
277
|
#endif
|
|
275
278
|
));
|
|
276
279
|
}
|
|
@@ -1087,8 +1090,9 @@ class PosixFileSystem : public FileSystem {
|
|
|
1087
1090
|
#if defined(ROCKSDB_IOURING_PRESENT)
|
|
1088
1091
|
// io_uring_queue_init.
|
|
1089
1092
|
struct io_uring* iu = nullptr;
|
|
1090
|
-
if (
|
|
1091
|
-
iu = static_cast<struct io_uring*>(
|
|
1093
|
+
if (thread_local_async_read_io_urings_) {
|
|
1094
|
+
iu = static_cast<struct io_uring*>(
|
|
1095
|
+
thread_local_async_read_io_urings_->Get());
|
|
1092
1096
|
}
|
|
1093
1097
|
|
|
1094
1098
|
// Init failed, platform doesn't support io_uring.
|
|
@@ -1161,8 +1165,9 @@ class PosixFileSystem : public FileSystem {
|
|
|
1161
1165
|
#if defined(ROCKSDB_IOURING_PRESENT)
|
|
1162
1166
|
// io_uring_queue_init.
|
|
1163
1167
|
struct io_uring* iu = nullptr;
|
|
1164
|
-
if (
|
|
1165
|
-
iu = static_cast<struct io_uring*>(
|
|
1168
|
+
if (thread_local_async_read_io_urings_) {
|
|
1169
|
+
iu = static_cast<struct io_uring*>(
|
|
1170
|
+
thread_local_async_read_io_urings_->Get());
|
|
1166
1171
|
}
|
|
1167
1172
|
|
|
1168
1173
|
// Init failed, platform doesn't support io_uring.
|
|
@@ -1277,7 +1282,8 @@ class PosixFileSystem : public FileSystem {
|
|
|
1277
1282
|
|
|
1278
1283
|
#if defined(ROCKSDB_IOURING_PRESENT)
|
|
1279
1284
|
// io_uring instance
|
|
1280
|
-
std::unique_ptr<ThreadLocalPtr>
|
|
1285
|
+
std::unique_ptr<ThreadLocalPtr> thread_local_async_read_io_urings_;
|
|
1286
|
+
std::unique_ptr<ThreadLocalPtr> thread_local_multi_read_io_urings_;
|
|
1281
1287
|
#endif
|
|
1282
1288
|
|
|
1283
1289
|
size_t page_size_;
|
|
@@ -1337,7 +1343,8 @@ PosixFileSystem::PosixFileSystem()
|
|
|
1337
1343
|
// io_uring can be created.
|
|
1338
1344
|
struct io_uring* new_io_uring = CreateIOUring();
|
|
1339
1345
|
if (new_io_uring != nullptr) {
|
|
1340
|
-
|
|
1346
|
+
thread_local_async_read_io_urings_.reset(new ThreadLocalPtr(DeleteIOUring));
|
|
1347
|
+
thread_local_multi_read_io_urings_.reset(new ThreadLocalPtr(DeleteIOUring));
|
|
1341
1348
|
delete new_io_uring;
|
|
1342
1349
|
}
|
|
1343
1350
|
#endif
|