]> granicus.if.org Git - zfs/commitdiff
Detect long config lock acquisition in mmp
authorOlaf Faaland <faaland1@llnl.gov>
Wed, 21 Feb 2018 01:33:51 +0000 (17:33 -0800)
committerTony Hutter <hutter2@llnl.gov>
Wed, 14 Mar 2018 23:10:38 +0000 (16:10 -0700)
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

module/zfs/mmp.c

index ee8e9201bfb8a21a9723746096ed3f4f481d1b38..634e482879456c0fceb6ae2f70b9456bf5c968a4 100644 (file)
@@ -323,7 +323,13 @@ mmp_write_uberblock(spa_t *spa)
        int label;
        uint64_t offset;
 
+       hrtime_t lock_acquire_time = gethrtime();
        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);
        if (vd == NULL) {
                spa_config_exit(spa, SCL_STATE, FTAG);