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:
Olaf Faaland 2018-02-20 17:33:51 -08:00 committed by Tony Hutter
parent 8d7f17798d
commit c17922b8a9
1 changed files with 6 additions and 0 deletions

View File

@ -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);