From 917ed9665b8340263d1dda8b5f40d608a1d8e845 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Fri, 19 Dec 2014 22:28:54 +0800 Subject: [PATCH] test_msgr: Avoid deadlock between send_message and dispatch If connection holds Connection's lock and try to acquire FakeDispatcher's lock while gtest thread try to send_message with FakeDispatcher's lock and try to acquire Connection's lock, it will be deadlock. Signed-off-by: Haomai Wang --- src/test/msgr/test_msgr.cc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/msgr/test_msgr.cc b/src/test/msgr/test_msgr.cc index 5996d213a5c72..30e9392be3227 100644 --- a/src/test/msgr/test_msgr.cc +++ b/src/test/msgr/test_msgr.cc @@ -33,7 +33,7 @@ #if GTEST_HAS_PARAM_TEST #define CHECK_AND_WAIT_TRUE(expr) do { \ - int n = 10; \ + int n = 50; \ while (--n) { \ if (expr) \ break; \ @@ -203,8 +203,8 @@ TEST_P(MessengerTest, SimpleTest) { MPing *m = new MPing(); ConnectionRef conn = client_msgr->get_connection(server_msgr->get_myinst()); { - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -223,8 +223,8 @@ TEST_P(MessengerTest, SimpleTest) { conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -248,8 +248,8 @@ TEST_P(MessengerTest, SimpleTest) { conn = client_msgr->get_loopback_connection(); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -273,8 +273,8 @@ TEST_P(MessengerTest, NameAddrTest) { MPing *m = new MPing(); ConnectionRef conn = client_msgr->get_connection(server_msgr->get_myinst()); { - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -334,8 +334,8 @@ TEST_P(MessengerTest, FeatureTest) { conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -368,8 +368,8 @@ TEST_P(MessengerTest, StatefulTest) { ConnectionRef conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -384,8 +384,8 @@ TEST_P(MessengerTest, StatefulTest) { conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -410,9 +410,9 @@ TEST_P(MessengerTest, StatefulTest) { ASSERT_TRUE(conn->is_connected()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); - ASSERT_TRUE(conn->is_connected()); ASSERT_EQ(conn->send_message(m), 0); + ASSERT_TRUE(conn->is_connected()); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -450,8 +450,8 @@ TEST_P(MessengerTest, StatelessTest) { ConnectionRef conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -463,8 +463,8 @@ TEST_P(MessengerTest, StatelessTest) { conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -482,8 +482,8 @@ TEST_P(MessengerTest, StatelessTest) { conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -516,8 +516,8 @@ TEST_P(MessengerTest, ClientStandbyTest) { ConnectionRef conn = client_msgr->get_connection(server_msgr->get_myinst()); { m = new MPing(); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; @@ -535,8 +535,8 @@ TEST_P(MessengerTest, ClientStandbyTest) { conn->send_keepalive(); CHECK_AND_WAIT_TRUE(conn->is_connected()); ASSERT_TRUE(conn->is_connected()); - Mutex::Locker l(cli_dispatcher.lock); ASSERT_EQ(conn->send_message(m), 0); + Mutex::Locker l(cli_dispatcher.lock); while (!cli_dispatcher.got_new) cli_dispatcher.cond.Wait(cli_dispatcher.lock); cli_dispatcher.got_new = false; -- 2.39.5