m_suppress_write_xattr_coll(false), m_suppress_write_log(false),
m_do_stats(false),
m_stats_finished_txs(0),
- m_stats_written_data(0), m_stats_duration(), m_stats_lock("WorldloadGenerator::m_stats_lock"),
- m_stats_show_secs(5)
+ m_stats_lock("WorldloadGenerator::m_stats_lock"),
+ m_stats_show_secs(5),
+ m_stats_total_written(0),
+ m_stats_begin()
{
int err = 0;
return entry;
}
+void WorkloadGenerator::do_stats()
+{
+ utime_t now = ceph_clock_now(NULL);
+ m_stats_lock.Lock();
+
+ utime_t duration = (now - m_stats_begin);
+
+ // when cast to double, a utime_t behaves properly
+ double throughput = (m_stats_total_written / ((double) duration));
+ double tx_throughput (m_stats_finished_txs / ((double) duration));
+
+ dout(0) << __func__
+ << " written: " << m_stats_total_written
+ << " duration: " << duration << " sec"
+ << " bandwidth: " << prettybyte_t(throughput) << "/s"
+ << " iops: " << tx_throughput << "/s"
+ << dendl;
+
+ m_stats_lock.Unlock();
+}
+
void WorkloadGenerator::run()
{
bool create_coll = false;
int ops_run = 0;
utime_t stats_interval(m_stats_show_secs, 0);
- utime_t stats_time = ceph_clock_now(NULL);
+ utime_t now = ceph_clock_now(NULL);
+ utime_t stats_time = now;
+ m_stats_begin = now;
do {
C_StatState *stat_state = NULL;
utime_t now = ceph_clock_now(NULL);
utime_t elapsed = now - stats_time;
if (elapsed >= stats_interval) {
- m_stats_lock.Lock();
-
- // when cast to double, a utime_t behaves properly
- double throughput = (m_stats_written_data / ((double) m_stats_duration));
- double tx_throughput (m_stats_finished_txs / ((double) m_stats_duration));
-
- dout(0) << __func__
- << " written: " << m_stats_written_data
- << " duration: " << m_stats_duration
- << " bandwidth: " << prettybyte_t(throughput) << "/s"
- << " iops: " << tx_throughput << "/s"
- << dendl;
-
- m_stats_finished_txs = 0;
- m_stats_written_data = 0;
- m_stats_duration = utime_t();
-
- m_stats_lock.Unlock();
-
- stats_time = now;
+ do_stats();
+ stats_time = now;
}
-
stat_state = new C_StatState(this, now);
}
wait_for_done();
- dout(0) << __func__ << " finishing" << dendl;
-}
-
-void WorkloadGenerator::print_results()
-{
+ do_stats();
+ dout(0) << __func__ << " finishing" << dendl;
}
void usage()
WorkloadGenerator *wrkldgen_ptr = new WorkloadGenerator(args);
wrkldgen.reset(wrkldgen_ptr);
wrkldgen->run();
- wrkldgen->print_results();
return 0;
}
bool m_do_stats;
int m_stats_finished_txs;
- size_t m_stats_written_data;
- utime_t m_stats_duration;
Mutex m_stats_lock;
int m_stats_show_secs;
+ size_t m_stats_total_written;
+ utime_t m_stats_begin;
+
private:
void _suppress_ops_or_die(std::string& val);
coll_entry_t *do_create_collection(ObjectStore::Transaction *t,
C_StatState *stat);
+ void do_stats();
+
public:
WorkloadGenerator(vector<const char*> args);
~WorkloadGenerator() {
void finish(int r) {
ctx->finish(r);
- utime_t end = ceph_clock_now(NULL);
- utime_t taken = end - stat_state->start;
-
stat_state->wrkldgen->m_stats_lock.Lock();
- stat_state->wrkldgen->m_stats_duration += taken;
- stat_state->wrkldgen->m_stats_written_data += stat_state->written_data;
+
+ stat_state->wrkldgen->m_stats_total_written += stat_state->written_data;
stat_state->wrkldgen->m_stats_finished_txs ++;
stat_state->wrkldgen->m_stats_lock.Unlock();
}
};
void run(void);
- void print_results(void);
};
bool operator<(const WorkloadGenerator::coll_entry_t& l,