You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by an...@apache.org on 2014/03/25 18:43:51 UTC
git commit: updated refs/heads/4.4 to 6837333
Repository: cloudstack
Updated Branches:
refs/heads/4.4 1b34959c8 -> 683733339
check_heartbeat and pingtest execute through ssh, not XAPI, because XAPI may hang when master host is downi
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/68373333
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/68373333
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/68373333
Branch: refs/heads/4.4
Commit: 6837333393952353a01d3d7063f265c44ac1db1f
Parents: 1b34959
Author: Anthony Xu <an...@citrix.com>
Authored: Tue Mar 25 10:42:31 2014 -0700
Committer: Anthony Xu <an...@citrix.com>
Committed: Tue Mar 25 10:43:25 2014 -0700
----------------------------------------------------------------------
.../xen/resource/CitrixResourceBase.java | 43 ++++++++++----
.../xen/resource/XenServer56FP1Resource.java | 4 +-
.../xen/resource/XenServer56Resource.java | 62 +++++++++++++-------
.../vm/hypervisor/xenserver/check_heartbeat.sh | 1 +
scripts/vm/hypervisor/xenserver/vmopspremium | 16 +----
5 files changed, 78 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/68373333/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 35bbcd1..d3fdb19 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -406,17 +406,28 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
- protected boolean pingXenServer() {
+ protected boolean pingXAPI() {
Connection conn = getConnection();
try {
+ Host host = Host.getByUuid(conn, _host.uuid);
+ if( !host.getEnabled(conn) ) {
+ s_logger.debug("Host " + _host.ip + " is not enabled!");
+ return false;
+ }
+ } catch (Exception e) {
+ s_logger.debug("cannot get host enabled status, host " + _host.ip + " due to " + e.toString(), e);
+ return false;
+ }
+ try {
callHostPlugin(conn, "echo", "main");
- return true;
} catch (Exception e) {
s_logger.debug("cannot ping host " + _host.ip + " due to " + e.toString(), e);
+ return false;
}
- return false;
+ return true;
}
+
protected String logX(XenAPIObject obj, String msg) {
return new StringBuilder("Host ").append(_host.ip).append(" ").append(obj.toWireString()).append(": ").append(msg).toString();
}
@@ -2006,12 +2017,24 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
private boolean doPingTest(Connection conn, final String computingHostIp) {
- String args = "-h " + computingHostIp;
- String result = callHostPlugin(conn, "vmops", "pingtest", "args", args);
- if (result == null || result.isEmpty()) {
+ com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ try {
+ sshConnection.connect(null, 60000, 60000);
+ if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
+ throw new CloudRuntimeException("Unable to authenticate");
+ }
+
+ String cmd = "ping -c 2 " + computingHostIp;
+ if (!SSHCmdHelper.sshExecuteCmd(sshConnection, cmd)) {
+ throw new CloudRuntimeException("Cannot ping host " + computingHostIp + " from host " + _host.ip);
+ }
+ return true;
+ } catch (Exception e) {
+ s_logger.warn("Catch exception " + e.toString(), e);
return false;
+ } finally {
+ sshConnection.close();
}
- return true;
}
protected CheckOnHostAnswer execute(CheckOnHostCommand cmd) {
@@ -2238,7 +2261,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
protected CheckHealthAnswer execute(CheckHealthCommand cmd) {
- boolean result = pingXenServer();
+ boolean result = pingXAPI();
return new CheckHealthAnswer(cmd, result);
}
@@ -4341,9 +4364,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
@Override
public PingCommand getCurrentStatus(long id) {
try {
- if (!pingXenServer()) {
+ if (!pingXAPI()) {
Thread.sleep(1000);
- if (!pingXenServer()) {
+ if (!pingXAPI()) {
s_logger.warn(" can not ping xenserver " + _host.uuid);
return null;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/68373333/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
index 7143627..ee9b05d 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java
@@ -73,12 +73,10 @@ public class XenServer56FP1Resource extends XenServer56Resource {
protected FenceAnswer execute(FenceCommand cmd) {
Connection conn = getConnection();
try {
- String result = callHostPluginPremium(conn, "check_heartbeat", "host", cmd.getHostGuid(), "interval", Integer.toString(_heartbeatInterval * 2));
- if (!result.contains("> DEAD <")) {
+ if (check_heartbeat(cmd.getHostGuid())) {
s_logger.debug("Heart beat is still going so unable to fence");
return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
}
-
Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
for (VM vm : vms) {
Set<VDI> vdis = new HashSet<VDI>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/68373333/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
index 7e26a5c..9952ded 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java
@@ -28,6 +28,7 @@ import com.cloud.agent.api.StartupCommand;
import com.cloud.resource.ServerResource;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
+import com.cloud.utils.ssh.SSHCmdHelper;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Host;
import com.xensource.xenapi.Network;
@@ -208,15 +209,37 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
+ protected Boolean check_heartbeat(String hostuuid) {
+ com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ try {
+ sshConnection.connect(null, 60000, 60000);
+ if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
+ throw new CloudRuntimeException("Unable to authenticate");
+ }
+
+ String shcmd = "/opt/cloud/bin/check_heartbeat.sh " + hostuuid + " "
+ + Integer.toString(_heartbeatInterval * 2);
+ if (!SSHCmdHelper.sshExecuteCmd(sshConnection, shcmd)) {
+ s_logger.debug("Heart beat is gone so dead.");
+ return false;
+ }
+ s_logger.debug("Heart beat is still going");
+ return true;
+ } catch (Exception e) {
+ s_logger.debug("health check failed due to catch exception " + e.toString());
+ return null;
+ } finally {
+ sshConnection.close();
+ }
+ }
+
protected FenceAnswer execute(FenceCommand cmd) {
Connection conn = getConnection();
try {
- String result = callHostPluginPremium(conn, "check_heartbeat", "host", cmd.getHostGuid(), "interval", Integer.toString(_heartbeatInterval * 2));
- if (!result.contains("> DEAD <")) {
+ if (check_heartbeat(cmd.getHostGuid())) {
s_logger.debug("Heart beat is still going so unable to fence");
return new FenceAnswer(cmd, false, "Heartbeat is still going on unable to fence");
}
-
Set<VM> vms = VM.getByNameLabel(conn, cmd.getVmName());
for (VM vm : vms) {
synchronized (_cluster.intern()) {
@@ -236,6 +259,7 @@ public class XenServer56Resource extends CitrixResourceBase {
}
}
+
@Override
protected boolean transferManagementNetwork(Connection conn, Host host, PIF src, PIF.Record spr, PIF dest) throws XmlRpcException, XenAPIException {
dest.reconfigureIp(conn, spr.ipConfigurationMode, spr.IP, spr.netmask, spr.gateway, spr.DNS);
@@ -269,33 +293,29 @@ public class XenServer56Resource extends CitrixResourceBase {
@Override
public StartupCommand[] initialize() {
- pingXenServer();
+ pingXAPI();
StartupCommand[] cmds = super.initialize();
return cmds;
}
+
@Override
protected CheckOnHostAnswer execute(CheckOnHostCommand cmd) {
- try {
- Connection conn = getConnection();
- String result = callHostPluginPremium(conn, "check_heartbeat", "host", cmd.getHost().getGuid(), "interval", Integer.toString(_heartbeatInterval * 2));
- if (result == null) {
- return new CheckOnHostAnswer(cmd, "Unable to call plugin");
- }
- if (result.contains("> DEAD <")) {
- s_logger.debug("Heart beat is gone so dead.");
- return new CheckOnHostAnswer(cmd, false, "Heart Beat is done");
- } else if (result.contains("> ALIVE <")) {
- s_logger.debug("Heart beat is still going");
- return new CheckOnHostAnswer(cmd, true, "Heartbeat is still going");
- }
- return new CheckOnHostAnswer(cmd, null, "Unable to determine");
- } catch (Exception e) {
- s_logger.warn("Unable to fence", e);
- return new CheckOnHostAnswer(cmd, e.getMessage());
+ Boolean alive = check_heartbeat(cmd.getHost().getGuid());
+ String msg = "";
+ if (alive == null) {
+ msg = " cannot determine ";
+ } else if ( alive == true) {
+ msg = "Heart beat is still going";
+ } else {
+ msg = "Heart beat is gone so dead.";
}
+ s_logger.debug(msg);
+ return new CheckOnHostAnswer(cmd, alive, msg);
+
}
+
public XenServer56Resource() {
super();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/68373333/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/check_heartbeat.sh b/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
index 22befe9..e1b1827 100755
--- a/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
+++ b/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
@@ -72,3 +72,4 @@ do
done
echo "=====> DEAD <======"
+exit 1
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/68373333/scripts/vm/hypervisor/xenserver/vmopspremium
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/vmopspremium b/scripts/vm/hypervisor/xenserver/vmopspremium
index 06b0a51..2887436 100755
--- a/scripts/vm/hypervisor/xenserver/vmopspremium
+++ b/scripts/vm/hypervisor/xenserver/vmopspremium
@@ -123,18 +123,7 @@ def setup_heartbeat_file(session, args):
txt = ''
return txt
-@echo
-def check_heartbeat(session, args):
- host = args['host']
- interval = args['interval']
- try:
- cmd = ["bash", "/opt/cloud/bin/check_heartbeat.sh", host, interval]
- txt = util.pread2(cmd)
- except:
- txt=''
- return txt
-
-
+
@echo
def heartbeat(session, args):
host = args['host']
@@ -156,5 +145,4 @@ def asmonitor(session, args):
return 'fail'
if __name__ == "__main__":
- XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "check_heartbeat":check_heartbeat, "heartbeat": heartbeat, "asmonitor": asmonitor})
-
+ XenAPIPlugin.dispatch({"forceShutdownVM":forceShutdownVM, "upgrade_snapshot":upgrade_snapshot, "create_privatetemplate_from_snapshot":create_privatetemplate_from_snapshot, "copy_vhd_to_secondarystorage":copy_vhd_to_secondarystorage, "copy_vhd_from_secondarystorage":copy_vhd_from_secondarystorage, "setup_heartbeat_sr":setup_heartbeat_sr, "setup_heartbeat_file":setup_heartbeat_file, "heartbeat": heartbeat, "asmonitor": asmonitor})