diff --git a/src/vnsw/agent/uve/interface_uve_stats_table.cc b/src/vnsw/agent/uve/interface_uve_stats_table.cc index 90ea5669b30..3a6bd8eb144 100644 --- a/src/vnsw/agent/uve/interface_uve_stats_table.cc +++ b/src/vnsw/agent/uve/interface_uve_stats_table.cc @@ -100,8 +100,7 @@ bool InterfaceUveStatsTable::FrameInterfaceStatsMsg(UveInterfaceEntry* entry, uint32_t active_flows = 0; agent_->pkt()->get_flow_proto()->InterfaceFlowCount(vm_intf, &created, &aged, &active_flows); - bool built = agent_uve->stats_manager()->BuildFlowRate(created, aged, - s->added, s->deleted, + bool built = agent_uve->stats_manager()->BuildFlowRate(s->added, s->deleted, s->flow_info, flow_rate); if (built) { diff --git a/src/vnsw/agent/uve/stats_manager.cc b/src/vnsw/agent/uve/stats_manager.cc index 1682f8a1224..f615614ae09 100644 --- a/src/vnsw/agent/uve/stats_manager.cc +++ b/src/vnsw/agent/uve/stats_manager.cc @@ -321,9 +321,7 @@ bool StatsManager::RequestHandler(boost::shared_ptr req) { return true; } -bool StatsManager::BuildFlowRate(uint64_t total_created_flows, - uint64_t total_aged_flows, - AgentStats::FlowCounters &created, +bool StatsManager::BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const { @@ -334,17 +332,34 @@ bool StatsManager::BuildFlowRate(uint64_t total_created_flows, uint64_t diff_time = cur_time - flow_info.prev_time_; uint64_t diff_secs = diff_time / 1000000; if (diff_secs) { - uint64_t created_flows = total_created_flows - + uint64_t created_flows = created.prev_flow_count - flow_info.prev_flow_created_; - uint64_t aged_flows = total_aged_flows - flow_info.prev_flow_aged_; + uint64_t aged_flows = aged.prev_flow_count - + flow_info.prev_flow_aged_; //Flow setup/delete rate are always sent if (created_flows) { max_add_rate = created.max_flows_per_second; min_add_rate = created.min_flows_per_second; + if (max_add_rate == AgentStats::kInvalidFlowCount) { + LOG(WARN, "Invalid max_flow_adds_per_second " << max_add_rate); + max_add_rate = 0; + } + if (min_add_rate == AgentStats::kInvalidFlowCount) { + LOG(WARN, "Invalid min_flow_adds_per_second " << min_add_rate); + min_add_rate = 0; + } } if (aged_flows) { max_del_rate = aged.max_flows_per_second; min_del_rate = aged.min_flows_per_second; + if (max_del_rate == AgentStats::kInvalidFlowCount) { + LOG(WARN, "Invalid max_flow_deletes_per_second " << max_del_rate); + max_del_rate = 0; + } + if (min_del_rate == AgentStats::kInvalidFlowCount) { + LOG(WARN, "Invalid min_flow_deletes_per_second " << min_del_rate); + min_del_rate = 0; + } } flow_rate.set_added_flows(created_flows); @@ -356,8 +371,8 @@ bool StatsManager::BuildFlowRate(uint64_t total_created_flows, agent_->stats()->ResetFlowMinMaxStats(created); agent_->stats()->ResetFlowMinMaxStats(aged); flow_info.prev_time_ = cur_time; - flow_info.prev_flow_created_ = total_created_flows; - flow_info.prev_flow_aged_ = total_aged_flows; + flow_info.prev_flow_created_ = created.prev_flow_count; + flow_info.prev_flow_aged_ = aged.prev_flow_count; return true; } } else { diff --git a/src/vnsw/agent/uve/stats_manager.h b/src/vnsw/agent/uve/stats_manager.h index 4b325e8e9c4..bce3d85334f 100644 --- a/src/vnsw/agent/uve/stats_manager.h +++ b/src/vnsw/agent/uve/stats_manager.h @@ -180,8 +180,7 @@ class StatsManager { void InitDone(); bool RequestHandler(boost::shared_ptr req); void EnqueueEvent(const boost::shared_ptr &req); - bool BuildFlowRate(uint64_t flow_created, uint64_t flow_aged, - AgentStats::FlowCounters &created, + bool BuildFlowRate(AgentStats::FlowCounters &created, AgentStats::FlowCounters &aged, FlowRateComputeInfo &flow_info, VrouterFlowRate &flow_rate) const; diff --git a/src/vnsw/agent/uve/vrouter_uve_entry.cc b/src/vnsw/agent/uve/vrouter_uve_entry.cc index 8d4be06a0f5..2454990f949 100644 --- a/src/vnsw/agent/uve/vrouter_uve_entry.cc +++ b/src/vnsw/agent/uve/vrouter_uve_entry.cc @@ -193,15 +193,12 @@ bool VrouterUveEntry::SendVrouterMsg() { if (first) { stats.set_uptime(start_time_); } - uint64_t flow_created = agent_->stats()->flow_created(); - uint64_t flow_aged = agent_->stats()->flow_aged(); AgentStats::FlowCounters &added = agent_->stats()->added(); AgentStats::FlowCounters &deleted = agent_->stats()->deleted(); uint32_t active_flows = agent_->pkt()->get_flow_proto()->FlowCount(); VrouterFlowRate flow_rate; - bool built = uve->stats_manager()->BuildFlowRate(flow_created, flow_aged, - added, deleted, flow_info_, + bool built = uve->stats_manager()->BuildFlowRate(added, deleted, flow_info_, flow_rate); if (built) { flow_rate.set_active_flows(active_flows); @@ -352,8 +349,7 @@ bool VrouterUveEntry::BuildPhysicalInterfaceFlowRate agent_->pkt()->get_flow_proto()->InterfaceFlowCount(intf, &created, &aged, &active_flows); - bool built = uve->stats_manager()->BuildFlowRate(created, aged, - s->added, s->deleted, + bool built = uve->stats_manager()->BuildFlowRate(s->added, s->deleted, s->flow_info, flow_rate); if (built) {