Split reads and writes into separate threads, instead of mixing operations
within a single thread. This does not allow arbitrary mixes any longer,
since the ratios are quantized based on the number of total threads.
int opt_filesize, opt_filecount, opt_threads, opt_duration, opt_intervals, opt_dirsize;
double opt_writeratio, opt_ops;
int opt_filesize, opt_filecount, opt_threads, opt_duration, opt_intervals, opt_dirsize;
double opt_writeratio, opt_ops;
struct thread_state {
pthread_t thread;
pthread_mutex_t lock;
struct thread_state {
pthread_t thread;
pthread_mutex_t lock;
char filename[256];
int n = get_random(opt_filecount);
int n1 = n / opt_dirsize, n2 = n % opt_dirsize;
char filename[256];
int n = get_random(opt_filecount);
int n1 = n / opt_dirsize, n2 = n % opt_dirsize;
- sprintf(filename, "t%d/%d/%d", ts->thread_num, n1, n2);
-
- double r = get_random(1000000) / 1e6;
- if (r >= opt_writeratio) {
+ if (ts->thread_num >= write_threads) {
+ sprintf(filename, "t%d/%d/%d", ts->thread_num - write_threads, n1, n2);
FILE *f = fopen(filename, "rb");
if (f == NULL) {
perror("fopen");
FILE *f = fopen(filename, "rb");
if (f == NULL) {
perror("fopen");
pthread_mutex_unlock(&ts->lock);
} else {
/* Write */
pthread_mutex_unlock(&ts->lock);
} else {
/* Write */
+ sprintf(filename, "t%d/%d/%d", ts->thread_num, n1, n2);
FILE *f = fopen(filename, "wb");
if (f == NULL) {
perror("fopen");
FILE *f = fopen(filename, "wb");
if (f == NULL) {
perror("fopen");
start_time = now_hires();
start_time = now_hires();
+ /* Partition threads into those that should do reads and those for writes,
+ * as close as possible to the desired allocation. */
+ write_threads = (int)round(opt_threads * opt_writeratio);
+ fprintf(stderr, "Using %d threads for reads, %d for writes\n",
+ opt_threads - write_threads, write_threads);
+
for (int i = 0; i < opt_threads; i++) {
launch_thread(i);
}
for (int i = 0; i < opt_threads; i++) {
launch_thread(i);
}