From 368289aa122c33afdb2a433b829a0075f32a083d Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Thu, 3 Feb 2011 13:29:03 -0800 Subject: [PATCH] bug 8327: successive removeFromLoadBalancerRule(s) renders LB rule dysfunctional status 8327: resolved fixed --- .../lb/LoadBalancingRulesManagerImpl.java | 60 +++++++++++++++---- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 44c9ec0fb03..94bed73c8ac 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -113,6 +113,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, public boolean assignToLoadBalancer(long loadBalancerId, List instanceIds) { UserContext ctx = UserContext.current(); Account caller = ctx.getCaller(); + LoadBalancerVO loadBalancerLock = null; LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); if (loadBalancer == null) { @@ -163,22 +164,33 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, vmsToAdd.add(vm); } - Transaction txn = Transaction.currentTxn(); - txn.start(); - - for (UserVm vm : vmsToAdd) { - LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false); - map = _lb2VmMapDao.persist(map); - } - txn.commit(); - try { + loadBalancerLock = _lbDao.acquireInLockTable(loadBalancerId); + if(loadBalancerLock == null) + { + s_logger.warn("Failed to acquire lock to assign VM to load balance rule id " + loadBalancerId); + return false; + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + for (UserVm vm : vmsToAdd) { + LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false); + map = _lb2VmMapDao.persist(map); + } + txn.commit(); + loadBalancer.setState(FirewallRule.State.Add); _lbDao.persist(loadBalancer); applyLoadBalancerConfig(loadBalancerId); } catch (ResourceUnavailableException e) { s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); return false; + } finally { + if (loadBalancerLock != null) { + _lbDao.releaseFromLockTable(loadBalancerId); + } } return true; @@ -188,6 +200,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, @Override @ActionEvent (eventType=EventTypes.EVENT_REMOVE_FROM_LOAD_BALANCER_RULE, eventDescription="removing from load balancer", async=true) public boolean removeFromLoadBalancer(long loadBalancerId, List instanceIds) { UserContext caller = UserContext.current(); + LoadBalancerVO loadBalancerLock = null; LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(loadBalancerId)); if (loadBalancer == null) { @@ -195,8 +208,15 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, } _accountMgr.checkAccess(caller.getCaller(), loadBalancer); - + try { + loadBalancerLock = _lbDao.acquireInLockTable(loadBalancerId); + if (loadBalancerLock == null) + { + s_logger.warn("Failed to acquire lock to delete load balance rule id " + loadBalancerId); + return false; + } + loadBalancer.setState(FirewallRule.State.Add); _lbDao.persist(loadBalancer); @@ -218,6 +238,10 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, } catch (ResourceUnavailableException e) { s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); return false; + } finally { + if (loadBalancerLock != null) { + _lbDao.releaseFromLockTable(loadBalancerId); + } } return true; @@ -264,7 +288,8 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, @Override @ActionEvent (eventType=EventTypes.EVENT_LOAD_BALANCER_DELETE, eventDescription="deleting load balancer", async=true) public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply) { UserContext caller = UserContext.current(); - + LoadBalancerVO loadBalancerLock = null; + LoadBalancerVO lb = _lbDao.findById(loadBalancerId); if (lb == null) { throw new InvalidParameterException("Invalid load balancer value: " + loadBalancerId); @@ -272,6 +297,13 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, _accountMgr.checkAccess(caller.getCaller(), lb); + loadBalancerLock = _lbDao.acquireInLockTable(loadBalancerId); + if(loadBalancerLock == null) + { + s_logger.warn("Failed to acquire lock to delete load balance rule id " + loadBalancerId); + return false; + } + lb.setState(FirewallRule.State.Revoke); _lbDao.persist(lb); @@ -290,10 +322,14 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, } catch (ResourceUnavailableException e) { s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); return false; + } finally { + if (loadBalancerLock != null) + _lbDao.releaseFromLockTable(loadBalancerId); } } - + _rulesDao.remove(lb.getId()); + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0 , lb.getId(), null); _usageEventDao.persist(usageEvent); s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");