From 56a90eba1f4d54c22c127636d8fbf987aafba066 Mon Sep 17 00:00:00 2001 From: Vincent Fu Date: Fri, 28 Oct 2016 15:19:57 -0400 Subject: [PATCH] steadystate: reject job if steadystate options are not consistent within reporting group --- TODO | 5 ----- init.c | 3 ++- steadystate.c | 53 +++++++++++++++++++++++++++++++++++---------------- steadystate.h | 2 +- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/TODO b/TODO index e20857f4..b5426260 100644 --- a/TODO +++ b/TODO @@ -6,11 +6,6 @@ Known issues/TODO (for steady-state) - Add example job files -- group_reporting must be set for every job in a group - -- Undefined behavior when steady state options differ across jobs in a - single group - - Allow user to specify the frequency of measurements - Better documentation for output diff --git a/init.c b/init.c index 8d2603aa..9f69b3c2 100644 --- a/init.c +++ b/init.c @@ -1578,7 +1578,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, log_info("...\n"); } - td_steadystate_init(td); + if (td_steadystate_init(td)) + goto err; /* * recurse add identical jobs, clear numjobs and stonewall options diff --git a/steadystate.c b/steadystate.c index 1f53ae46..4dd7f426 100644 --- a/steadystate.c +++ b/steadystate.c @@ -294,31 +294,52 @@ void steadystate_check(void) } } -void td_steadystate_init(struct thread_data *td) +int td_steadystate_init(struct thread_data *td) { struct steadystate_data *ss = &td->ss; struct thread_options *o = &td->o; + struct thread_data *td2; + int j; memset(ss, 0, sizeof(*ss)); - if (!o->ss_dur) - return; + if (o->ss_dur) { + steadystate_enabled = true; + o->ss_dur /= 1000000L; + + /* put all steady state info in one place */ + ss->dur = o->ss_dur; + ss->limit = o->ss_limit.u.f; + ss->ramp_time = o->ss_ramp_time; + ss->pct = o->ss_pct; - steadystate_enabled = true; - o->ss_dur /= 1000000L; + ss->state = o->ss; + if (!td->ss.ramp_time) + ss->state |= __FIO_SS_RAMP_OVER; - /* put all steady state info in one place */ - ss->dur = o->ss_dur; - ss->limit = o->ss_limit.u.f; - ss->ramp_time = o->ss_ramp_time; - ss->pct = o->ss_pct; + ss->sum_x = o->ss_dur * (o->ss_dur - 1) / 2; + ss->sum_x_sq = (o->ss_dur - 1) * (o->ss_dur) * (2*o->ss_dur - 1) / 6; - ss->state = o->ss; - if (!td->ss.ramp_time) - ss->state |= __FIO_SS_RAMP_OVER; + td->ts.ss = ss; + } - ss->sum_x = o->ss_dur * (o->ss_dur - 1) / 2; - ss->sum_x_sq = (o->ss_dur - 1) * (o->ss_dur) * (2*o->ss_dur - 1) / 6; + /* make sure that ss options are consistent within reporting group */ + for_each_td(td2, j) { + if (td2->groupid == td->groupid) { + struct steadystate_data *ss2 = &td2->ss; + + if (ss2->dur != ss->dur || + ss2->limit != ss->limit || + ss2->ramp_time != ss->ramp_time || + ss2->pct != ss->pct || + ss2->state != ss->state || + ss2->sum_x != ss->sum_x || + ss2->sum_x_sq != ss->sum_x_sq) { + td_verror(td, EINVAL, "job rejected: steadystate options must be consistent within reporting groups"); + return 1; + } + } + } - td->ts.ss = ss; + return 0; } diff --git a/steadystate.h b/steadystate.h index 43670c12..209314fb 100644 --- a/steadystate.h +++ b/steadystate.h @@ -5,7 +5,7 @@ extern void steadystate_check(void); extern void steadystate_setup(void); -extern void td_steadystate_init(struct thread_data *); +extern int td_steadystate_init(struct thread_data *); extern bool steadystate_enabled; -- 2.25.1