Skip to content

Commit

Permalink
Merge "Process GR events through a work queue off bgp::Config task"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Jul 12, 2016
2 parents 306e1cb + 4c6d886 commit 7544a0f
Show file tree
Hide file tree
Showing 9 changed files with 504 additions and 435 deletions.
12 changes: 4 additions & 8 deletions src/bgp/bgp_membership.cc
Expand Up @@ -141,8 +141,7 @@ void BgpMembershipManager::RegisterRibIn(IPeer *peer, BgpTable *table) {
// Post an UNREGISTER_RIB event to deal with concurrency issues with RibOut.
//
void BgpMembershipManager::Unregister(IPeer *peer, BgpTable *table) {
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine",
"bgp::PeerMembership");
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine");

tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
current_jobs_count_++;
Expand All @@ -168,8 +167,7 @@ void BgpMembershipManager::Unregister(IPeer *peer, BgpTable *table) {
// Unregister the IPeer from the BgpTable for RIBIN.
//
void BgpMembershipManager::UnregisterRibIn(IPeer *peer, BgpTable *table) {
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine",
"bgp::PeerMembership");
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine");

tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
current_jobs_count_++;
Expand Down Expand Up @@ -201,8 +199,7 @@ void BgpMembershipManager::UnregisterRibInUnlocked(PeerRibState *prs) {
// This API is to be used when handling graceful restart of the peer.
//
void BgpMembershipManager::UnregisterRibOut(IPeer *peer, BgpTable *table) {
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine",
"bgp::PeerMembership");
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine");

tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
current_jobs_count_++;
Expand All @@ -224,8 +221,7 @@ void BgpMembershipManager::UnregisterRibOut(IPeer *peer, BgpTable *table) {
// It can also be used in future when re-evaluating import policy for a peer.
//
void BgpMembershipManager::WalkRibIn(IPeer *peer, BgpTable *table) {
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine",
"bgp::PeerMembership");
CHECK_CONCURRENCY("bgp::Config", "bgp::StateMachine", "xmpp::StateMachine");

tbb::spin_rw_mutex::scoped_lock write_lock(rw_mutex_, true);
current_jobs_count_++;
Expand Down
36 changes: 15 additions & 21 deletions src/bgp/bgp_peer.cc
Expand Up @@ -115,6 +115,8 @@ class BgpPeer::PeerClose : public IPeerClose {
peer_->ReceiveEndOfRIB(family, 0);
}

virtual void MembershipRequestCallbackComplete(bool result) { }

bool IsGRReady() const {
// Check if GR helper mode is disabled.
if (!peer_->server()->gr_helper_enable())
Expand Down Expand Up @@ -323,6 +325,8 @@ class BgpPeer::DeleteActor : public LifetimeActor {

virtual bool MayDelete() const {
CHECK_CONCURRENCY("bgp::Config");
if (!peer_->peer_close_->close_manager()->IsQueueEmpty())
return false;
if (peer_->IsCloseInProgress())
return false;
if (!peer_->state_machine_->IsQueueEmpty())
Expand All @@ -344,8 +348,7 @@ class BgpPeer::DeleteActor : public LifetimeActor {
peer_->server()->decrement_deleting_count();
}
assert(!peer_->membership_req_pending());
assert(peer_->peer_close()->close_manager()->membership_state() !=
PeerCloseManager::MEMBERSHIP_IN_USE);
assert(!peer_->peer_close_->close_manager()->IsMembershipInUse());
peer_->rtinstance_->peer_manager()->DestroyIPeer(peer_);
}

Expand Down Expand Up @@ -490,9 +493,8 @@ bool BgpPeer::CanUseMembershipManager() const {
// in question.
//
void BgpPeer::MembershipRequestCallback(BgpTable *table) {
if (peer_close_->close_manager()->membership_state() ==
PeerCloseManager::MEMBERSHIP_IN_USE) {
(void) peer_close_->close_manager()->MembershipRequestCallback();
if (peer_close_->close_manager()->IsMembershipInUse()) {
peer_close_->close_manager()->MembershipRequestCallback();
return;
}

Expand All @@ -501,8 +503,7 @@ void BgpPeer::MembershipRequestCallback(BgpTable *table) {

// Resume if CloseManager is waiting to use membership manager.
if (!membership_req_pending_ &&
peer_close_->close_manager()->membership_state() ==
PeerCloseManager::MEMBERSHIP_IN_WAIT) {
peer_close_->close_manager()->IsMembershipInWait()) {
peer_close_->close_manager()->MembershipRequest();
}

Expand Down Expand Up @@ -1037,8 +1038,7 @@ void BgpPeer::CustomClose() {
//
void BgpPeer::Close(bool non_graceful) {
if (membership_req_pending_ &&
peer_close_->close_manager()->membership_state() !=
PeerCloseManager::MEMBERSHIP_IN_USE) {
!peer_close_->close_manager()->IsMembershipInUse()) {
BGP_LOG_PEER(Event, this, SandeshLevel::SYS_INFO, BGP_LOG_FLAG_ALL,
BGP_PEER_DIR_NA, "Close procedure deferred");
defer_close_ = true;
Expand Down Expand Up @@ -1134,21 +1134,17 @@ bool BgpPeer::AcceptSession(BgpSession *session) {
}

void BgpPeer::Register(BgpTable *table, const RibExportPolicy &policy) {
assert(peer_close_->close_manager()->membership_state() !=
PeerCloseManager::MEMBERSHIP_IN_USE);
if (peer_close_->close_manager()->membership_state() ==
PeerCloseManager::MEMBERSHIP_IN_WAIT)
assert(!peer_close_->close_manager()->IsMembershipInUse());
if (peer_close_->close_manager()->IsMembershipInWait())
assert(membership_req_pending_ > 0);
BgpMembershipManager *membership_mgr = server_->membership_mgr();
membership_req_pending_++;
membership_mgr->Register(this, table, policy);
}

void BgpPeer::Register(BgpTable *table) {
assert(peer_close_->close_manager()->membership_state() !=
PeerCloseManager::MEMBERSHIP_IN_USE);
if (peer_close_->close_manager()->membership_state() ==
PeerCloseManager::MEMBERSHIP_IN_WAIT)
assert(!peer_close_->close_manager()->IsMembershipInUse());
if (peer_close_->close_manager()->IsMembershipInWait())
assert(membership_req_pending_ > 0);
BgpMembershipManager *membership_mgr = server_->membership_mgr();
membership_mgr->RegisterRibIn(this, table);
Expand Down Expand Up @@ -1649,10 +1645,8 @@ bool BgpPeer::SetGRCapabilities(BgpPeerInfoData *peer_info) {
// If GR is no longer supported, terminate GR right away. This can happen
// due to mis-match between gr and llgr afis. For now, we expect an
// identical set.
if ((peer_close_->close_manager()->state() == PeerCloseManager::GR_TIMER &&
!peer_close_->IsCloseGraceful()) ||
(peer_close_->close_manager()->state() ==
PeerCloseManager::LLGR_TIMER &&
if (peer_close_->close_manager()->IsInGracefulRestartTimerWait() &&
(!peer_close_->IsCloseGraceful() ||
!peer_close_->IsCloseLongLivedGraceful())) {
Close(true);
return false;
Expand Down

0 comments on commit 7544a0f

Please sign in to comment.