cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bhais...@apache.org
Subject [1/2] git commit: updated refs/heads/4.3 to 6fa3d82
Date Wed, 03 Dec 2014 21:37:52 GMT
Repository: cloudstack
Updated Branches:
  refs/heads/4.3 6cd31d3a9 -> 6fa3d8255


CLOUDSTACK-5923: CS doesn't do master switch for XS any more, CS will depend on XS HA to do
master switch, XS HA needs to be enabled.

(cherry picked from commit b79f949e1bd9d62b3ebcce424608cb4b22e69897)
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>

Conflicts:
	plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
	plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
	plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/305d8aed
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/305d8aed
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/305d8aed

Branch: refs/heads/4.3
Commit: 305d8aede6d684bf7e34896529b5bc39134e213f
Parents: 6cd31d3
Author: Anthony Xu <anthony.xu@citrix.com>
Authored: Tue Jan 21 17:55:09 2014 -0800
Committer: Rohit Yadav <rohit.yadav@shapeblue.com>
Committed: Thu Dec 4 02:46:19 2014 +0530

----------------------------------------------------------------------
 .../xen/discoverer/XcpServerDiscoverer.java     |   7 +-
 .../xen/resource/CitrixResourceBase.java        |  53 +--
 .../xen/resource/XenServerConnectionPool.java   | 455 ++-----------------
 3 files changed, 47 insertions(+), 468 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/305d8aed/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index de4646f..86686a1 100755
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -188,8 +188,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer,
L
             String hostIp = ia.getHostAddress();
             Queue<String> pass=new LinkedList<String>();
             pass.add(password);
-            String masterIp = _connPool.getMasterIp(hostIp, username, pass);
-            conn = _connPool.masterConnect(masterIp, username, pass);
+            conn = _connPool.getConnect(hostIp, username, pass);
             if (conn == null) {
                 String msg = "Unable to get a connection to " + url;
                 s_logger.debug(msg);
@@ -392,7 +391,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer,
L
             password = host.getDetail("password");
             pass.add(password);
             String address = host.getPrivateIpAddress();
-            Connection hostConn = _connPool.slaveConnect(address, username, pass);
+            Connection hostConn = _connPool.getConnect(address, username, pass);
             if (hostConn == null) {
                 continue;
             }
@@ -406,7 +405,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer,
L
                 s_logger.warn("Can not get master ip address from host " + address);
             } finally {
                 try{
-                    Session.localLogout(hostConn);
+                    Session.logout(hostConn);
                 } catch (Exception e ) {
                 }
                 hostConn.dispose();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/305d8aed/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 8cf81b0..f4bc264 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
@@ -427,23 +427,12 @@ public abstract class CitrixResourceBase implements ServerResource,
HypervisorRe
     }
 
     protected boolean pingXenServer() {
-        Session slaveSession = null;
-        Connection slaveConn = null;
+        Connection conn = getConnection();
         try {
-            URL slaveUrl = null;
-            slaveUrl = _connPool.getURL(_host.ip);
-            slaveConn = new Connection(slaveUrl, 10);
-            slaveSession = _connPool.slaveLocalLoginWithPassword(slaveConn, _username, _password);
+            callHostPlugin(conn, "echo", "main");
             return true;
         } catch (Exception e) {
-        } finally {
-            if( slaveSession != null ){
-                try{
-                    Session.localLogout(slaveConn);
-                } catch (Exception e) {
-                }
-                slaveConn.dispose();
-            }
+            s_logger.debug("cannot ping host " + _host.ip + " due to " + e.toString(),  e);
         }
         return false;
     }
@@ -6067,9 +6056,9 @@ public abstract class CitrixResourceBase implements ServerResource,
HypervisorRe
     }
 
     private void CheckXenHostInfo() throws ConfigurationException {
-        Connection conn = _connPool.slaveConnect(_host.ip, _username, _password);
+        Connection conn = _connPool.getConnect(_host.ip, _username, _password);
         if( conn == null ) {
-            throw new ConfigurationException("Can not create slave connection to " + _host.ip);
+            throw new ConfigurationException("Can not create connection to " + _host.ip);
         }
         try {
             Host.Record hostRec = null;
@@ -6089,7 +6078,7 @@ public abstract class CitrixResourceBase implements ServerResource,
HypervisorRe
             }
         } finally {
             try {
-                Session.localLogout(conn);
+                Session.logout(conn);
             } catch (Exception e) {
             }
         }
@@ -7385,35 +7374,11 @@ public abstract class CitrixResourceBase implements ServerResource,
HypervisorRe
 
             Host.Record hostr = poolr.master.getRecord(conn);
             if (_host.uuid.equals(hostr.uuid)) {
-            	boolean mastermigrated = false;
                 Map<Host, Host.Record> hostMap = Host.getAllRecords(conn);
-                if (hostMap.size() != 1) {
-                	Host newMaster = null;
-                	Host.Record newMasterRecord = null;
-                	for (Map.Entry<Host, Host.Record> entry : hostMap.entrySet()) {
-                		if (_host.uuid.equals(entry.getValue().uuid)) {
-                			continue;
-                		}
-                		newMaster = entry.getKey();
-                		newMasterRecord = entry.getValue();
-                		s_logger.debug("New master for the XenPool is " + newMasterRecord.uuid
+ " : " + newMasterRecord.address);
-                		try {
-                			_connPool.switchMaster(_host.ip, _host.pool, conn, newMaster, _username,
_password, _wait);
-                			mastermigrated = true;
-                			break;
-	                    } catch (Exception e) {
-	                        s_logger.warn("Unable to switch the new master to " + newMasterRecord.uuid
+ ": " + newMasterRecord.address + " due to " + e.toString());
-                		}
-                    }
-                } else {
-                    s_logger.debug("This is last host to eject, so don't need to eject: "
+ hostuuid);
-                    return new Answer(cmd);
-                }
-                if ( !mastermigrated ) {
-                	String msg = "this host is master, and cannot designate a new master";
-                	s_logger.debug(msg);
+                if (hostMap.size() > 1) {
+                    String msg = "This host is XS master, please designate a new XS master
throught XenCenter before you delete this host from CS";
+                    s_logger.debug(msg);
                     return new Answer(cmd, false, msg);
-
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/305d8aed/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java
index cb188d5..b73bf59 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java
@@ -26,7 +26,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Queue;
-import java.util.Set;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
@@ -46,7 +45,6 @@ import com.xensource.xenapi.Pool;
 import com.xensource.xenapi.Session;
 import com.xensource.xenapi.Types;
 import com.xensource.xenapi.Types.BadServerResponse;
-import com.xensource.xenapi.Types.UuidInvalid;
 import com.xensource.xenapi.Types.XenAPIException;
 
 public class XenServerConnectionPool {
@@ -54,7 +52,6 @@ public class XenServerConnectionPool {
     protected HashMap<String /* poolUuid */, XenServerConnection> _conns = new HashMap<String,
XenServerConnection>();
     protected int _retries;
     protected int _interval;
-    protected static boolean s_managePool = true;
     protected static long s_sleepOnError = 10 * 1000; // in ms
     static {
         File file = PropertiesUtil.findConfigFile("environment.properties");
@@ -67,15 +64,11 @@ public class XenServerConnectionPool {
                 final Properties props = new Properties();
                 props.load(finputstream);
                 finputstream.close();
-                String search = props.getProperty("manage.xenserver.pool.master");
-                if (search != null) {
-                    s_managePool = Boolean.parseBoolean(search);
-                }
-                search = props.getProperty("sleep.interval.on.error");
+                String search = props.getProperty("sleep.interval.on.error");
                 if (search != null) {
                     s_sleepOnError = NumbersUtil.parseInterval(search,  10) * 1000;
                 }
-                s_logger.info("XenServer Connection Pool Configs: manage.xenserver.pool.master="
+ s_managePool + "; sleep.interval.on.error=" + s_sleepOnError);
+                s_logger.info("XenServer Connection Pool Configs: sleep.interval.on.error="
+ s_sleepOnError);
             } catch (FileNotFoundException e) {
                 s_logger.debug("File is not found", e);
             } catch (IOException e) {
@@ -212,299 +205,26 @@ public class XenServerConnectionPool {
         return false;
     }
 
-    public void switchMaster(String slaveIp, String poolUuid,
-            Connection conn, Host host, String username, Queue<String> password,
-            int wait) throws XmlRpcException, XenAPIException {
-        synchronized (poolUuid.intern()) {
-            String masterIp = host.getAddress(conn);
-            s_logger.debug("Designating the new master to " + masterIp);
-            Pool.designateNewMaster(conn, host);
-            Connection slaveConn = null;
-            Connection masterConn = null;
-            int retry = 30;
-            for (int i = 0; i < retry; i++) {
-                forceSleep(5);
-                try {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Logging on as the slave to " + slaveIp);
-                    }
-                    slaveConn = null;
-                    masterConn = null;
-                    Session slaveSession = null;
-
-                    slaveConn = new Connection(getURL(slaveIp), 10);
-                    slaveSession = slaveLocalLoginWithPassword(slaveConn, username, password);
-    
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Slave logon successful. session= "
-                                + slaveSession);
-                    }
-    
-                    Pool.Record pr = getPoolRecord(slaveConn);
-                    Host master = pr.master;
-                    String ma = master.getAddress(slaveConn);
-                    if (!ma.trim().equals(masterIp.trim())) {
-                        continue;
-                    }
-                    s_logger.debug("Logging on as the master to " + masterIp);
-                    masterConn = new Connection(getURL(masterIp), 10);
-                    loginWithPassword(masterConn, username, password, APIVersion.latest().toString());
-                    removeConnect(poolUuid);
-                    ensurePoolIntegrity(masterConn, masterIp, username, password, wait);
-                    return;
-                } catch (Types.HostIsSlave e) {
-                    s_logger.debug("HostIsSlaveException: Still waiting for the conversion
to the master"); 
-                } catch (XmlRpcException e) {
-                    s_logger.debug("XmlRpcException: Still waiting for the conversion to
the master " + e.getMessage()); 
-                } catch (Exception e) {
-                    s_logger.debug("Exception: Still waiting for the conversion to the master"
+ e.getMessage());
-                } finally {
-                    if (masterConn != null) {
-                        try {
-                            Session.logout(masterConn);
-                        } catch (Exception e) {
-                            s_logger.debug("Unable to log out of session: "
-                                    + e.getMessage());
-                        }
-                        masterConn.dispose();
-                        masterConn = null;
-                    }
-                    localLogout(slaveConn);
-                    slaveConn = null;
-                }
-            }
-            throw new CloudRuntimeException(
-                    "Unable to logon to the new master after " + retry + " retries");
-        }
-    }
-
-    private void localLogout(Connection conn) {
-        if ( conn == null )
-            return;
+    public Connection getConnect(String ip, String username, Queue<String> password)
{
+        Connection conn = new Connection(getURL(ip), 10);
         try {
-            if( s_logger.isTraceEnabled()) {
-                s_logger.trace("Logging out of the session "
-                    + conn.getSessionReference());
-            }
-            Session.localLogout(conn);
-        } catch (Exception e) {
-            s_logger.debug("localLogout has problem " + e.getMessage());
-        } finally {
-            conn.dispose();
-            conn = null;
-        }
-    }
-
-    public Connection slaveConnect(String ip, String username, Queue<String> password)
{
-        Connection conn = null;
-        try{ 
-            conn = new Connection(getURL(ip), 10);
-            slaveLocalLoginWithPassword(conn, username, password);
-            return conn;
-        }catch ( Exception e){
-            s_logger.debug("Failed to slave local login to " + ip);
-        } 
-        return null;
-    }
-    
-    public Connection masterConnect(String ip, String username, Queue<String> password)
{
-        Connection conn = null;
-        try{ 
-            conn = new Connection(getURL(ip), 10);
-            s_logger.debug("Logging on as the master to " + ip);
             loginWithPassword(conn, username, password, APIVersion.latest().toString());
-            return conn;
-        }catch ( Exception e){
-            s_logger.debug("Failed to slave local login to " + ip);
-        } 
-        throw new RuntimeException("can not log in to master " + ip);
-    }
-    
-  
-    public String getMasterIp(String ip, String username, Queue<String> password) throws
XenAPIException {
-        Connection slaveConn = null;
-        try{ 
-            slaveConn = new Connection(getURL(ip), 10);
-            slaveLocalLoginWithPassword(slaveConn, username, password);
-
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Slave logon to " + ip);
-            }
-            String masterIp = null;
-            Pool.Record pr = getPoolRecord(slaveConn);
-            Host master = pr.master;
-            masterIp = master.getAddress(slaveConn);
-            return masterIp;
-        }catch(Types.SessionAuthenticationFailed e){
-        	s_logger.debug("Failed to slave local login to " + ip + " due to " + e.toString());
-        	throw e;
-        }catch ( Exception e){
-            s_logger.debug("Failed to slave local login to " + ip + " due to " + e.toString());
-        } finally {
-            localLogout(slaveConn);
-            slaveConn = null;
-        }
-        throw new RuntimeException("can not get master ip");
-    }
-
-
-    void PoolEmergencyTransitionToMaster(String slaveIp, String username, Queue<String>
password) {
-        if (!s_managePool) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Don't manage pool on error so sleeping for " + s_sleepOnError);
-                try {
-                    Thread.sleep(s_sleepOnError);
-                } catch (InterruptedException ie) {
-                }
-            }
-            return;
-        }
-        
-        Connection slaveConn = null;
-        Connection c = null;
-        try{
-            s_logger.debug("Trying to transition master to " + slaveIp);
-            slaveConn = new Connection(getURL(slaveIp), 10);
-            slaveLocalLoginWithPassword(slaveConn, username, password);
-            Pool.emergencyTransitionToMaster(slaveConn);
-            // restart xapi in 10 sec
-            forceSleep(10);
-            // check if the master of this host is set correctly.
-            c = new Connection(getURL(slaveIp), 10);
-            for (int i = 0; i < 30; i++) {
-                try {
-                    loginWithPassword(c, username, password, APIVersion.latest().toString());
-                    s_logger.debug("Succeeded to transition master to " + slaveIp);
-                    return;
-                } catch (Types.HostIsSlave e) {
-                    s_logger.debug("HostIsSlave: Still waiting for the conversion to the
master " + slaveIp);
-                } catch (Exception e) {
-                    s_logger.debug("Exception: Still waiting for the conversion to the master");
-                }
-                forceSleep(2);
-            }
-            throw new RuntimeException("EmergencyTransitionToMaster failed after retry 30
times");
-        } catch (Exception e) {
-            throw new RuntimeException("EmergencyTransitionToMaster failed due to " + e.getMessage());
-        } finally {
-            localLogout(slaveConn);
-            slaveConn = null;
-            if(c != null) {
-                try {
-                    Session.logout(c);
-                    c.dispose();
-                } catch (Exception e) {
-                }
-            }
-        }
-        
-    }
-
-    private void PoolEmergencyResetMaster(String slaveIp, String masterIp, String username,
Queue<String> password) {
-        if (!s_managePool) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Don't manage pool on error so sleeping for " + s_sleepOnError);
-                try {
-                    Thread.sleep(s_sleepOnError);
-                } catch (InterruptedException ie) {
-                }
-            }
-            return;
-        }
-        
-        Connection slaveConn = null;
-        try {
-            s_logger.debug("Trying to reset master of slave " + slaveIp
-                    + " to " + masterIp);
-            slaveConn = new Connection(getURL(slaveIp), 10);
-            slaveLocalLoginWithPassword(slaveConn, username, password);
-            Pool.emergencyResetMaster(slaveConn, masterIp);
-            forceSleep(10);
-            for (int i = 0; i < 30; i++) {
-                try {
-                    slaveLocalLoginWithPassword(slaveConn, username, password);
-                    Pool.Record pr = getPoolRecord(slaveConn);
-                    String mIp = pr.master.getAddress(slaveConn);
-                    if (mIp.trim().equals(masterIp.trim())) {
-                        s_logger.debug("Succeeded to reset master of slave " + slaveIp +
" to " + masterIp); 
-                        return;
-                    }
-                } catch (Exception e) { 
-                } finally {
-                    localLogout(slaveConn);
-                    slaveConn = null;
-                }
-                // wait 2 second
-                forceSleep(2);
-            }
-            throw new CloudRuntimeException("Unable to reset master of slave " + slaveIp
-                    + " to " + masterIp + "after 30 retry");
-        } catch (Exception e) {
-            throw new CloudRuntimeException("Unable to reset master of slave " + slaveIp
-                    + " to " + masterIp + " due to " + e.toString());
-        } finally {
-            localLogout(slaveConn);
-            slaveConn = null;
-        }
-    }
-
-    protected void ensurePoolIntegrity(Connection conn,
-            String masterIp, String username, Queue<String> password, int wait) {
-        try {
-            // try recoverSlave first
-            Set<Host> rcSlaves = Pool.recoverSlaves(conn);
-            // wait 10 second
-            forceSleep(10);
-            for(Host slave : rcSlaves ) {
-                for (int i = 0; i < 30; i++) {
-                    Connection slaveConn = null;
-                    try {
-                        
-                        String slaveIp = slave.getAddress(conn);
-                        s_logger.debug("Logging on as the slave to " + slaveIp);
-                        slaveConn = new Connection(getURL(slaveIp), 10);
-                        slaveLocalLoginWithPassword(slaveConn, username, password);
-                        Pool.Record pr = getPoolRecord(slaveConn);
-                        String mIp = pr.master.getAddress(slaveConn);
-                        if (mIp.trim().equals(masterIp.trim())) {
-                            break;
-                        }
-                    } catch (Exception e) {  
-                    } finally {
-                        localLogout(slaveConn);
-                        slaveConn = null;
-                    }
-                    // wait 2 second
-                    forceSleep(2);
-                }
-            }
-            // then try emergency reset master
-            Set<Host> slaves = Host.getAll(conn);
-            for (Host slave : slaves) {
-                String slaveIp = slave.getAddress(conn);
-                Connection slaveConn = null;
-                try {
-                    s_logger.debug("Logging on as the slave to " + slaveIp);
-    
-                    slaveConn = new Connection(getURL(slaveIp), 10);
-                    slaveLocalLoginWithPassword(slaveConn, username, password);
-                    Pool.Record slavePoolr = getPoolRecord(slaveConn);
-                    String ip = slavePoolr.master.getAddress(slaveConn);
-                    if (!masterIp.trim().equals(ip.trim())) {
-                        PoolEmergencyResetMaster(slaveIp, masterIp, username, password);
-                    }
-                } catch (Exception e) {
-                    s_logger.debug("Unable to login to slave " + slaveIp + " error " + e.getMessage());

-                } finally {
-                    localLogout(slaveConn);
-                    slaveConn = null;
-                }
+        }  catch (Types.HostIsSlave e) {
+            String maddress = e.masterIPAddress;
+            conn = new Connection(getURL(maddress), 10);
+            try {
+                loginWithPassword(conn, username, password, APIVersion.latest().toString());
+            }  catch (Exception e1) {
+                String msg = "Unable to create master connection to host(" + maddress +")
, due to " + e1.toString();
+                s_logger.debug(msg);
+                throw new CloudRuntimeException(msg, e1); 
             }
         } catch (Exception e) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Catch " + e.getClass().getName() + " due to " + e.toString());
-            }     
+            String msg = "Unable to create master connection to host(" + ip +") , due to
" + e.toString();
+            s_logger.debug(msg);
+            throw new CloudRuntimeException(msg, e);	
         }
+        return conn;
     }
     
     public URL getURL(String ip){
@@ -522,39 +242,18 @@ public class XenServerConnectionPool {
     public Connection connect(String hostUuid, String poolUuid, String ipAddress,
             String username, Queue<String> password, int wait) {
         XenServerConnection mConn = null;
-        Connection sConn = null;
-        String masterIp = null;
         if (hostUuid == null || poolUuid == null || ipAddress == null || username == null
|| password == null) {
             String msg = "Connect some parameter are null hostUuid:" + hostUuid + " ,poolUuid:"
+ poolUuid
                     + " ,ipAddress:" + ipAddress;
             s_logger.debug(msg);
             throw new CloudRuntimeException(msg);
         }
-        Host host = null;
         synchronized (poolUuid.intern()) {
             // Let's see if it is an existing connection.
             mConn = getConnect(poolUuid);
             if (mConn != null){
                 try{
-                    host = Host.getByUuid(mConn, hostUuid);
-                } catch (Types.SessionInvalid e) {
-                    s_logger.debug("Session thgrough ip " + mConn.getIp() + " is invalid
for pool(" + poolUuid + ") due to " + e.toString());
-                    try {
-                        loginWithPassword(mConn, mConn.getUsername(), mConn.getPassword(),
APIVersion.latest().toString());
-                    } catch (Exception e1) {
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("connect through IP(" + mConn.getIp() + " for
pool(" + poolUuid + ") is broken due to " + e.toString());
-                        }  
-                        removeConnect(poolUuid);
-                        mConn = null;
-                    }
-                } catch (UuidInvalid e) {
-                    String msg = "Host(" + hostUuid + ") doesn't belong to pool(" + poolUuid
+ "), please execute 'xe pool-join master-address=" + mConn.getIp()
-                        + " master-username=" + mConn.getUsername();
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug(msg);
-                    }
-                    throw new CloudRuntimeException(msg, e);
+                    Host.getByUuid(mConn, hostUuid);
                 } catch (Exception e) { 
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("connect through IP(" + mConn.getIp() + " for pool("
+ poolUuid + ") is broken due to " + e.toString());
@@ -562,116 +261,32 @@ public class XenServerConnectionPool {
                     removeConnect(poolUuid);
                     mConn = null;
                 }
-            }   
-            
+            } 
+ 
             if ( mConn == null ) {
+                mConn = new XenServerConnection(getURL(ipAddress), ipAddress, username, password,
_retries, _interval, wait);
                 try {
+                    loginWithPassword(mConn, username, password, APIVersion.latest().toString());
+                }  catch (Types.HostIsSlave e) {
+                    String maddress = e.masterIPAddress;
+                    mConn = new XenServerConnection(getURL(maddress), maddress, username,
password, _retries, _interval, wait);
                     try {
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("Logging on as the slave to " + ipAddress);
-                        }
-                        sConn = new Connection(getURL(ipAddress), 5);
-                        slaveLocalLoginWithPassword(sConn, username, password);
-                    } catch (Exception e){
-                        String msg = "Unable to create slave connection to host(" + hostUuid
+") due to " + e.toString();
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug(msg);                           
-                        } 
-                        throw new CloudRuntimeException(msg, e);
-                    }
-                    Pool.Record pr = null;
-                    try {
-                        pr = getPoolRecord(sConn);
-                    } catch (Exception e) {
-                        PoolEmergencyTransitionToMaster(ipAddress, username, password);
-                        mConn = new XenServerConnection(getURL(ipAddress), ipAddress, username,
password, _retries, _interval, wait);
-                        try {
-                            loginWithPassword(mConn, username, password, APIVersion.latest().toString());
-                            pr = getPoolRecord(mConn);
-                        }  catch (Exception e1) {
-                            String msg = "Unable to create master connection to host(" +
hostUuid +") after transition it to master, due to " + e1.toString();
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug(msg);                           
-                            }
-                            throw new CloudRuntimeException(msg, e1);
-                        }
-                        if ( !pr.uuid.equals(poolUuid) ) {
-                            String msg = "host(" + hostUuid +") should be in pool(" + poolUuid
+ "), but it is actually in pool(" + pr.uuid + ")";
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug(msg);                           
-                            }
-                            throw new CloudRuntimeException(msg);
-                        } else {
-                            if (s_managePool) {
-                                ensurePoolIntegrity(mConn, ipAddress, username, password,
 wait);
-                            }
-                            addConnect(poolUuid, mConn);
-                            return mConn;
-                        }
-                    }
-                    if ( !pr.uuid.equals(poolUuid) ) {
-                        String msg = "host(" + hostUuid +") should be in pool(" + poolUuid
+ "), but it is actually in pool(" + pr.uuid + ")";
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug(msg);                           
-                        }
-                        throw new CloudRuntimeException(msg);
-                    }
-                    try {
-                        masterIp = pr.master.getAddress(sConn);
-                        mConn = new XenServerConnection(getURL(masterIp), masterIp, username,
password, _retries, _interval, wait);
                         loginWithPassword(mConn, username, password, APIVersion.latest().toString());
-                        addConnect(poolUuid, mConn);
-                        return mConn;               
-                    } catch (Exception e) {
-                        String msg = "Unable to logon in " + masterIp + " as master in pool("
+ poolUuid + ")";
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug(msg);                           
-                        }
-                        throw new CloudRuntimeException(msg);
-                    }
-                } finally {
-                    localLogout(sConn);
-                    sConn = null;
-                }
-            }
-        }
-    
-        if ( mConn != null ) {
-            if (s_managePool) {
-                try {
-                    Map<String, String> args = new HashMap<String, String>();
-                    host.callPlugin(mConn, "echo", "main", args);
-                } catch (Types.SessionInvalid e) {
-                    if (s_logger.isDebugEnabled()) {
-                        String msg = "Catch Exception: " + e.getClass().getName() + " Can't
connect host " + ipAddress + " due to " + e.toString();
+                    }  catch (Exception e1) {
+                        String msg = "Unable to create master connection to host(" + maddress
+") , due to " + e1.toString();
                         s_logger.debug(msg);
-                    }
-                    PoolEmergencyResetMaster(ipAddress, mConn.getIp(), mConn.getUsername(),
mConn.getPassword());
-                } catch (Types.CannotContactHost e ) {
-                    if (s_logger.isDebugEnabled()) {
-                        String msg = "Catch Exception: " + e.getClass().getName() + " Can't
connect host " + ipAddress + " due to " + e.toString();
-                        s_logger.debug(msg);
-                    }  
-                    PoolEmergencyResetMaster(ipAddress, mConn.getIp(), mConn.getUsername(),
mConn.getPassword());
-                } catch (Types.HostOffline e ) {
-                    if (s_logger.isDebugEnabled()) {
-                        String msg = "Catch Exception: " + e.getClass().getName() + " Host
is offline " + ipAddress + " due to " + e.toString();
-                        s_logger.debug(msg);
-                    }
-                    PoolEmergencyResetMaster(ipAddress, mConn.getIp(), mConn.getUsername(),
mConn.getPassword());
-                } catch (Types.HostNotLive e ) {
-                    String msg = "Catch Exception: " + e.getClass().getName() + " Host Not
Live " + ipAddress + " due to " + e.toString();
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug(msg);
-                    } 
-                    PoolEmergencyResetMaster(ipAddress, mConn.getIp(), mConn.getUsername(),
mConn.getPassword());
+                        throw new CloudRuntimeException(msg, e1);
+ 
+                    }                   
                 } catch (Exception e) {
-                    String msg = "Echo test failed on host " + hostUuid + " IP " + ipAddress;
-                    s_logger.warn(msg, e);                           
-                    throw new CloudRuntimeException(msg, e);
+                    String msg = "Unable to create master connection to host(" + ipAddress
+") , due to " + e.toString();
+                    s_logger.debug(msg);
+                    throw new CloudRuntimeException(msg, e);	
                 }
+                addConnect(poolUuid, mConn);
             }
         }
+
         return mConn;
     }
     


Mime
View raw message