pNFS/flexfiles: Only send layoutstats updates for mirrors that were updated
authorTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 25 Nov 2016 18:17:15 +0000 (13:17 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 2 Dec 2016 16:42:58 +0000 (11:42 -0500)
If there have been no reads or writes to a given mirror since the last
layoutstats update, then don't resend the same data.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/flexfilelayout/flexfilelayout.c
fs/nfs/flexfilelayout/flexfilelayout.h

index a6264d6..540813c 100644 (file)
@@ -705,6 +705,7 @@ nfs4_ff_layout_stat_io_start_read(struct inode *inode,
        spin_lock(&mirror->lock);
        report = nfs4_ff_layoutstat_start_io(mirror, &mirror->read_stat, now);
        nfs4_ff_layout_stat_io_update_requested(&mirror->read_stat, requested);
+       set_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags);
        spin_unlock(&mirror->lock);
 
        if (report)
@@ -721,6 +722,7 @@ nfs4_ff_layout_stat_io_end_read(struct rpc_task *task,
        nfs4_ff_layout_stat_io_update_completed(&mirror->read_stat,
                        requested, completed,
                        ktime_get(), task->tk_start);
+       set_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags);
        spin_unlock(&mirror->lock);
 }
 
@@ -734,6 +736,7 @@ nfs4_ff_layout_stat_io_start_write(struct inode *inode,
        spin_lock(&mirror->lock);
        report = nfs4_ff_layoutstat_start_io(mirror , &mirror->write_stat, now);
        nfs4_ff_layout_stat_io_update_requested(&mirror->write_stat, requested);
+       set_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags);
        spin_unlock(&mirror->lock);
 
        if (report)
@@ -753,6 +756,7 @@ nfs4_ff_layout_stat_io_end_write(struct rpc_task *task,
        spin_lock(&mirror->lock);
        nfs4_ff_layout_stat_io_update_completed(&mirror->write_stat,
                        requested, completed, ktime_get(), task->tk_start);
+       set_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags);
        spin_unlock(&mirror->lock);
 }
 
@@ -2201,6 +2205,8 @@ ff_layout_mirror_prepare_stats(struct nfs42_layoutstat_args *args,
                        break;
                if (!mirror->mirror_ds)
                        continue;
+               if (!test_and_clear_bit(NFS4_FF_MIRROR_STAT_AVAIL, &mirror->flags))
+                       continue;
                /* mirror refcount put in cleanup_layoutstats */
                if (!atomic_inc_not_zero(&mirror->ref))
                        continue;
index 3ee0c9f..09f292e 100644 (file)
@@ -81,12 +81,15 @@ struct nfs4_ff_layout_mirror {
        struct rpc_cred __rcu           *rw_cred;
        atomic_t                        ref;
        spinlock_t                      lock;
+       unsigned long                   flags;
        struct nfs4_ff_layoutstat       read_stat;
        struct nfs4_ff_layoutstat       write_stat;
        ktime_t                         start_time;
        u32                             report_interval;
 };
 
+#define NFS4_FF_MIRROR_STAT_AVAIL      (0)
+
 struct nfs4_ff_layout_segment {
        struct pnfs_layout_segment      generic_hdr;
        u64                             stripe_unit;