From 75185f7bf4b22627a9d93e0ab9dcc4337bef4c89 Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Sat, 17 Aug 2013 13:30:20 +0530 Subject: [PATCH] CLOUDSTACK-3441: [Load Test] High delays between VM being allocated to Pod and network implementation causing delays in VM deployment The locking code in implement/shutdown network code was not efficient. Even in order to check the current state of the network lock was getting acquired which is not required. This resulted in delays in deploy VM as can be seen from attached logs where the code waited on the lock just to check if network is implemented. As part of the fix moved out code that is checking if the network is already implemented or shutdowned outside the lock. (cherry picked from commit 5528ba4b20593e1c883507a1e161ccb48fffa57b) Signed-off-by: animesh --- .../com/cloud/network/NetworkManagerImpl.java | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 6eea3a16ab1..087ca545415 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1865,6 +1865,19 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L return to; } + boolean isNetworkImplemented(NetworkVO network) { + Network.State state = network.getState(); + if (state == Network.State.Implemented || state == Network.State.Implementing) { + return true; + } else if (state == Network.State.Setup) { + DataCenterVO zone = _dcDao.findById(network.getDataCenterId()); + if (!isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()) || (zone.getNetworkType() == NetworkType.Basic)) { + return true; + } + } + return false; + } + @Override @DB public Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) @@ -1873,7 +1886,16 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L Transaction.currentTxn(); Pair implemented = new Pair(null, null); - NetworkVO network = _networksDao.acquireInLockTable(networkId, _networkLockTimeout); + NetworkVO network = _networksDao.findById(networkId); + NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); + if (isNetworkImplemented(network)) { + s_logger.debug("Network id=" + networkId + " is already implemented"); + implemented.set(guru, network); + return implemented; + } + + // Acquire lock only when network needs to be implemented + network = _networksDao.acquireInLockTable(networkId, _networkLockTimeout); if (network == null) { // see NetworkVO.java ConcurrentOperationException ex = new ConcurrentOperationException("Unable to acquire network configuration"); @@ -1886,23 +1908,12 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L } try { - NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); - Network.State state = network.getState(); - if (state == Network.State.Implemented || state == Network.State.Implementing) { + if (isNetworkImplemented(network)) { s_logger.debug("Network id=" + networkId + " is already implemented"); implemented.set(guru, network); return implemented; } - if (state == Network.State.Setup) { - DataCenterVO zone = _dcDao.findById(network.getDataCenterId()); - if (!isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()) || (zone.getNetworkType() == NetworkType.Basic)) { - s_logger.debug("Network id=" + networkId + " is already implemented"); - implemented.set(guru, network); - return implemented; - } - } - if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + guru.getName() + " to implement " + network); } @@ -2841,7 +2852,17 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L @DB public boolean shutdownNetwork(long networkId, ReservationContext context, boolean cleanupElements) { boolean result = false; - NetworkVO network = null; + NetworkVO network = _networksDao.findById(networkId); + if (network.getState() == Network.State.Allocated) { + s_logger.debug("Network is already shutdown: " + network); + return true; + } + + if (network.getState() != Network.State.Implemented && network.getState() != Network.State.Shutdown) { + s_logger.debug("Network is not implemented: " + network); + return false; + } + try { //do global lock for the network network = _networksDao.acquireInLockTable(networkId, getNetworkLockTimeout()); @@ -2852,12 +2873,12 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L if (s_logger.isDebugEnabled()) { s_logger.debug("Lock is acquired for network " + network + " as a part of network shutdown"); } - + if (network.getState() == Network.State.Allocated) { s_logger.debug("Network is already shutdown: " + network); return true; } - + if (network.getState() != Network.State.Implemented && network.getState() != Network.State.Shutdown) { s_logger.debug("Network is not implemented: " + network); return false; @@ -2875,7 +2896,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L } } - boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network); Transaction txn = Transaction.currentTxn();