From 1beab0be3235a48785a662ba56b000de67869253 Mon Sep 17 00:00:00 2001 From: abhi Date: Thu, 2 Feb 2012 11:15:14 +0530 Subject: [PATCH] bug 12849: applying vm sync fence fix/cleanup to master --- .../xen/resource/CitrixResourceBase.java | 34 +++++++++++-------- .../xen/resource/XenServer56FP1Resource.java | 4 +++ .../xen/resource/XenServer56Resource.java | 4 +++ 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 8acb75b5fa2..bbeb9bb5e96 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -253,7 +253,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected long _dcId; protected String _pod; protected String _cluster; - private static final XenServerPoolVms s_vms = new XenServerPoolVms(); + protected static final XenServerPoolVms s_vms = new XenServerPoolVms(); protected String _privateNetworkName; protected String _linkLocalPrivateNetworkName; protected String _publicNetworkName; @@ -1090,9 +1090,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } } synchronized (_cluster.intern()) { - s_logger.debug("1. The VM " + vmName + " is in Starting state."); s_vms.put(_cluster, _name, vmName, State.Starting); } + s_logger.debug("1. The VM " + vmName + " is in Starting state."); Host host = Host.getByUuid(conn, _host.uuid); vm = createVmFromTemplate(conn, vmSpec, host); @@ -1174,11 +1174,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe } finally { synchronized (_cluster.intern()) { if (state != State.Stopped) { - s_logger.debug("2. The VM " + vmName + " is in " + state + " state."); s_vms.put(_cluster, _name, vmName, state); + s_logger.debug("2. The VM " + vmName + " is in " + state + " state."); } else { - s_logger.debug("The VM is in stopped state, detected problem during startup : " + vmName); s_vms.remove(_cluster, _name, vmName); + s_logger.debug("The VM is in stopped state, detected problem during startup : " + vmName); } } } @@ -2182,9 +2182,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe Integer vncPort = null; if (state == State.Running) { synchronized (_cluster.intern()) { - s_logger.debug("3. The VM " + vmName + " is in " + State.Running + " state"); s_vms.put(_cluster, _name, vmName, State.Running); } + s_logger.debug("3. The VM " + vmName + " is in Running state"); } return new CheckVirtualMachineAnswer(cmd, state, vncPort); @@ -2206,9 +2206,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe getNetwork(conn, nic); } synchronized (_cluster.intern()) { - s_logger.debug("4. The VM " + vm.getName() + " is in " + State.Migrating + " state"); s_vms.put(_cluster, _name, vm.getName(), State.Migrating); } + s_logger.debug("4. The VM " + vm.getName() + " is in Migrating state"); return new PrepareForMigrationAnswer(cmd); } catch (Exception e) { @@ -2473,9 +2473,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe state = s_vms.getState(_cluster, vmName); synchronized (_cluster.intern()) { - s_logger.debug("5. The VM " + vmName + " is in " + State.Stopping + " state"); s_vms.put(_cluster, _name, vmName, State.Stopping); } + s_logger.debug("5. The VM " + vmName + " is in Stopping state"); try { Set vms = VM.getByNameLabel(conn, vmName); @@ -2514,9 +2514,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return new MigrateAnswer(cmd, false, msg, null); } finally { synchronized (_cluster.intern()) { - s_logger.debug("6. The VM " + vmName + " is in " + state + " state"); s_vms.put(_cluster, _name, vmName, state); } + s_logger.debug("6. The VM " + vmName + " is in " + state + " state"); } } @@ -2639,9 +2639,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe public RebootAnswer execute(RebootCommand cmd) { Connection conn = getConnection(); synchronized (_cluster.intern()) { - s_logger.debug("7. The VM " + cmd.getVmName() + " is in " + State.Starting + " state"); s_vms.put(_cluster, _name, cmd.getVmName(), State.Starting); } + s_logger.debug("7. The VM " + cmd.getVmName() + " is in Starting state"); try { Set vms = null; try { @@ -2665,9 +2665,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe return new RebootAnswer(cmd, "reboot succeeded", null, null); } finally { synchronized (_cluster.intern()) { - s_logger.debug("8. The VM " + cmd.getVmName() + " is in " + State.Running + " state"); s_vms.put(_cluster, _name, cmd.getVmName(), State.Running); } + s_logger.debug("8. The VM " + cmd.getVmName() + " is in Running state"); } } @@ -3167,9 +3167,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe State state = s_vms.getState(_cluster, vmName); synchronized (_cluster.intern()) { - s_logger.debug("9. The VM " + vmName + " is in " + State.Stopping + " state"); s_vms.put(_cluster, _name, vmName, State.Stopping); } + s_logger.debug("9. The VM " + vmName + " is in Stopping state"); try { if (vmr.powerState == VmPowerState.RUNNING) { @@ -3231,9 +3231,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.warn(msg, e); } finally { synchronized (_cluster.intern()) { - s_logger.debug("10. The VM " + vmName + " is in " + state + " state"); s_vms.put(_cluster, _name, vmName, state); } + s_logger.debug("10. The VM " + vmName + " is in " + state + " state"); } } } @@ -6640,7 +6640,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected HashMap> fullClusterSync(Connection conn) { - XenServerPoolVms vms = new XenServerPoolVms(); + synchronized (_cluster.intern()) { + s_vms.clear(_cluster); + } try { Map vm_map = VM.getAllRecords(conn); //USE THIS TO GET ALL VMS FROM A CLUSTER for (VM.Record record: vm_map.values()) { @@ -6654,7 +6656,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe String host_uuid = null; if( ! isRefNull(host) ) { host_uuid = host.getUuid(conn); - vms.put(_cluster, host_uuid, vm_name, state); + synchronized (_cluster.intern()) { + s_vms.put(_cluster, host_uuid, vm_name, state); + } } if (s_logger.isTraceEnabled()) { s_logger.trace("VM " + vm_name + ": powerstate = " + ps + "; vm state=" + state.toString()); @@ -6665,7 +6669,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe s_logger.warn(msg, e); throw new CloudRuntimeException(msg); } - return vms.getClusterVmState(_cluster); + return s_vms.getClusterVmState(_cluster); } diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java index 9cf0103f8aa..fb5b0ee2254 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java @@ -95,6 +95,10 @@ public class XenServer56FP1Resource extends XenServer56Resource { vdis.add(vdi); } } + synchronized (_cluster.intern()) { + s_vms.remove(_cluster, _name, vm.getNameLabel(conn)); + } + s_logger.info("Fence command for VM " + cmd.getVmName()); vm.powerStateReset(conn); vm.destroy(conn); for (VDI vdi : vdis) { diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java index e72332c1c8c..02f08f02c5d 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java @@ -222,6 +222,10 @@ public class XenServer56Resource extends CitrixResourceBase { Set vms = VM.getByNameLabel(conn, cmd.getVmName()); for (VM vm : vms) { + synchronized (_cluster.intern()) { + s_vms.remove(_cluster, _name, vm.getNameLabel(conn)); + } + s_logger.info("Fence command for VM " + cmd.getVmName()); vm.powerStateReset(conn); vm.destroy(conn); }