static void ia_histogram_merge_locked(iahistogram *src, ia_timestamp_t now) { iahistogram *dst = &global.per_bench[src->bench]; if (dst->enabled && src->acc.n != src->last.n) { dst->acc.latency_sum_ns += src->acc.latency_sum_ns - src->last.latency_sum_ns; dst->acc.latency_sum_square += src->acc.latency_sum_square - src->last.latency_sum_square; dst->acc.volume_sum += src->acc.volume_sum - src->last.volume_sum; dst->acc.n += src->acc.n - src->last.n; int i; for (i = 0; i < ST_HISTOGRAM_COUNT; i++) dst->buckets[i] += src->buckets[i]; if (dst->min > src->min) dst->min = src->min; if (dst->max < src->max) dst->max = src->max; if (src->merge_evo == global.merge_evo && ia_histogram_checkpoint(now) >= 0) src->merge_evo += 1; } }
int ia_run(ia *a) { long set_rd = 0; long set_wr = 0; iabenchmark bench; for (bench = IA_SET; bench < IA_MAX; bench++) { if (! a->conf.benchmark_list[bench]) continue; ia_histogram_enable(bench); if (bench == IA_ITERATE || bench == IA_GET) set_rd |= 1l << bench; else set_wr |= 1l << bench; } if ((set_rd | set_wr) == 0) return 0; if (a->conf.rthr && set_rd == 0) a->conf.rthr = 0; if (a->conf.wthr && set_wr == 0) a->conf.wthr = 0; int key_nsectors = 1; if (key_nsectors < a->conf.rthr) key_nsectors = a->conf.rthr; if (key_nsectors < a->conf.wthr) key_nsectors = a->conf.wthr; int key_nspaces = 1; if (key_nspaces < a->conf.wthr) key_nspaces = a->conf.wthr; if (set_wr & bench_mask_2keyspace) key_nspaces += key_nspaces; int rc = ia_kvgen_setup(!ioarena.conf.binary, ioarena.conf.ksize, key_nspaces, key_nsectors, ioarena.conf.count, ioarena.conf.kvseed); if (rc) { ia_log("error: key-value generator setup failed, the options are correct?"); return rc; } rc = pthread_barrier_init(&a->barrier_start, NULL, a->conf.rthr + a->conf.wthr + 1); if (!rc) rc = pthread_barrier_init(&a->barrier_fihish, NULL, a->conf.rthr + a->conf.wthr + 1); if (rc) { ia_log("error: pthread_barrier_init %s (%d)", strerror(errno), errno); return rc; } ia_histogram_csvopen(&a->conf); int nth = 0; int key_space = 0; rc = ia_spread(a->conf.rthr, &nth, &set_rd, set_rd, &key_space); if (rc) goto bailout; rc = ia_spread(a->conf.wthr, &nth, &set_wr, set_wr, &key_space); if (rc) goto bailout; iarusage rusage_start, rusage_fihish; if (set_wr | set_rd) { iadoer here; if (ia_doer_init(&here, 0, set_wr | set_rd, 0, 0)) goto bailout; rc = ia_get_rusage(&rusage_start, a->datadir); if (rc) goto bailout; ia_sync_start(a); rc = ia_doer_fulfil(&here); ia_sync_fihish(a); if (rc) goto bailout; rc = ia_get_rusage(&rusage_fihish, a->datadir); if (rc) goto bailout; ia_doer_destroy(&here); } else { rc = ia_get_rusage(&rusage_start, a->datadir); if (rc) goto bailout; ia_sync_start(a); ia_sync_fihish(a); rc = ia_get_rusage(&rusage_fihish, a->datadir); if (rc) goto bailout; } if (a->failed) goto bailout; ia_histogram_checkpoint(0); ia_log("complete."); ia_histogram_print(&a->conf); rusage_start.ram = a->before_open_ram; rusage_start.disk = 0; ia_histogram_rusage(&a->conf, &rusage_start, &rusage_fihish); ia_histogram_csvclose(); return 0; bailout: exit(EXIT_FAILURE); }