diff --git a/src/bgp/state_machine.cc b/src/bgp/state_machine.cc index 7f0eab44cb9..c997ff45802 100644 --- a/src/bgp/state_machine.cc +++ b/src/bgp/state_machine.cc @@ -1137,11 +1137,12 @@ void StateMachine::SetAdminState(bool down) { if (down) { Enqueue(fsm::EvStop(BgpProto::Notification::AdminShutdown)); } else { + // Reset all previous state. reset_idle_hold_time(); - peer_->reset_flap_count(); - // On fresh restart of state machine, all previous state should be reset reset_last_info(); - Enqueue(fsm::EvStart()); + peer_->reset_flap_count(); + if (!peer_->IsCloseInProgress()) + Enqueue(fsm::EvStart()); } } diff --git a/src/bgp/test/bgp_server_test.cc b/src/bgp/test/bgp_server_test.cc index c17d4fa4ea2..b3223691715 100644 --- a/src/bgp/test/bgp_server_test.cc +++ b/src/bgp/test/bgp_server_test.cc @@ -2,7 +2,7 @@ * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. */ - +#include "base/task_annotations.h" #include "bgp/bgp_config_parser.h" #include "bgp/bgp_factory.h" #include "bgp/bgp_peer_membership.h" @@ -1224,6 +1224,7 @@ TEST_F(BgpServerUnitTest, ChangePeerAddressFamilies) { } TEST_F(BgpServerUnitTest, AdminDown) { + ConcurrencyScope scope("bgp::Config"); int peer_count = 3; BgpPeerTest::verbose_name(true); @@ -1867,6 +1868,7 @@ TEST_F(BgpServerUnitTest, Passive2) { } TEST_F(BgpServerUnitTest, ResetStatsOnFlap) { + ConcurrencyScope scope("bgp::Config"); int peer_count = 3; StateMachineTest::set_keepalive_time_msecs(10); @@ -2650,6 +2652,7 @@ TEST_F(BgpServerUnitTest, DeleteInProgress) { } TEST_F(BgpServerUnitTest, CloseInProgress) { + ConcurrencyScope scope("bgp::Config"); int peer_count = 3; vector families_a; @@ -2702,6 +2705,7 @@ TEST_F(BgpServerUnitTest, CloseInProgress) { } TEST_F(BgpServerUnitTest, CloseDeferred) { + ConcurrencyScope scope("bgp::Config"); int peer_count = 3; vector families_a; diff --git a/src/bgp/test/bgp_server_test_util.cc b/src/bgp/test/bgp_server_test_util.cc index 66d650b22ca..7cf8cd787e1 100644 --- a/src/bgp/test/bgp_server_test_util.cc +++ b/src/bgp/test/bgp_server_test_util.cc @@ -6,6 +6,7 @@ #include +#include "base/task_annotations.h" #include "bgp/bgp_config_ifmap.h" #include "bgp/bgp_config_parser.h" #include "bgp/bgp_factory.h" @@ -138,6 +139,7 @@ BgpPeer *BgpServerTest::FindMatchingPeer(const string &routing_instance, } void BgpServerTest::DisableAllPeers() { + ConcurrencyScope scope("bgp::Config"); for (BgpPeerList::iterator it = peer_list_.begin(); it != peer_list_.end(); ++it) { it->second->SetAdminState(true); @@ -145,6 +147,7 @@ void BgpServerTest::DisableAllPeers() { } void BgpServerTest::EnableAllPeers() { + ConcurrencyScope scope("bgp::Config"); for (BgpPeerList::iterator it = peer_list_.begin(); it != peer_list_.end(); ++it) { it->second->SetAdminState(false); diff --git a/src/bgp/test/bgp_stress_test.cc b/src/bgp/test/bgp_stress_test.cc index 408bd23d25c..f76a66e8801 100644 --- a/src/bgp/test/bgp_stress_test.cc +++ b/src/bgp/test/bgp_stress_test.cc @@ -11,6 +11,7 @@ #include #include +#include "base/task_annotations.h" #include "base/test/addr_test_util.h" #include "bgp/bgp_config_parser.h" @@ -2103,6 +2104,7 @@ void BgpStressTest::DeleteBgpPeers(int npeers) { } void BgpStressTest::ClearBgpPeer(vector peer_ids) { + ConcurrencyScope scope("bgp::Config"); map established; map flap_count; diff --git a/src/bgp/test/state_machine_test.cc b/src/bgp/test/state_machine_test.cc index 3d1152d35a4..2de5e43bccc 100644 --- a/src/bgp/test/state_machine_test.cc +++ b/src/bgp/test/state_machine_test.cc @@ -394,10 +394,12 @@ class StateMachineUnitTest : public ::testing::Test { sm_->Shutdown(BgpProto::Notification::AdminShutdown); } void EvAdminUp() { + ConcurrencyScope scope("bgp::Config"); peer_->SetAdminState(false); sm_->set_idle_hold_time(1); } void EvAdminDown() { + ConcurrencyScope scope("bgp::Config"); peer_->SetAdminState(true); sm_->set_idle_hold_time(1); }