]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
systest: fix race with pool deletion
authorJosh Durgin <josh.durgin@inktank.com>
Mon, 25 Feb 2013 22:55:34 +0000 (14:55 -0800)
committerSage Weil <sage@inktank.com>
Mon, 25 Mar 2013 16:04:24 +0000 (09:04 -0700)
The second test have pool deletion and object listing wait on the same
semaphore to connect and start. This led to errors sometimes when the
pool was deleted before it could be opened by the listing process. Add
another semaphore so the pool deletion happens only after the listing
has begun.

Fixes: #4147
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
(cherry picked from commit b0271e390564119e998e18189282252d54f75eb6)

src/test/system/rados_delete_pools_parallel.cc
src/test/system/rados_list_parallel.cc
src/test/system/st_rados_list_objects.cc
src/test/system/st_rados_list_objects.h

index 4bcf21244189a853c81fa2c1d0e887519281ed3d..5347c53c296ced33ca68f5760e0f86946be6a1b7 100644 (file)
@@ -91,9 +91,9 @@ int main(int argc, const char **argv)
   {
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
-    StRadosDeletePool r2(argc, argv, pool_setup_sem, delete_pool_sem, pool);
+    StRadosDeletePool r2(argc, argv, delete_pool_sem, NULL, pool);
     StRadosListObjects r3(argc, argv, pool, true, g_num_objects / 2,
-                         pool_setup_sem, delete_pool_sem);
+                         pool_setup_sem, NULL, delete_pool_sem);
     vector < SysTestRunnable* > vec;
     vec.push_back(&r1);
     vec.push_back(&r2);
index 3a68b943627ffea1e2fb559a164f6fdc5062514a..77df29e0e79aa169d14d52bbc86aaf734433e10d 100644 (file)
@@ -230,7 +230,7 @@ int main(int argc, const char **argv)
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
     StRadosListObjects r2(argc, argv, pool, false, g_num_objects,
-                         pool_setup_sem, modify_sem);
+                         pool_setup_sem, modify_sem, NULL);
     vector < SysTestRunnable* > vec;
     vec.push_back(&r1);
     vec.push_back(&r2);
@@ -248,7 +248,7 @@ int main(int argc, const char **argv)
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
     StRadosListObjects r2(argc, argv, pool, false, g_num_objects / 2,
-                         pool_setup_sem, modify_sem);
+                         pool_setup_sem, modify_sem, NULL);
     RadosDeleteObjectsR r3(argc, argv, pool);
     vector < SysTestRunnable* > vec;
     vec.push_back(&r1);
@@ -268,7 +268,7 @@ int main(int argc, const char **argv)
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
     StRadosListObjects r2(argc, argv, pool, false, g_num_objects / 2,
-                         pool_setup_sem, modify_sem);
+                         pool_setup_sem, modify_sem, NULL);
     RadosAddObjectsR r3(argc, argv, pool, ".obj2");
     vector < SysTestRunnable* > vec;
     vec.push_back(&r1);
@@ -288,7 +288,7 @@ int main(int argc, const char **argv)
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
     StRadosListObjects r2(argc, argv, pool, false, g_num_objects / 2,
-                         pool_setup_sem, modify_sem);
+                         pool_setup_sem, modify_sem, NULL);
     RadosAddObjectsR r3(argc, argv, pool, ".obj2");
     RadosAddObjectsR r4(argc, argv, pool, ".obj3");
     RadosDeleteObjectsR r5(argc, argv, pool);
@@ -312,7 +312,7 @@ int main(int argc, const char **argv)
     StRadosCreatePool r1(argc, argv, NULL, pool_setup_sem, NULL,
                         pool, g_num_objects, ".obj");
     StRadosListObjects r2(argc, argv, pool, false, g_num_objects / 2,
-                         pool_setup_sem, modify_sem);
+                         pool_setup_sem, modify_sem, NULL);
     // AddObjects with the same 'suffix' as used in StRadosCreatePool
     RadosAddObjectsR r3(argc, argv, pool, ".obj");
     vector < SysTestRunnable* > vec;
index 8c0db947a04d6c955cf3705c9b297b195a7cbf49..9038db2ad4bc52a6775a7cfb8e9fe145e007b07d 100644 (file)
@@ -33,12 +33,14 @@ StRadosListObjects(int argc, const char **argv,
                   bool accept_list_errors,
                   int midway_cnt,
                   CrossProcessSem *pool_setup_sem,
-                  CrossProcessSem *midway_sem)
+                  CrossProcessSem *midway_sem_wait,
+                  CrossProcessSem *midway_sem_post)
   : SysTestRunnable(argc, argv),
     m_accept_list_errors(accept_list_errors),
     m_midway_cnt(midway_cnt),
     m_pool_setup_sem(pool_setup_sem),
-    m_midway_sem(midway_sem)
+    m_midway_sem_wait(midway_sem_wait),
+    m_midway_sem_post(midway_sem_post)
 {
 }
 
@@ -85,8 +87,10 @@ run()
     }
     ++saw;
     if (saw == m_midway_cnt) {
-      if (m_midway_sem)
-       m_midway_sem->wait();
+      if (m_midway_sem_wait)
+       m_midway_sem_wait->wait();
+      if (m_midway_sem_post)
+       m_midway_sem_post->post();
     }
   }
   rados_objects_list_close(h);
index e4698d7492d7ed223308e81b4f72d7231b54c197..ddb1342e8b6710b73d2c0465a771351527bb5eec 100644 (file)
@@ -37,7 +37,8 @@ public:
                     bool accept_list_errors,
                     int midway_cnt,
                     CrossProcessSem *pool_setup_sem,
-                    CrossProcessSem *midway_sem);
+                    CrossProcessSem *midway_sem_wait,
+                    CrossProcessSem *midway_sem_post);
   ~StRadosListObjects();
   virtual int run();
 private:
@@ -45,7 +46,8 @@ private:
   bool m_accept_list_errors;
   int m_midway_cnt;
   CrossProcessSem *m_pool_setup_sem;
-  CrossProcessSem *m_midway_sem;
+  CrossProcessSem *m_midway_sem_wait;
+  CrossProcessSem *m_midway_sem_post;
 };
 
 #endif