]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados_list_parallel: test adding objects + listing
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Tue, 12 Jul 2011 00:50:41 +0000 (17:50 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Wed, 13 Jul 2011 21:40:50 +0000 (14:40 -0700)
Test one runnable adding objects while another runnable lists them.

Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/test/system/rados_list_parallel.cc
src/test/system/st_rados_create_pool.cc
src/test/system/st_rados_create_pool.h

index 52f2724636e35d55dfa7e59ef247a9274323ca4c..3818cdcd8a8a3be14238f0aaade7de392e7a87ca 100644 (file)
@@ -98,15 +98,15 @@ public:
   }
 };
 
-class RadosModifyPoolR : public SysTestRunnable
+class RadosDeleteObjectsR : public SysTestRunnable
 {
 public:
-  RadosModifyPoolR(int argc, const char **argv)
+  RadosDeleteObjectsR(int argc, const char **argv)
     : SysTestRunnable(argc, argv)
   {
   }
 
-  ~RadosModifyPoolR()
+  ~RadosDeleteObjectsR()
   {
   }
 
@@ -172,6 +172,82 @@ public:
   }
 };
 
+class RadosAddObjectsR : public SysTestRunnable
+{
+public:
+  RadosAddObjectsR(int argc, const char **argv)
+    : SysTestRunnable(argc, argv)
+  {
+  }
+
+  ~RadosAddObjectsR()
+  {
+  }
+
+  int run(void)
+  {
+    int ret;
+    rados_t cl;
+    RETURN_IF_NONZERO(rados_create(&cl, NULL));
+    rados_conf_parse_argv(cl, m_argc, m_argv);
+    RETURN_IF_NONZERO(rados_conf_read_file(cl, NULL));
+    std::string log_name = SysTestSettings::inst().get_log_name(get_id_str());
+    if (!log_name.empty())
+      rados_conf_set(cl, "log_file", log_name.c_str());
+    RETURN_IF_NONZERO(rados_connect(cl));
+    pool_setup_sem->wait();
+    pool_setup_sem->post();
+
+    rados_ioctx_t io_ctx;
+    RETURN_IF_NOT_VAL(-EEXIST, rados_pool_create(cl, "foo"));
+    RETURN_IF_NONZERO(rados_ioctx_create(cl, "foo", &io_ctx));
+
+    std::map <int, std::string> to_add;
+    for (int i = 0; i < g_num_objects; ++i) {
+      char oid[128];
+      snprintf(oid, sizeof(oid), "%d.obj2", i);
+      to_add[i] = oid;
+    }
+
+    int added = 0;
+    while (true) {
+      if (to_add.empty())
+       break;
+      int r = rand() % to_add.size();
+      std::map <int, std::string>::iterator d = to_add.begin();
+      for (int i = 0; i < r; ++i)
+       ++d;
+      if (d == to_add.end()) {
+       return -EDOM;
+      }
+      std::string oid(d->second);
+      to_add.erase(d);
+
+      std::string buf(StRadosCreatePool::get_random_buf(256));
+      ret = rados_write(io_ctx, oid.c_str(), buf.c_str(), buf.size(), 0);
+      if (ret != buf.size()) {
+       printf("%s: rados_write(%s) failed with error %d\n",
+              get_id_str(), oid.c_str(), ret);
+       return ret;
+      }
+      ++added;
+      if ((added % 25) == 0) {
+       printf("%s: added %d objects...\n", get_id_str(), added);
+      }
+      if (added == g_num_objects / 2) {
+       printf("%s: added half of the objects\n", get_id_str());
+       modify_sem->post();
+      }
+    }
+
+    printf("%s: added %d objects\n", get_id_str(), added);
+
+    rados_ioctx_destroy(cl);
+
+    return 0;
+  }
+};
+
 const char *get_id_str()
 {
   return "main";
@@ -192,31 +268,53 @@ int main(int argc, const char **argv)
   std::string error;
 
   // Test 1... list objects
-  StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
-  RadosListObjectsR r2(argc, argv);
-  vector < SysTestRunnable* > vec;
-  vec.push_back(&r1);
-  vec.push_back(&r2);
-  error = SysTestRunnable::run_until_finished(vec);
-  if (!error.empty()) {
-    printf("got error: %s\n", error.c_str());
-    return EXIT_FAILURE;
+  {
+    StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
+    RadosListObjectsR r2(argc, argv);
+    vector < SysTestRunnable* > vec;
+    vec.push_back(&r1);
+    vec.push_back(&r2);
+    error = SysTestRunnable::run_until_finished(vec);
+    if (!error.empty()) {
+      printf("got error: %s\n", error.c_str());
+      return EXIT_FAILURE;
+    }
   }
 
   // Test 2... list objects while they're being deleted
   RETURN_IF_NONZERO(pool_setup_sem->reinit(0));
   RETURN_IF_NONZERO(modify_sem->reinit(0));
-  StRadosCreatePool r3(argc, argv, pool_setup_sem, NULL, g_num_objects);
-  RadosListObjectsR r4(argc, argv);
-  RadosModifyPoolR r5(argc, argv);
-  vector < SysTestRunnable* > vec2;
-  vec2.push_back(&r3);
-  vec2.push_back(&r4);
-  vec2.push_back(&r5);
-  error = SysTestRunnable::run_until_finished(vec2);
-  if (!error.empty()) {
-    printf("got error: %s\n", error.c_str());
-    return EXIT_FAILURE;
+  {
+    StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
+    RadosListObjectsR r2(argc, argv);
+    RadosDeleteObjectsR r3(argc, argv);
+    vector < SysTestRunnable* > vec;
+    vec.push_back(&r1);
+    vec.push_back(&r2);
+    vec.push_back(&r3);
+    error = SysTestRunnable::run_until_finished(vec);
+    if (!error.empty()) {
+      printf("got error: %s\n", error.c_str());
+      return EXIT_FAILURE;
+    }
+  }
+
+  // Test 3... list objects while others are being added
+  RETURN_IF_NONZERO(pool_setup_sem->reinit(0));
+  RETURN_IF_NONZERO(modify_sem->reinit(0));
+  {
+    StRadosCreatePool r1(argc, argv, pool_setup_sem, NULL, g_num_objects);
+    RadosListObjectsR r2(argc, argv);
+    RadosAddObjectsR r3(argc, argv);
+    vector < SysTestRunnable* > vec;
+    vec.push_back(&r1);
+    vec.push_back(&r2);
+    vec.push_back(&r3);
+    error = SysTestRunnable::run_until_finished(vec);
+    if (!error.empty()) {
+      printf("got error: %s\n", error.c_str());
+      return EXIT_FAILURE;
+    }
   }
 
   printf("******* SUCCESS **********\n"); 
index 0db494330d52564e0ba94936d7aaa7fc67faffb0..4bced3ce9acaf3927d8803b303717dd8861661eb 100644 (file)
 
 using std::ostringstream;
 
-static const int RLP_OBJECT_SZ_MAX = 256;
-
-static std::string get_random_buf(void)
+std::string StRadosCreatePool::
+get_random_buf(int sz)
 {
   ostringstream oss;
-  int size = rand() % RLP_OBJECT_SZ_MAX; // yep, it's not very random
+  int size = rand() % sz; // yep, it's not very random
   for (int i = 0; i < size; ++i) {
     oss << ".";
   }
@@ -78,7 +77,7 @@ run()
   for (int i = 0; i < m_num_objects; ++i) {
     char oid[128];
     snprintf(oid, sizeof(oid), "%d.obj", i);
-    std::string buf(get_random_buf());
+    std::string buf(get_random_buf(256));
     ret = rados_write(io_ctx, oid, buf.c_str(), buf.size(), 0);
     if (ret < static_cast<int>(buf.size())) {
       printf("%s: rados_write error %d\n", get_id_str(), ret);
index 55f06e037d89e6fc2f127b2e8766944376f2d7a1..4b66b1feeb510f6f49067dcff4865738f4c5c9a8 100644 (file)
@@ -28,6 +28,7 @@ class CrossProcessSem;
 class StRadosCreatePool : public SysTestRunnable
 {
 public:
+  static std::string get_random_buf(int sz);
   StRadosCreatePool(int argc, const char **argv,
        CrossProcessSem *pool_setup_sem, CrossProcessSem *close_create_pool_sem,
        int num_objects);