]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test_msgr: ensure wait for ms_dispatch executed 10264/head
authorHaomai Wang <haomai@xsky.com>
Mon, 18 Jul 2016 09:27:31 +0000 (17:27 +0800)
committerHaomai Wang <haomai@xsky.com>
Tue, 16 Aug 2016 15:19:25 +0000 (23:19 +0800)
Otherwise in slow runner, ms_dispatch may not executed when assert

Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/async/AsyncConnection.cc
src/test/msgr/test_msgr.cc

index 498cb03ff665ed7f73419bbd99e789f7ec4d2e8c..96142c3b661e52ecff7931ef2a556db7cae96285 100644 (file)
@@ -2006,8 +2006,8 @@ void AsyncConnection::fault()
   }
 
   write_lock.lock();
-  shutdown_socket();
   can_write = WriteStatus::NOWRITE;
+  shutdown_socket();
   open_write = false;
 
   // queue delayed items immediately
index a94c77125b294c38419c768a741da2613dafa2e3..05fcbbe4ba43715c0af07eaea24218dc6a500d98 100644 (file)
@@ -175,6 +175,7 @@ class FakeDispatcher : public Dispatcher {
       s->put();
     }
     got_remote_reset = true;
+    cond.Signal();
   }
   void ms_fast_dispatch(Message *m) {
     Mutex::Locker l(lock);
@@ -450,6 +451,7 @@ TEST_P(MessengerTest, StatefulTest) {
   // don't lose state
   ASSERT_TRUE(static_cast<Session*>(server_conn->get_priv())->get_count() == 1);
 
+  srv_dispatcher.got_new = false;
   conn = client_msgr->get_connection(server_msgr->get_myinst());
   {
     m = new MPing();
@@ -461,14 +463,26 @@ TEST_P(MessengerTest, StatefulTest) {
   }
   ASSERT_TRUE(static_cast<Session*>(conn->get_priv())->get_count() == 1);
   server_conn = server_msgr->get_connection(client_msgr->get_myinst());
-  ASSERT_TRUE(static_cast<Session*>(server_conn->get_priv())->get_count() == 1);
+  {
+    Mutex::Locker l(srv_dispatcher.lock);
+    while (!srv_dispatcher.got_remote_reset)
+      srv_dispatcher.cond.Wait(srv_dispatcher.lock);
+  }
 
   // 2. test for client reconnect
   ASSERT_FALSE(cli_dispatcher.got_remote_reset);
   cli_dispatcher.got_connect = false;
+  cli_dispatcher.got_new = false;
+  cli_dispatcher.got_remote_reset = false;
   server_conn->mark_down();
   ASSERT_FALSE(server_conn->is_connected());
   // ensure client detect server socket closed
+  {
+    Mutex::Locker l(cli_dispatcher.lock);
+    while (!cli_dispatcher.got_remote_reset)
+      cli_dispatcher.cond.Wait(cli_dispatcher.lock);
+    cli_dispatcher.got_remote_reset = false;
+  }
   {
     Mutex::Locker l(cli_dispatcher.lock);
     while (!cli_dispatcher.got_connect)
@@ -477,6 +491,7 @@ TEST_P(MessengerTest, StatefulTest) {
   }
   CHECK_AND_WAIT_TRUE(conn->is_connected());
   ASSERT_TRUE(conn->is_connected());
+
   {
     m = new MPing();
     ASSERT_EQ(conn->send_message(m), 0);
@@ -487,10 +502,9 @@ TEST_P(MessengerTest, StatefulTest) {
     cli_dispatcher.got_new = false;
   }
   // resetcheck happen
-  ASSERT_TRUE(static_cast<Session*>(conn->get_priv())->get_count() == 1);
+  ASSERT_EQ(static_cast<Session*>(conn->get_priv())->get_count(), 1);
   server_conn = server_msgr->get_connection(client_msgr->get_myinst());
-  ASSERT_TRUE(static_cast<Session*>(server_conn->get_priv())->get_count() == 1);
-  ASSERT_TRUE(cli_dispatcher.got_remote_reset);
+  ASSERT_EQ(static_cast<Session*>(server_conn->get_priv())->get_count(), 1);
   cli_dispatcher.got_remote_reset = false;
 
   server_msgr->shutdown();
@@ -529,6 +543,7 @@ TEST_P(MessengerTest, StatelessTest) {
   conn->mark_down();
   ASSERT_FALSE(conn->is_connected());
 
+  srv_dispatcher.got_new = false;
   conn = client_msgr->get_connection(server_msgr->get_myinst());
   {
     m = new MPing();
@@ -541,7 +556,12 @@ TEST_P(MessengerTest, StatelessTest) {
   ASSERT_TRUE(static_cast<Session*>(conn->get_priv())->get_count() == 1);
   ConnectionRef server_conn = server_msgr->get_connection(client_msgr->get_myinst());
   // server lose state
-  ASSERT_TRUE(static_cast<Session*>(server_conn->get_priv())->get_count() == 1);
+  {
+    Mutex::Locker l(srv_dispatcher.lock);
+    while (!srv_dispatcher.got_new)
+      srv_dispatcher.cond.Wait(srv_dispatcher.lock);
+  }
+  ASSERT_EQ(static_cast<Session*>(server_conn->get_priv())->get_count(), 1);
 
   // 2. test for client lossy
   server_conn->mark_down();