mirror of https://gitee.com/openkylin/linux.git
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: Trond Myklebust <trond.myklebust@primarydata.com>
Fixes: d0379a5d06
("pNFS/flexfiles: Support server-supplied...")
This commit is contained in:
parent
694d0d0bb2
commit
1c8d477a77
|
@ -37,6 +37,7 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
|
|||
if (ffl) {
|
||||
INIT_LIST_HEAD(&ffl->error_list);
|
||||
INIT_LIST_HEAD(&ffl->mirrors);
|
||||
ffl->last_report_time = ktime_get();
|
||||
return &ffl->generic_hdr;
|
||||
} else
|
||||
return NULL;
|
||||
|
@ -640,19 +641,18 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror,
|
|||
{
|
||||
static const ktime_t notime = {0};
|
||||
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);
|
||||
if (ktime_equal(mirror->start_time, notime))
|
||||
mirror->start_time = now;
|
||||
if (ktime_equal(mirror->last_report_time, notime))
|
||||
mirror->last_report_time = now;
|
||||
if (mirror->report_interval != 0)
|
||||
report_interval = (s64)mirror->report_interval * 1000LL;
|
||||
else if (layoutstats_timer != 0)
|
||||
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) {
|
||||
mirror->last_report_time = now;
|
||||
ffl->last_report_time = now;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,6 @@ struct nfs4_ff_layout_mirror {
|
|||
struct nfs4_ff_layoutstat read_stat;
|
||||
struct nfs4_ff_layoutstat write_stat;
|
||||
ktime_t start_time;
|
||||
ktime_t last_report_time;
|
||||
u32 report_interval;
|
||||
};
|
||||
|
||||
|
@ -101,6 +100,7 @@ struct nfs4_flexfile_layout {
|
|||
struct pnfs_ds_commit_info commit_info;
|
||||
struct list_head mirrors;
|
||||
struct list_head error_list; /* nfs4_ff_layout_ds_err */
|
||||
ktime_t last_report_time; /* Layoutstat report times */
|
||||
};
|
||||
|
||||
static inline struct nfs4_flexfile_layout *
|
||||
|
|
Loading…
Reference in New Issue