diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 9882ed50353..f55b03a5bf6 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -343,6 +343,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage if (possibleAddr.getState() != State.Free) { continue; } + if (s_logger.isDebugEnabled()) { + s_logger.debug(String.format("trying ip address %s", possibleAddr.getAddress())); + } possibleAddr.setSourceNat(sourceNat); possibleAddr.setAllocatedTime(new Date()); possibleAddr.setAllocatedInDomainId(owner.getDomainId()); @@ -357,15 +360,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage possibleAddr.setAssociatedWithNetworkId(guestNetworkId); possibleAddr.setVpcId(vpcId); } - if (_ipAddressDao.lockRow(possibleAddr.getId(), true) != null) { - final IPAddressVO userIp = _ipAddressDao.findById(possibleAddr.getId()); - if (userIp.getState() == State.Free) { - possibleAddr.setState(State.Allocating); - if (_ipAddressDao.update(possibleAddr.getId(), possibleAddr)) { - finalAddress = possibleAddr; - break; - } - } + finalAddress = assignIpAddressWithLock(possibleAddr); + if (finalAddress != null) { + break; } } @@ -387,6 +384,29 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage }); } + private IPAddressVO assignIpAddressWithLock(IPAddressVO possibleAddr) { + IPAddressVO finalAddress = null; + IPAddressVO userIp = _ipAddressDao.acquireInLockTable(possibleAddr.getId()); + if (userIp != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug(String.format("locked row for ip address %s (id: %s)", possibleAddr.getAddress(), possibleAddr.getUuid())); + } + if (userIp.getState() == State.Free) { + possibleAddr.setState(State.Allocating); + if (_ipAddressDao.update(possibleAddr.getId(), possibleAddr)) { + s_logger.info(String.format("successfully allocated ip address %s", possibleAddr.getAddress())); + finalAddress = possibleAddr; + } + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug(String.format("locked ip address %s is not free (%s)", possibleAddr.getAddress(), userIp.getState())); + } + } + _ipAddressDao.releaseFromLockTable(possibleAddr.getId()); + } + return finalAddress; + } + @Override public boolean configure(String name, Map params) { // populate providers