]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rados: fix load-gen 'max-ops'
authorSage Weil <sage@newdream.net>
Mon, 16 Jan 2012 18:25:00 +0000 (10:25 -0800)
committerSage Weil <sage@newdream.net>
Mon, 16 Jan 2012 18:40:33 +0000 (10:40 -0800)
This was mixed up with min/max_op_len.  And max_ops wasn't being used
the initial object creation stage, flooding the OSDs.  Or during run().

Signed-off-by: Sage Weil <sage@newdream.net>
qa/workunits/rados/load-gen-big.sh
qa/workunits/rados/load-gen-mix-small-long.sh
qa/workunits/rados/load-gen-mix-small.sh
qa/workunits/rados/load-gen-mix.sh
qa/workunits/rados/load-gen-mostlyread.sh
src/rados.cc

index a9b12c14ee197ff6634ac5078fce8e8c34db90ac..3306f2867278ef48e06f950d8c1e40d9b0137354 100755 (executable)
@@ -4,7 +4,6 @@ rados -p data load-gen \
     --num-objects 10240 \
     --min-object-size 1048576 \
     --max-object-size 25600000 \
-    --min-ops 4 \
     --max-ops 1024 \
     --max-backlog 1024 \
     --percent 50 \
index 8b568c6837e36397c9cdf34747af3daf979f84bc..391ef4de2ff944d9c92815555f2c76de864ffba3 100755 (executable)
@@ -4,7 +4,6 @@ rados -p data load-gen \
     --num-objects 1024 \
     --min-object-size 1 \
     --max-object-size 1048576 \
-    --min-ops 4 \
     --max-ops 128 \
     --max-backlog 128 \
     --percent 50 \
index 081dae31b6c765e8533ac7ad0578c368581503ac..7a2020f1df5060c3bb4f380a061e34df9bd202fe 100755 (executable)
@@ -4,7 +4,6 @@ rados -p data load-gen \
     --num-objects 1024 \
     --min-object-size 1 \
     --max-object-size 1048576 \
-    --min-ops 4 \
     --max-ops 128 \
     --max-backlog 128 \
     --percent 50 \
index fee0c4daf05b4885ef0acb6b6f890ca76dfabbf4..0d6bb2d987c3bacab8198b9b6714d65b9fe1f1c9 100755 (executable)
@@ -4,7 +4,6 @@ rados -p data load-gen \
     --num-objects 102400 \
     --min-object-size 1 \
     --max-object-size 1048576 \
-    --min-ops 4 \
     --max-ops 128 \
     --max-backlog 128 \
     --percent 50 \
index 32dd9bfbbcb648c6b34a4f2f304d6dc41f009909..62a524f7bb0fb86ff17c80223adc4e48223155b5 100755 (executable)
@@ -4,7 +4,6 @@ rados -p data load-gen \
     --num-objects 102400 \
     --min-object-size 1 \
     --max-object-size 1048576 \
-    --min-ops 4 \
     --max-ops 128 \
     --max-backlog 128 \
     --percent 90 \
index 263c19785df24ca970349292794f81fae6910fa2..36e09f25222e903bbdf265be188c0db3d031850a 100644 (file)
@@ -269,6 +269,7 @@ public:
   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;
@@ -336,7 +337,7 @@ public:
     total_sent = 0;
     total_completed = 0;
     num_objs = 200;
-    max_op = 0;
+    max_op = 16;
   }
   int bootstrap(const char *pool);
   int run();
@@ -390,7 +391,7 @@ int LoadGen::bootstrap(const char *pool)
   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);
@@ -398,6 +399,19 @@ int LoadGen::bootstrap(const char *pool)
     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
@@ -409,13 +423,13 @@ int LoadGen::bootstrap(const char *pool)
     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;
     }
@@ -516,7 +530,8 @@ int LoadGen::run()
     }
 
     while (sent < expected &&
-           sent - completed < max_backlog) {
+           sent - completed < max_backlog &&
+          pending_ops.size() < max_ops) {
       sent += gen_next_op();
     }
   }
@@ -578,6 +593,7 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
   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;
@@ -627,14 +643,18 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
   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);
@@ -1235,6 +1255,8 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
       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)
@@ -1313,8 +1335,10 @@ int main(int argc, const char **argv)
       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)) {