Commit 1c8d477a authored by Trond Myklebust's avatar Trond Myklebust

pNFS/flexfiles: Fix layoutstat periodic reporting

Putting the periodicity timer in the mirror instances is causing
non-scalable reporting behaviour and missed reporting intervals.
When you recall layouts and/or implement client side mirroring, it
leads to consecutive reports with only a few ms between RPC calls.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
Fixes: d0379a5d ("pNFS/flexfiles: Support server-supplied...")
parent 694d0d0b
...@@ -37,6 +37,7 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags) ...@@ -37,6 +37,7 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
if (ffl) { if (ffl) {
INIT_LIST_HEAD(&ffl->error_list); INIT_LIST_HEAD(&ffl->error_list);
INIT_LIST_HEAD(&ffl->mirrors); INIT_LIST_HEAD(&ffl->mirrors);
ffl->last_report_time = ktime_get();
return &ffl->generic_hdr; return &ffl->generic_hdr;
} else } else
return NULL; return NULL;
...@@ -640,19 +641,18 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror, ...@@ -640,19 +641,18 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror,
{ {
static const ktime_t notime = {0}; static const ktime_t notime = {0};
s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL; s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL;
struct nfs4_flexfile_layout *ffl = FF_LAYOUT_FROM_HDR(mirror->layout);
nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now); nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now);
if (ktime_equal(mirror->start_time, notime)) if (ktime_equal(mirror->start_time, notime))
mirror->start_time = now; mirror->start_time = now;
if (ktime_equal(mirror->last_report_time, notime))
mirror->last_report_time = now;
if (mirror->report_interval != 0) if (mirror->report_interval != 0)
report_interval = (s64)mirror->report_interval * 1000LL; report_interval = (s64)mirror->report_interval * 1000LL;
else if (layoutstats_timer != 0) else if (layoutstats_timer != 0)
report_interval = (s64)layoutstats_timer * 1000LL; report_interval = (s64)layoutstats_timer * 1000LL;
if (ktime_to_ms(ktime_sub(now, mirror->last_report_time)) >= if (ktime_to_ms(ktime_sub(now, ffl->last_report_time)) >=
report_interval) { report_interval) {
mirror->last_report_time = now; ffl->last_report_time = now;
return true; return true;
} }
......
...@@ -84,7 +84,6 @@ struct nfs4_ff_layout_mirror { ...@@ -84,7 +84,6 @@ struct nfs4_ff_layout_mirror {
struct nfs4_ff_layoutstat read_stat; struct nfs4_ff_layoutstat read_stat;
struct nfs4_ff_layoutstat write_stat; struct nfs4_ff_layoutstat write_stat;
ktime_t start_time; ktime_t start_time;
ktime_t last_report_time;
u32 report_interval; u32 report_interval;
}; };
...@@ -101,6 +100,7 @@ struct nfs4_flexfile_layout { ...@@ -101,6 +100,7 @@ struct nfs4_flexfile_layout {
struct pnfs_ds_commit_info commit_info; struct pnfs_ds_commit_info commit_info;
struct list_head mirrors; struct list_head mirrors;
struct list_head error_list; /* nfs4_ff_layout_ds_err */ struct list_head error_list; /* nfs4_ff_layout_ds_err */
ktime_t last_report_time; /* Layoutstat report times */
}; };
static inline struct nfs4_flexfile_layout * static inline struct nfs4_flexfile_layout *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment