Detect long config lock acquisition in mmp
If something holds the config lock as a writer for too long, MMP will fail to issue MMP writes in a timely manner. This will result either in the pool being suspended, or in an extreme case, in the pool not being protected. If the time to acquire the config lock exceeds 1/10 of the minimum zfs_multihost_interval, report it in the zfs debug log. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Olaf Faaland <faaland1@llnl.gov> Closes #7212
This commit is contained in:
parent
8d7f17798d
commit
c17922b8a9
|
@ -323,7 +323,13 @@ mmp_write_uberblock(spa_t *spa)
|
||||||
int label;
|
int label;
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
|
|
||||||
|
hrtime_t lock_acquire_time = gethrtime();
|
||||||
spa_config_enter(spa, SCL_STATE, mmp_tag, RW_READER);
|
spa_config_enter(spa, SCL_STATE, mmp_tag, RW_READER);
|
||||||
|
lock_acquire_time = gethrtime() - lock_acquire_time;
|
||||||
|
if (lock_acquire_time > (MSEC2NSEC(MMP_MIN_INTERVAL) / 10))
|
||||||
|
zfs_dbgmsg("SCL_STATE acquisition took %llu ns\n",
|
||||||
|
(u_longlong_t)lock_acquire_time);
|
||||||
|
|
||||||
vd = mmp_random_leaf(spa->spa_root_vdev);
|
vd = mmp_random_leaf(spa->spa_root_vdev);
|
||||||
if (vd == NULL) {
|
if (vd == NULL) {
|
||||||
spa_config_exit(spa, SCL_STATE, FTAG);
|
spa_config_exit(spa, SCL_STATE, FTAG);
|
||||||
|
|
Loading…
Reference in New Issue