]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
librbd: Read request need exclusive-lock when enable pwl-cache. 43038/head
authorJianpeng Ma <jianpeng.ma@intel.com>
Wed, 8 Sep 2021 01:51:19 +0000 (09:51 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Wed, 8 Sep 2021 01:51:19 +0000 (09:51 +0800)
commit621facb6e66ce92ca36d566c78bc065a9666639e
tree6125dc02041c5eda6d2fe43f58ae9753896a03b7
parentd72b1716d91ff80ff74b9b44ff3742867c1f0816
librbd: Read request need exclusive-lock when enable  pwl-cache.

TestLibRBD.TestFUA descript the following workload:
a)write/read the same image w/ pwl-cache
  write_image = open(image_name);
  read_image  = open(image_name);
b)i/o workload is:
   write(write_image)
      write need EXLock and require EXLOCK

  read(read_image)
     in ExclusiveLock<I>::init(), firstly read need EXLOCK
     so will require EXLOCK. write_image release EXLOCK(will
     flush data to osd and remove cache). read_image init pwl-cache
     and read-io firstly enter pwl-cache and missed and then read
     from osd.

   write(write_image)
     write need EXLOCK and require EXLOCK. This make read_image remove
     empty cache. write_image init cache pool and write data to cache.

   read(read_image)
       In send_set_require_lock(), it set write need EXLOCK.
       So read don't require EXLOCK and dirtyly read from osd.

Because second-read  don't need EXLOCK and make write_image don't
release EXLOCK(flush dirty data to osd and  shutdown pwl-cache).
This make second-read don't read the latest data.

So we should make read also need EXLOCK when enable pwl-cache.

Fixes: https://tracker.ceph.com/issues/51438
Tested-by: Feng Hualong <hualong.feng@intel.com>
Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/librbd/exclusive_lock/PreReleaseRequest.cc
src/test/librbd/exclusive_lock/test_mock_PreReleaseRequest.cc