From: wanghongxu Date: Wed, 15 Apr 2020 11:52:40 +0000 (+0800) Subject: bluestore: Support flock retry X-Git-Tag: v16.1.0~1300^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=23f8c323d2ba9133c3ef5834ae93115425c862d1;p=ceph.git bluestore: Support flock retry When the block changes, systemd-udevd will open the block, read some information and close it. Then a failure occurs here. So we need to try again here. Fixes: https://tracker.ceph.com/issues/46124 Signed-off-by: wanghongxu --- diff --git a/src/blk/kernel/KernelDevice.cc b/src/blk/kernel/KernelDevice.cc index a2d920d0214..0aa4dd01d30 100644 --- a/src/blk/kernel/KernelDevice.cc +++ b/src/blk/kernel/KernelDevice.cc @@ -85,12 +85,25 @@ KernelDevice::KernelDevice(CephContext* cct, aio_callback_t cb, void *cbpriv, ai int KernelDevice::_lock() { dout(10) << __func__ << " " << fd_directs[WRITE_LIFE_NOT_SET] << dendl; - int r = ::flock(fd_directs[WRITE_LIFE_NOT_SET], LOCK_EX | LOCK_NB); - if (r < 0) { - derr << __func__ << " flock failed on " << path << dendl; - return -errno; + utime_t sleeptime; + sleeptime.set_from_double(cct->_conf->bdev_flock_retry_interval); + + // When the block changes, systemd-udevd will open the block, + // read some information and close it. Then a failure occurs here. + // So we need to try again here. + for (int i = 0; i < cct->_conf->bdev_flock_retry + 1; i++) { + int r = ::flock(fd_directs[WRITE_LIFE_NOT_SET], LOCK_EX | LOCK_NB); + if (r < 0 && errno == EAGAIN) { + dout(1) << __func__ << " flock busy on " << path << dendl; + sleeptime.sleep(); + } else if (r < 0) { + derr << __func__ << " flock failed on " << path << dendl; + break; + } else { + return 0; + } } - return 0; + return -errno; } int KernelDevice::open(const string& p) diff --git a/src/common/legacy_config_opts.h b/src/common/legacy_config_opts.h index 7e7b77ccfd6..fb7880376de 100644 --- a/src/common/legacy_config_opts.h +++ b/src/common/legacy_config_opts.h @@ -898,6 +898,8 @@ OPTION(bdev_nvme_unbind_from_kernel, OPT_BOOL) OPTION(bdev_nvme_retry_count, OPT_INT) // -1 means by default which is 4 OPTION(bdev_enable_discard, OPT_BOOL) OPTION(bdev_async_discard, OPT_BOOL) +OPTION(bdev_flock_retry_interval, OPT_FLOAT) +OPTION(bdev_flock_retry, OPT_INT) OPTION(objectstore_blackhole, OPT_BOOL) diff --git a/src/common/options.cc b/src/common/options.cc index d00414625f5..4160cab9b5d 100644 --- a/src/common/options.cc +++ b/src/common/options.cc @@ -3988,6 +3988,14 @@ std::vector