diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8a1ea05b800..64d1179a2cd 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -794,6 +794,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.debug("Lock on router " + routerId + " is acquired"); boolean started = false; + String vnet = null; + boolean vnetAllocated = false; try { final State state = router.getState(); if (state == State.Running) { @@ -847,8 +849,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager throw new ConcurrentOperationException("Someone else is starting the router: " + router.toString()); } - String vnet = null; - boolean vnetAllocated = false; final boolean mirroredVols = router.isMirroredVols(); try { event = new EventVO(); @@ -862,6 +862,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager for (final UserVmVO vm : vms) { if (vm.getVnet() != null) { vnet = vm.getVnet(); + break; } } } @@ -1002,28 +1003,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return _routerDao.findById(routerId); } catch (final Throwable th) { - Transaction txn = Transaction.currentTxn(); - if (!started) { - txn.start(); - if (vnetAllocated == true && vnet != null) { - _dcDao.releaseVnet(vnet, router.getDataCenterId(), router.getAccountId()); - } - - router.setVnet(null); - String privateIpAddress = router.getPrivateIpAddress(); - - router.setPrivateIpAddress(null); - - if (privateIpAddress != null) { - _dcDao.releasePrivateIpAddress(privateIpAddress, router.getDataCenterId(), router.getId()); - } - - - if (_routerDao.updateIf(router, Event.OperationFailed, null)) { - txn.commit(); - } - } - if (th instanceof ExecutionException) { s_logger.error("Error while starting router due to " + th.getMessage()); } else if (th instanceof ConcurrentOperationException) { @@ -1036,13 +1015,28 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return null; } } finally { - if (router != null) { - - if(s_logger.isDebugEnabled()) - s_logger.debug("Releasing lock on router " + routerId); - _routerDao.release(routerId); - } - if (!started){ + + if (!started){ + Transaction txn = Transaction.currentTxn(); + txn.start(); + if (vnetAllocated == true && vnet != null) { + _dcDao.releaseVnet(vnet, router.getDataCenterId(), router.getAccountId()); + } + + router.setVnet(null); + String privateIpAddress = router.getPrivateIpAddress(); + + router.setPrivateIpAddress(null); + + if (privateIpAddress != null) { + _dcDao.releasePrivateIpAddress(privateIpAddress, router.getDataCenterId(), router.getId()); + } + + + if (_routerDao.updateIf(router, Event.OperationFailed, null)) { + txn.commit(); + } + EventVO event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); @@ -1051,7 +1045,14 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager event.setLevel(EventVO.LEVEL_ERROR); event.setStartId(startEventId); _eventDao.persist(event); + } + + if (router != null) { + if(s_logger.isDebugEnabled()) + s_logger.debug("Releasing lock on router " + routerId); + _routerDao.release(routerId); } + } }