From d03498175d3f2988369d7ded4574848d296c6f3c Mon Sep 17 00:00:00 2001 From: Akanksha Mahajan Date: Wed, 21 Sep 2022 14:21:59 -0700 Subject: [PATCH] Fix sqe->addr passed in cancel request in io_uring (#10644) Summary: Update io_uring_prep_cancel as it is now backward compatible. Also, io_uring_prep_cancel expects sqe->addr to match with read request submitted. It's being set wrong which is now fixed in this PR. Pull Request resolved: https://github.com/facebook/rocksdb/pull/10644 Test Plan: - Ran internally with lastest liburing package and on RocksDB github repo with older version. - Ran seekrandom regression to confirm there is no regression. Reviewed By: anand1976 Differential Revision: D39284229 Pulled By: akankshamahajan15 fbshipit-source-id: fd52cdf23d676da114896163626b75c8ae09c980 --- HISTORY.md | 2 ++ env/fs_posix.cc | 10 ++++++---- env/io_posix.cc | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 7e78c40711c..a873b552068 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,5 @@ # Rocksdb Change Log + ## 7.7.0 (09/18/2022) ### Bug Fixes * Fixed a hang when an operation such as `GetLiveFiles` or `CreateNewBackup` is asked to trigger and wait for memtable flush on a read-only DB. Such indirect requests for memtable flush are now ignored on a read-only DB. @@ -10,6 +11,7 @@ * Fix a bug in key range overlap checking with concurrent compactions when user-defined timestamp is enabled. User-defined timestamps should be EXCLUDED when checking if two ranges overlap. * Fixed a bug where the blob cache prepopulating logic did not consider the secondary cache (see #10603). * Fixed the rocksdb.num.sst.read.per.level, rocksdb.num.index.and.filter.blocks.read.per.level and rocksdb.num.level.read.per.multiget stats in the MultiGet coroutines +* Fix a bug in io_uring_prep_cancel in AbortIO API for posix which expects sqe->addr to match with read request submitted and wrong paramter was being passed. ### Public API changes * Add `rocksdb_column_family_handle_get_id`, `rocksdb_column_family_handle_get_name` to get name, id of column family in C API diff --git a/env/fs_posix.cc b/env/fs_posix.cc index e1b1400d0a1..a6f7b9c083d 100644 --- a/env/fs_posix.cc +++ b/env/fs_posix.cc @@ -1115,10 +1115,11 @@ class PosixFileSystem : public FileSystem { // Prepare the cancel request. struct io_uring_sqe* sqe; sqe = io_uring_get_sqe(iu); - // prep_cancel changed API in liburing, but we need to support both old - // and new versions so do it by hand - io_uring_prep_cancel(sqe, 0, 0); - sqe->addr = reinterpret_cast(posix_handle); + + // In order to cancel the request, sqe->addr of cancel request should + // match with the read request submitted which is posix_handle->iov. + io_uring_prep_cancel(sqe, &posix_handle->iov, 0); + // Sets sqe->user_data to posix_handle. io_uring_sqe_set_data(sqe, posix_handle); // submit the request. @@ -1146,6 +1147,7 @@ class PosixFileSystem : public FileSystem { } assert(cqe != nullptr); + // Returns cqe->user_data. Posix_IOHandle* posix_handle = static_cast(io_uring_cqe_get_data(cqe)); assert(posix_handle->iu == iu); diff --git a/env/io_posix.cc b/env/io_posix.cc index 7a23f9e54fb..59a94acd46d 100644 --- a/env/io_posix.cc +++ b/env/io_posix.cc @@ -899,8 +899,10 @@ IOStatus PosixRandomAccessFile::ReadAsync( struct io_uring_sqe* sqe; sqe = io_uring_get_sqe(iu); - io_uring_prep_readv(sqe, fd_, &posix_handle->iov, 1, posix_handle->offset); + io_uring_prep_readv(sqe, fd_, /*sqe->addr=*/&posix_handle->iov, + /*sqe->len=*/1, /*sqe->offset=*/posix_handle->offset); + // Sets sqe->user_data to posix_handle. io_uring_sqe_set_data(sqe, posix_handle); // Step 4: io_uring_submit