From c5be183ce4d8da1689819ff04f901da46ae488da Mon Sep 17 00:00:00 2001 From: Praveen K V Date: Tue, 19 Apr 2016 00:02:10 +0530 Subject: [PATCH] Fix parallel access to flow from LogHandler 1. Need to take lock for flow in LogHandler 2. Handle EVICT_FLOW event in FlowProto::GetToken Change-Id: I4b97265c2d077c7f4a66e1a91d9d21cfd3267b6d Closes-Bug: #1571453 --- src/vnsw/agent/pkt/flow_mgmt.cc | 11 +++++------ src/vnsw/agent/pkt/flow_mgmt.h | 2 +- src/vnsw/agent/pkt/flow_proto.cc | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/vnsw/agent/pkt/flow_mgmt.cc b/src/vnsw/agent/pkt/flow_mgmt.cc index 17577dff548..da4420fd165 100644 --- a/src/vnsw/agent/pkt/flow_mgmt.cc +++ b/src/vnsw/agent/pkt/flow_mgmt.cc @@ -432,10 +432,11 @@ bool FlowMgmtManager::DBRequestHandler(FlowMgmtRequestPtr req) { } bool FlowMgmtManager::LogHandler(FlowMgmtRequestPtr req) { + FlowEntry *flow = req->flow().get(); + tbb::mutex::scoped_lock mutex(flow->mutex()); switch (req->event()) { case FlowMgmtRequest::ADD_FLOW: { - FlowEntry *flow = req->flow().get(); - LogFlow(flow, "ADD"); + LogFlowUnlocked(flow, "ADD"); //Enqueue Add request to flow-stats-collector agent_->flow_stats_manager()->AddEvent(req->flow()); @@ -447,8 +448,7 @@ bool FlowMgmtManager::LogHandler(FlowMgmtRequestPtr req) { } case FlowMgmtRequest::DELETE_FLOW: { - FlowEntry *flow = req->flow().get(); - LogFlow(flow, "DEL"); + LogFlowUnlocked(flow, "DEL"); //Enqueue Delete request to flow-stats-collector agent_->flow_stats_manager()->DeleteEvent(flow, req->params()); @@ -472,9 +472,8 @@ void FlowMgmtManager::RetryVrfDelete(uint32_t vrf_id) { } // Extract all the FlowMgmtKey for a flow -void FlowMgmtManager::LogFlow(FlowEntry *flow, const std::string &op) { +void FlowMgmtManager::LogFlowUnlocked(FlowEntry *flow, const std::string &op) { FlowInfo trace; - tbb::mutex::scoped_lock mutex(flow->mutex()); flow->FillFlowInfo(trace); FLOW_TRACE(Trace, op, trace); } diff --git a/src/vnsw/agent/pkt/flow_mgmt.h b/src/vnsw/agent/pkt/flow_mgmt.h index 515687a9f8d..3c48f9d739f 100644 --- a/src/vnsw/agent/pkt/flow_mgmt.h +++ b/src/vnsw/agent/pkt/flow_mgmt.h @@ -1080,7 +1080,7 @@ class FlowMgmtManager { FlowEntryInfo *LocateFlowEntryInfo(FlowEntryPtr &flow); void DeleteFlowEntryInfo(FlowEntryPtr &flow); void MakeFlowMgmtKeyTree(FlowEntry *flow, FlowMgmtKeyTree *tree); - void LogFlow(FlowEntry *flow, const std::string &op); + void LogFlowUnlocked(FlowEntry *flow, const std::string &op); void SetAceSandeshData(const AclDBEntry *acl, AclFlowCountResp &data, int ace_id); void SetAclFlowSandeshData(const AclDBEntry *acl, AclFlowResp &data, diff --git a/src/vnsw/agent/pkt/flow_proto.cc b/src/vnsw/agent/pkt/flow_proto.cc index c67ada97053..2d251639ba7 100644 --- a/src/vnsw/agent/pkt/flow_proto.cc +++ b/src/vnsw/agent/pkt/flow_proto.cc @@ -652,7 +652,7 @@ FlowTokenPtr FlowProto::GetToken(FlowEvent::Event event) { return del_tokens_.GetToken(NULL); break; - // FIXME: Remove this post testing + case FlowEvent::EVICT_FLOW: case FlowEvent::INVALID: break;