From fc7758c455c3cb439b5f129ed9b520cf20cbfc94 Mon Sep 17 00:00:00 2001 From: prachi Date: Tue, 31 Jan 2012 18:28:47 -0800 Subject: [PATCH] Bug 13224 - Network Usage - Netscaler - External device is being queried multiple times (up to 8 times) whenever the Network Usage task is run. Reviewed-By: Kishan Changes: - Added local cache to store the usage answer per LB device per zone - Also there can be multiple domainRouters for an account. We can avoid processing the same account for usage by maintaining accounts already processed. --- ...ExternalLoadBalancerDeviceManagerImpl.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 3dc115ae68d..3d616be2e29 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -1024,9 +1024,19 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase if (domainRoutersInZone == null) { continue; } - + Map lbDeviceUsageAnswerMap = new HashMap(); + List accountsProcessed = new ArrayList(); + for (DomainRouterVO domainRouter : domainRoutersInZone) { long accountId = domainRouter.getAccountId(); + + if(accountsProcessed.contains(new Long(accountId))){ + if(s_logger.isTraceEnabled()){ + s_logger.trace("Networks for Account " + accountId + " are already processed for external network usage, so skipping usage check."); + } + continue; + } + long zoneId = zone.getId(); List networksForAccount = _networkDao.listBy(accountId, zoneId, Network.GuestType.Isolated); @@ -1046,16 +1056,25 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase } // Get network stats from the external load balancer - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); ExternalNetworkResourceUsageAnswer lbAnswer = null; + HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); if (externalLoadBalancer != null) { - lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - if (lbAnswer == null || !lbAnswer.getResult()) { - String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; - String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + "."; - s_logger.error(msg); - continue; + Long lbDeviceId = new Long(externalLoadBalancer.getId()); + if(!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)){ + ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); + lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + if (lbAnswer == null || !lbAnswer.getResult()) { + String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; + String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + "."; + s_logger.error(msg); + continue; + } + lbDeviceUsageAnswerMap.put(lbDeviceId, lbAnswer); + }else{ + if(s_logger.isTraceEnabled()){ + s_logger.trace("Reusing usage Answer for device id "+ lbDeviceId + "for Network " + network.getId()); + } + lbAnswer = lbDeviceUsageAnswerMap.get(lbDeviceId); } } @@ -1071,6 +1090,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase manageStatsEntries(false, accountId, zoneId, network, externalLoadBalancer, lbAnswer); } + + accountsProcessed.add(new Long(accountId)); } } }