Whamcloud - gitweb
LU-13296 obd: make statfs cache working again 19/37819/2
authorAlexey Lyashkov <c17817@cray.com>
Thu, 27 Feb 2020 14:48:48 +0000 (17:48 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 25 Mar 2020 06:31:53 +0000 (06:31 +0000)
Once statfs raced on mutex, lets read a cached data instead
of trash.

Lustre-change: https://review.whamcloud.com/37753
Lustre-commit: 7281635521a823548d497bce2f19acfa3318dfe9

Test-Parameters: testlist=sanity envdefinitions=ONLY=423,ONLY_REPEAT=500
Fixes: 1c41a6ac390b ("LU-12368 obdclass: don't send multiple statfs RPCs")
Signed-off-by: Alexey Lyashkov <c17817@cray.com>
Change-Id: I268782875c30c078f239c194f69cdf7506d66169
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/37819
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/obd_class.h
lustre/tests/sanity.sh

index eb6411c..94432d7 100644 (file)
@@ -1067,7 +1067,6 @@ static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp,
        if (obd->obd_osfs_age < max_age ||
            ((obd->obd_osfs.os_state & OS_STATE_SUM) &&
             !(flags & OBD_STATFS_SUM))) {
-               bool update_age = false;
                /* the RPC will block anyway, so avoid sending many at once */
                rc = mutex_lock_interruptible(&obd->obd_dev_mutex);
                if (rc)
@@ -1076,23 +1075,25 @@ static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp,
                    ((obd->obd_osfs.os_state & OS_STATE_SUM) &&
                     !(flags & OBD_STATFS_SUM))) {
                        rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags);
-                       update_age = true;
                } else {
-                       CDEBUG(D_SUPER,
-                              "%s: new %p cache blocks %llu/%llu objects %llu/%llu\n",
-                              obd->obd_name, &obd->obd_osfs,
-                              obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks,
-                              obd->obd_osfs.os_ffree, obd->obd_osfs.os_files);
+                       mutex_unlock(&obd->obd_dev_mutex);
+                       GOTO(cached, rc = 0);
                }
                if (rc == 0) {
+                       CDEBUG(D_SUPER,
+                              "%s: update %p cache blocks %llu/%llu objects %llu/%llu\n",
+                              obd->obd_name, &obd->obd_osfs,
+                              osfs->os_bavail, osfs->os_blocks,
+                              osfs->os_ffree, osfs->os_files);
+
                        spin_lock(&obd->obd_osfs_lock);
                        memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs));
-                       if (update_age)
-                               obd->obd_osfs_age = ktime_get_seconds();
+                       obd->obd_osfs_age = ktime_get_seconds();
                        spin_unlock(&obd->obd_osfs_lock);
                }
                mutex_unlock(&obd->obd_dev_mutex);
        } else {
+cached:
                CDEBUG(D_SUPER,
                       "%s: use %p cache blocks %llu/%llu objects %llu/%llu\n",
                       obd->obd_name, &obd->obd_osfs,
index 0470753..c45c8d3 100755 (executable)
@@ -20542,6 +20542,27 @@ test_421g() {
 }
 run_test 421g "rmfid to return errors properly"
 
+stat_test() {
+    df -h $MOUNT &
+    df -h $MOUNT &
+    df -h $MOUNT &
+    df -h $MOUNT &
+    df -h $MOUNT &
+    df -h $MOUNT &
+}
+
+test_423() {
+    local _stats
+    # ensure statfs cache is expired
+    sleep 2;
+
+    _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
+    [[ ${_stats} -ne 1 ]] && error "statfs wrong"
+
+    return 0
+}
+run_test 423 "statfs should return a right data"
+
 prep_801() {
        [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
        [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&