uint64_t max_obj_len;
size_t min_op_len;
size_t max_op_len;
+ size_t max_ops;
size_t max_backlog;
size_t target_throughput;
int run_length;
total_sent = 0;
total_completed = 0;
num_objs = 200;
- max_op = 0;
+ max_op = 16;
}
int bootstrap(const char *pool);
int run();
memset(p.c_str(), 0, buf_len);
bl.push_back(p);
- vector<librados::AioCompletion *> completions;
+ list<librados::AioCompletion *> completions;
for (i = 0; i < num_objs; i++) {
obj_info info;
gen_rand_alphanumeric(buf, 16);
info.name.append(buf);
info.len = get_random(min_obj_len, max_obj_len);
+ // throttle...
+ while (completions.size() > max_ops) {
+ AioCompletion *c = completions.front();
+ c->wait_for_complete();
+ ret = c->get_return_value();
+ c->release();
+ completions.pop_front();
+ if (ret < 0) {
+ cerr << "aio_write failed" << std::endl;
+ return ret;
+ }
+ }
+
librados::AioCompletion *c = rados->aio_create_completion(NULL, NULL, NULL);
completions.push_back(c);
// generate object
objs[i] = info;
}
- vector<librados::AioCompletion *>::iterator iter;
+ list<librados::AioCompletion *>::iterator iter;
for (iter = completions.begin(); iter != completions.end(); ++iter) {
AioCompletion *c = *iter;
c->wait_for_complete();
ret = c->get_return_value();
c->release();
- if (ret < 0) {
+ if (ret < 0) { // yes, we leak.
cerr << "aio_write failed" << std::endl;
return ret;
}
}
while (sent < expected &&
- sent - completed < max_backlog) {
+ sent - completed < max_backlog &&
+ pending_ops.size() < max_ops) {
sent += gen_next_op();
}
}
uint64_t max_obj_len = 0;
uint64_t min_op_len = 0;
uint64_t max_op_len = 0;
+ uint64_t max_ops = 0;
uint64_t max_backlog = 0;
uint64_t target_throughput = 0;
int64_t read_percent = -1;
if (i != opts.end()) {
max_obj_len = strtoll(i->second.c_str(), NULL, 10);
}
- i = opts.find("min-ops");
+ i = opts.find("min-op-len");
if (i != opts.end()) {
min_op_len = strtoll(i->second.c_str(), NULL, 10);
}
- i = opts.find("max-ops");
+ i = opts.find("max-op-len");
if (i != opts.end()) {
max_op_len = strtoll(i->second.c_str(), NULL, 10);
}
+ i = opts.find("max-ops");
+ if (i != opts.end()) {
+ max_ops = strtoll(i->second.c_str(), NULL, 10);
+ }
i = opts.find("max-backlog");
if (i != opts.end()) {
max_backlog = strtoll(i->second.c_str(), NULL, 10);
lg.min_op_len = min_op_len;
if (max_op_len)
lg.max_op_len = max_op_len;
+ if (max_ops)
+ lg.max_ops = max_ops;
if (max_backlog)
lg.max_backlog = max_backlog;
if (target_throughput)
opts["min-object-size"] = val;
} else if (ceph_argparse_witharg(args, i, &val, "--max-object-size", (char*)NULL)) {
opts["max-object-size"] = val;
- } else if (ceph_argparse_witharg(args, i, &val, "--min-ops", (char*)NULL)) {
- opts["min-ops"] = val;
+ } else if (ceph_argparse_witharg(args, i, &val, "--min-op-len", (char*)NULL)) {
+ opts["min-op-len"] = val;
+ } else if (ceph_argparse_witharg(args, i, &val, "--max-op-len", (char*)NULL)) {
+ opts["max-op-len"] = val;
} else if (ceph_argparse_witharg(args, i, &val, "--max-ops", (char*)NULL)) {
opts["max-ops"] = val;
} else if (ceph_argparse_witharg(args, i, &val, "--max-backlog", (char*)NULL)) {