From a18d5c25d192433e44a3baf1bc79c2bccc24100b Mon Sep 17 00:00:00 2001 From: abhi Date: Wed, 25 Jan 2012 06:28:49 +0530 Subject: [PATCH 1/6] bug 12849: during fence command, remove vm state from sync so that it is not reported as stopped reviewed by: anthony --- .../cloud/hypervisor/xen/resource/XenServer56Resource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java index e72332c1c8c..9a5e5e52902 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java @@ -224,6 +224,11 @@ public class XenServer56Resource extends CitrixResourceBase { for (VM vm : vms) { vm.powerStateReset(conn); vm.destroy(conn); + //remove the VM from s_vms + synchronized (_cluster.intern()) { + s_logger.info("Fence command for VM " + vm.getNameLabel(conn)); + s_vms.remove(_cluster, _name, vm.getNameLabel(conn)); + } } return new FenceAnswer(cmd); } catch (XmlRpcException e) { From 58d310a0e78f45809cad6ca102a3220e8e57fc3c Mon Sep 17 00:00:00 2001 From: abhi Date: Wed, 25 Jan 2012 06:33:11 +0530 Subject: [PATCH 2/6] bug 12849: during fence command, remove vm state from sync so that it is not reported as stopped2.2.y reviewed by: anthony --- .../hypervisor/xen/resource/XenServer56FP1Resource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java index 9cf0103f8aa..3d20fe7f96f 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java @@ -106,6 +106,11 @@ public class XenServer56FP1Resource extends XenServer56Resource { } } } + //remove the VM from s_vms + synchronized (_cluster.intern()) { + s_logger.info("Fence command for VM " + vm.getNameLabel(conn)); + s_vms.remove(_cluster, _name, vm.getNameLabel(conn)); + } } return new FenceAnswer(cmd); } catch (XmlRpcException e) { From b4d14931f102b175fe7e7eea5a80c44c2fed1f17 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Fri, 20 Jan 2012 17:04:17 -0800 Subject: [PATCH 3/6] execute fencecommand in seq for kvm, as there are only 5 default nio reading work threads on kvm agent. pinganswer may not be got serviced immediately, then agent will reconnect to mgt server again and again --- agent/src/com/cloud/agent/Agent.java | 2 ++ api/src/com/cloud/agent/api/FenceCommand.java | 8 +++++++- server/src/com/cloud/ha/KVMFencer.java | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 843eb5734f5..734639476e9 100755 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -607,6 +607,8 @@ public class Agent implements HandlerFactory, IAgentControl { try { task.getLink().send(request.toBytes()); + //if i can send pingcommand out, means the link is ok + setLastPingResponseTime(); } catch (final ClosedChannelException e) { s_logger.warn("Unable to send request: " + request.toString()); } diff --git a/api/src/com/cloud/agent/api/FenceCommand.java b/api/src/com/cloud/agent/api/FenceCommand.java index ffbc01e51aa..8cb53523e37 100644 --- a/api/src/com/cloud/agent/api/FenceCommand.java +++ b/api/src/com/cloud/agent/api/FenceCommand.java @@ -29,12 +29,18 @@ public class FenceCommand extends Command { String vmName; String hostGuid; String hostIp; + boolean inSeq; public FenceCommand(VirtualMachine vm, Host host) { super(); vmName = vm.getInstanceName(); hostGuid = host.getGuid(); hostIp = host.getPrivateIpAddress(); + inSeq = false; + } + + public void setSeq(boolean inseq) { + inSeq = inseq; } public String getVmName() { @@ -51,6 +57,6 @@ public class FenceCommand extends Command { @Override public boolean executeInSequence() { - return false; + return inSeq; } } diff --git a/server/src/com/cloud/ha/KVMFencer.java b/server/src/com/cloud/ha/KVMFencer.java index 25f9967bbde..be2dabc6a72 100644 --- a/server/src/com/cloud/ha/KVMFencer.java +++ b/server/src/com/cloud/ha/KVMFencer.java @@ -84,6 +84,7 @@ public class KVMFencer implements FenceBuilder { List hosts = _hostDao.listByCluster(host.getClusterId()); FenceCommand fence = new FenceCommand(vm, host); + fence.setSeq(true); for (HostVO h : hosts) { if (h.getHypervisorType() == HypervisorType.KVM) { From bf4be42d9c623af2adc6e63c9e2c3d97bf29bd43 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 24 Jan 2012 18:34:43 -0800 Subject: [PATCH 4/6] bug 12711: make sure NFS storage is not considered as local storage --- vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java index 1b512c36eca..cdfdaa36abb 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java @@ -628,7 +628,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { if(ocs != null) { for(ObjectContent oc : ocs) { DatastoreSummary dsSummary = (DatastoreSummary)VmwareHelper.getPropValue(oc, "summary"); - if(dsSummary.getMultipleHostAccess() == false) { + if(dsSummary.getMultipleHostAccess() == false && dsSummary.isAccessible() && dsSummary.getType().equalsIgnoreCase("vmfs")) { ManagedObjectReference morDs = oc.getObj(); String name = (String)VmwareHelper.getPropValue(oc, "name"); From 273de60a5f6414c36d106dfe8133456bfe84b3a1 Mon Sep 17 00:00:00 2001 From: abhi Date: Wed, 25 Jan 2012 11:32:10 +0530 Subject: [PATCH 5/6] bug 12875: Every time XenServerResource sends fullsync to CS, it should clear up VM status for this cluster and update with latest VM status for this cluster getting from XAPI. reviewed by: anthony --- .../hypervisor/xen/resource/CitrixResourceBase.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 70b3beb90ee..1f3675934a8 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -6644,7 +6644,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()) { @@ -6658,7 +6660,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()); @@ -6669,7 +6673,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); } From 5da4c970e6682b1462c86660ffb7f830446c6168 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Wed, 25 Jan 2012 15:10:10 +0530 Subject: [PATCH 6/6] Bug 12897: Make updatehostpassword more robust and allow it to be used only for Xenserver hyperVisor Status 12897: resolved fixed Reviewed-By: Kishan --- .../api/commands/UpdateHostPasswordCmd.java | 5 +---- .../com/cloud/server/ManagementServerImpl.java | 16 ++++------------ 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java index 38b70b7744a..02ce463e8ab 100644 --- a/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java +++ b/api/src/com/cloud/api/commands/UpdateHostPasswordCmd.java @@ -25,9 +25,6 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.api.BaseCmd.CommandType; -import com.cloud.api.response.RegisterResponse; import com.cloud.api.response.SuccessResponse; import com.cloud.user.Account; @@ -50,7 +47,7 @@ public class UpdateHostPasswordCmd extends BaseCmd { @Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=true, description="the username for the host/cluster") private String username; - @Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, required=true, description="the password for the host/cluster") + @Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, required=true, description="the new password for the host/cluster") private String password; // /////////////////////////////////////////////////// diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index db227f54316..ed1c562ccf7 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4761,18 +4761,10 @@ public class ManagementServerImpl implements ManagementServer { throw new InvalidParameterValueException("You should provide one of cluster id or a host id."); } else if (cmd.getClusterId() == null) { HostVO host = _hostDao.findById(cmd.getHostId()); - if (host == null){ - throw new InvalidParameterValueException("The hostId " +cmd.getHostId()+ " doesnt exist"); - }if (host.getHypervisorType() != HypervisorType.KVM) { - throw new InvalidParameterValueException("This operation is not permitted for " + host.getHypervisorType() + " with the parameter hostId"); - } - DetailVO nv = _detailsDao.findDetail(host.getId(), ApiConstants.USERNAME); - if (nv.getValue().equals(cmd.getUsername())) { - DetailVO nvp = new DetailVO(host.getId(), ApiConstants.PASSWORD, cmd.getPassword()); - nvp.setValue(cmd.getPassword()); - _detailsDao.persist(nvp); - } else { - throw new InvalidParameterValueException("The username is not under use by management server."); + if (host != null && host.getHypervisorType() == HypervisorType.XenServer) { + throw new InvalidParameterValueException("You should provide cluster id for Xenserver cluster."); + }else { + throw new InvalidParameterValueException("This operation is not supported for this hypervisor type"); } } else { ClusterVO cluster = _clusterDao.findById(cmd.getClusterId());