From 82f7504832529d891cd6b9b93bac3893a0b9ef27 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 18 Mar 2011 16:49:38 -0700 Subject: [PATCH] checking in the upgrade stuff for now --- build/cloud.properties | 2 +- .../com/cloud/cluster/ClusterManagerImpl.java | 38 +++++-- .../upgrade/dao/DatabaseUpgradeChecker.java | 105 +++++++++++------- .../src/com/cloud/upgrade/dao/VersionVO.java | 2 - ...va => AdvanceZone217To224UpgradeTest.java} | 8 +- ...java => BasicZone217To224UpgradeTest.java} | 12 +- ... => InstanceGroup217To224UpgradeTest.java} | 12 +- ...=> PortForwarding217To224UpgradeTest.java} | 12 +- 8 files changed, 113 insertions(+), 78 deletions(-) rename server/test/com/cloud/upgrade/dao/{AdvanceZone217To223UpgradeTest.java => AdvanceZone217To224UpgradeTest.java} (94%) rename server/test/com/cloud/upgrade/dao/{BasicZone217To223UpgradeTest.java => BasicZone217To224UpgradeTest.java} (97%) rename server/test/com/cloud/upgrade/dao/{InstanceGroup217To223UpgradeTest.java => InstanceGroup217To224UpgradeTest.java} (96%) rename server/test/com/cloud/upgrade/dao/{PortForwarding217To221UpgradeTest.java => PortForwarding217To224UpgradeTest.java} (94%) diff --git a/build/cloud.properties b/build/cloud.properties index 1e91844ae54..65b9f126d5e 100755 --- a/build/cloud.properties +++ b/build/cloud.properties @@ -3,7 +3,7 @@ # major.minor.patch versioning scheme for vmops company.major.version=2 company.minor.version=2 -company.patch.version=3 +company.patch.version=4 svn.revision=2 diff --git a/server/src/com/cloud/cluster/ClusterManagerImpl.java b/server/src/com/cloud/cluster/ClusterManagerImpl.java index 14b3a03eb87..9669f947189 100644 --- a/server/src/com/cloud/cluster/ClusterManagerImpl.java +++ b/server/src/com/cloud/cluster/ClusterManagerImpl.java @@ -160,6 +160,19 @@ public class ClusterManagerImpl implements ClusterManager { return answers[0].getResult(); } + /** + * called by DatabaseUpgradeChecker to see if there are other peers running. + * @param notVersion If version is passed in, the peers CANNOT be running at this + * version. If version is null, return true if any peer is + * running regardless of version. + * @return true if there are peers running and false if not. + */ + public static final boolean arePeersRunning(String notVersion) { + return false; //TODO: Leaving this for Kelven to take care of. + } + + + @Override public void broadcast(long agentId, Command[] cmds) { Date cutTime = DateUtil.currentGMTTime(); @@ -564,8 +577,9 @@ public class ClusterManagerImpl implements ClusterManager { // missed cleanup Date cutTime = DateUtil.currentGMTTime(); List inactiveList = _mshostDao.getInactiveList(new Date(cutTime.getTime() - heartbeatThreshold)); - if(inactiveList.size() > 0) - notifyNodeLeft(inactiveList); + if(inactiveList.size() > 0) { + notifyNodeLeft(inactiveList); + } } private void peerScan() { @@ -632,8 +646,9 @@ public class ClusterManagerImpl implements ClusterManager { profiler.stop(); if(profiler.getDuration() > 1000) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Notifying management server join event took " + profiler.getDuration() + " ms"); + if(s_logger.isDebugEnabled()) { + s_logger.debug("Notifying management server join event took " + profiler.getDuration() + " ms"); + } } else { s_logger.warn("Notifying management server join event took " + profiler.getDuration() + " ms"); } @@ -647,8 +662,9 @@ public class ClusterManagerImpl implements ClusterManager { profiler.stop(); if(profiler.getDuration() > 1000) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Notifying management server leave event took " + profiler.getDuration() + " ms"); + if(s_logger.isDebugEnabled()) { + s_logger.debug("Notifying management server leave event took " + profiler.getDuration() + " ms"); + } } else { s_logger.warn("Notifying management server leave event took " + profiler.getDuration() + " ms"); } @@ -855,8 +871,9 @@ public class ClusterManagerImpl implements ClusterManager { public boolean isManagementNodeAlive(long msid) { ManagementServerHostVO mshost = _mshostDao.findByMsid(msid); if(mshost != null) { - if(mshost.getLastUpdateTime().getTime() >= DateUtil.currentGMTTime().getTime() - heartbeatThreshold) - return true; + if(mshost.getLastUpdateTime().getTime() >= DateUtil.currentGMTTime().getTime() - heartbeatThreshold) { + return true; + } } return false; @@ -865,8 +882,9 @@ public class ClusterManagerImpl implements ClusterManager { @Override public boolean pingManagementNode(long msid) { ManagementServerHostVO mshost = _mshostDao.findByMsid(msid); - if(mshost == null) - return false; + if(mshost == null) { + return false; + } String targetIp = mshost.getServiceIP(); if("127.0.0.1".equals(targetIp) || "0.0.0.0".equals(targetIp)) { diff --git a/server/src/com/cloud/upgrade/dao/DatabaseUpgradeChecker.java b/server/src/com/cloud/upgrade/dao/DatabaseUpgradeChecker.java index 485270f28d2..363005af95b 100644 --- a/server/src/com/cloud/upgrade/dao/DatabaseUpgradeChecker.java +++ b/server/src/com/cloud/upgrade/dao/DatabaseUpgradeChecker.java @@ -28,11 +28,12 @@ import java.util.HashMap; import org.apache.log4j.Logger; +import com.cloud.cluster.ClusterManagerImpl; import com.cloud.maint.Version; import com.cloud.upgrade.dao.VersionVO.Step; -import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.SystemIntegrityChecker; +import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.ScriptRunner; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; @@ -40,12 +41,14 @@ import com.cloud.utils.exception.CloudRuntimeException; public class DatabaseUpgradeChecker implements SystemIntegrityChecker { private final Logger s_logger = Logger.getLogger(DatabaseUpgradeChecker.class); - protected HashMap, DbUpgrade[]> _upgradeMap = new HashMap, DbUpgrade[]>(); + protected HashMap _upgradeMap = new HashMap(); VersionDao _dao; public DatabaseUpgradeChecker() { _dao = ComponentLocator.inject(VersionDaoImpl.class); - _upgradeMap.put(new Pair("2.1.7", "2.2.3"), new DbUpgrade[] { new Upgrade217to22(), new Upgrade221to222(), new UpgradeSnapshot217to223(), new Upgrade222to224()}); + _upgradeMap.put("2.1.7", new DbUpgrade[] { new Upgrade217to22(), new Upgrade221to222(), new UpgradeSnapshot217to223(), new Upgrade222to224()}); + _upgradeMap.put("2.2.2", new DbUpgrade[] { new Upgrade222to224() }); + _upgradeMap.put("2.2.3", new DbUpgrade[] { new Upgrade222to224() }); } protected void runScript(File file) { @@ -55,11 +58,11 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { ScriptRunner runner = new ScriptRunner(conn, false, true); runner.runScript(reader); } catch (FileNotFoundException e) { - throw new CloudRuntimeException("Unable to find upgrade script, schema-21to22.sql", e); + throw new CloudRuntimeException("Unable to find upgrade script: " + file.getAbsolutePath(), e); } catch (IOException e) { - throw new CloudRuntimeException("Unable to read upgrade script, schema-21to22.sql", e); + throw new CloudRuntimeException("Unable to read upgrade script: " + file.getAbsolutePath(), e); } catch (SQLException e) { - throw new CloudRuntimeException("Unable to execute upgrade script, schema-21to22.sql", e); + throw new CloudRuntimeException("Unable to execute upgrade script: " + file.getAbsolutePath(), e); } } @@ -69,7 +72,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { String trimmedDbVersion = Version.trimToPatch(dbVersion); String trimmedCurrentVersion = Version.trimToPatch(currentVersion); - DbUpgrade[] upgrades = _upgradeMap.get(new Pair(trimmedDbVersion, trimmedCurrentVersion)); + DbUpgrade[] upgrades = _upgradeMap.get(trimmedDbVersion); if (upgrades == null) { throw new CloudRuntimeException("There is no upgrade path from " + dbVersion + " to " + currentVersion); } @@ -86,8 +89,8 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { } } - if (!supportsRollingUpgrade) { - // TODO: Check if the other management server is still running by looking at the database. If so, then throw an exception. + if (!supportsRollingUpgrade && ClusterManagerImpl.arePeersRunning(null)) { + throw new CloudRuntimeException("Unable to run upgrade because the upgrade sequence does not support rolling update and there are other management server nodes running"); } for (DbUpgrade upgrade : upgrades) { @@ -116,48 +119,64 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { } } - for (DbUpgrade upgrade : upgrades) { - s_logger.info("Cleanup upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); - VersionVO version = _dao.findByVersion(upgrade.getUpgradedVersion(), Step.Upgrade); - Transaction txn = Transaction.open("Cleanup"); - txn.start(); - try { - File[] scripts = upgrade.getCleanupScripts(); - if (scripts != null) { - for (File script : scripts) { - runScript(script); + if (!ClusterManagerImpl.arePeersRunning(trimmedCurrentVersion)) { + s_logger.info("Cleaning upgrades because all management server are now at the same version"); + for (DbUpgrade upgrade : upgrades) { + s_logger.info("Cleanup upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); + VersionVO version = _dao.findByVersion(upgrade.getUpgradedVersion(), Step.Upgrade); + Transaction txn = Transaction.open("Cleanup"); + txn.start(); + try { + File[] scripts = upgrade.getCleanupScripts(); + if (scripts != null) { + for (File script : scripts) { + runScript(script); + } } + version.setStep(Step.Complete); + version.setUpdated(new Date()); + _dao.update(version.getId(), version); + txn.commit(); + } finally { + txn.close(); } - version.setStep(Step.Complete); - version.setUpdated(new Date()); - _dao.update(version.getId(), version); - txn.commit(); - } finally { - txn.close(); } } } @Override public void check() { - String dbVersion = _dao.getCurrentVersion(); - String currentVersion = this.getClass().getPackage().getImplementationVersion(); - if (currentVersion == null) { - currentVersion = this.getClass().getSuperclass().getPackage().getImplementationVersion(); + GlobalLock lock = GlobalLock.getInternLock("DatabaseUpgrade"); + try { + s_logger.info("Grabbing lock to check for database integrity."); + if (!lock.lock(20*60)) { + throw new CloudRuntimeException("Unable to acquire lock to check for database integrity."); + } + + try { + String dbVersion = _dao.getCurrentVersion(); + String currentVersion = this.getClass().getPackage().getImplementationVersion(); + if (currentVersion == null) { + currentVersion = this.getClass().getSuperclass().getPackage().getImplementationVersion(); + } + + s_logger.info("DB version = " + dbVersion + " Code Version = " + currentVersion); + + if (Version.compare(Version.trimToPatch(dbVersion), Version.trimToPatch(currentVersion)) > 0) { + throw new CloudRuntimeException("Database version " + dbVersion + " is higher than management software version " + currentVersion); + } + + if (Version.compare(Version.trimToPatch(dbVersion), Version.trimToPatch(currentVersion)) == 0) { + s_logger.info("DB version and code version matches so no upgrade needed."); + return; + } + + upgrade(dbVersion, currentVersion); + } finally { + lock.unlock(); + } + } finally { + lock.releaseRef(); } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("DB version = " + dbVersion + " Code Version = " + currentVersion); - } - - if (Version.compare(Version.trimToPatch(dbVersion), Version.trimToPatch(currentVersion)) > 0) { - throw new CloudRuntimeException("Database version " + dbVersion + " is higher than management software version " + currentVersion); - } - - if (Version.compare(Version.trimToPatch(dbVersion), Version.trimToPatch(currentVersion)) == 0) { - return; - } - - upgrade(dbVersion, currentVersion); } } diff --git a/server/src/com/cloud/upgrade/dao/VersionVO.java b/server/src/com/cloud/upgrade/dao/VersionVO.java index 502f505a99d..7a046a38e1a 100644 --- a/server/src/com/cloud/upgrade/dao/VersionVO.java +++ b/server/src/com/cloud/upgrade/dao/VersionVO.java @@ -34,9 +34,7 @@ import javax.persistence.TemporalType; @Table(name="version") public class VersionVO { public enum Step { - Dump, Upgrade, - Cleanup, Complete }; diff --git a/server/test/com/cloud/upgrade/dao/AdvanceZone217To223UpgradeTest.java b/server/test/com/cloud/upgrade/dao/AdvanceZone217To224UpgradeTest.java similarity index 94% rename from server/test/com/cloud/upgrade/dao/AdvanceZone217To223UpgradeTest.java rename to server/test/com/cloud/upgrade/dao/AdvanceZone217To224UpgradeTest.java index af9c02e98b0..d88ac4c8c90 100644 --- a/server/test/com/cloud/upgrade/dao/AdvanceZone217To223UpgradeTest.java +++ b/server/test/com/cloud/upgrade/dao/AdvanceZone217To224UpgradeTest.java @@ -35,8 +35,8 @@ import com.cloud.utils.db.DbTestUtils; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -public class AdvanceZone217To223UpgradeTest extends TestCase { - private static final Logger s_logger = Logger.getLogger(AdvanceZone217To223UpgradeTest.class); +public class AdvanceZone217To224UpgradeTest extends TestCase { + private static final Logger s_logger = Logger.getLogger(AdvanceZone217To224UpgradeTest.class); @Override @Before @@ -64,14 +64,14 @@ public class AdvanceZone217To223UpgradeTest extends TestCase { String version = dao.getCurrentVersion(); assert version.equals("2.1.7") : "Version returned is not 2.1.7 but " + version; - checker.upgrade("2.1.7", "2.2.3"); + checker.upgrade("2.1.7", "2.2.4"); conn = Transaction.getStandaloneConnection(); try { pstmt = conn.prepareStatement("SELECT version FROM version ORDER BY id DESC LIMIT 1"); ResultSet rs = pstmt.executeQuery(); assert rs.next() : "No version selected"; - assert rs.getString(1).equals("2.2.3") : "VERSION stored is not 2.2.3: " + rs.getString(1); + assert rs.getString(1).equals("2.2.4") : "VERSION stored is not 2.2.4: " + rs.getString(1); rs.close(); pstmt.close(); diff --git a/server/test/com/cloud/upgrade/dao/BasicZone217To223UpgradeTest.java b/server/test/com/cloud/upgrade/dao/BasicZone217To224UpgradeTest.java similarity index 97% rename from server/test/com/cloud/upgrade/dao/BasicZone217To223UpgradeTest.java rename to server/test/com/cloud/upgrade/dao/BasicZone217To224UpgradeTest.java index d8d25066a65..fcb2299c247 100644 --- a/server/test/com/cloud/upgrade/dao/BasicZone217To223UpgradeTest.java +++ b/server/test/com/cloud/upgrade/dao/BasicZone217To224UpgradeTest.java @@ -35,8 +35,8 @@ import com.cloud.utils.db.DbTestUtils; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -public class BasicZone217To223UpgradeTest extends TestCase { - private static final Logger s_logger = Logger.getLogger(BasicZone217To223UpgradeTest.class); +public class BasicZone217To224UpgradeTest extends TestCase { + private static final Logger s_logger = Logger.getLogger(BasicZone217To224UpgradeTest.class); @Override @Before @@ -69,12 +69,12 @@ public class BasicZone217To223UpgradeTest extends TestCase { s_logger.debug("Basic zone test version is " + version); } - checker.upgrade("2.1.7", "2.2.3"); + checker.upgrade("2.1.7", "2.2.4"); conn = Transaction.getStandaloneConnection(); try { - s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.3 for Basic zone..."); + s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.4 for Basic zone..."); //Version check pstmt = conn.prepareStatement(" SELECT version FROM version ORDER BY id DESC LIMIT 1"); @@ -82,8 +82,8 @@ public class BasicZone217To223UpgradeTest extends TestCase { if (!rs.next()) { s_logger.error("ERROR: No version selected"); - } else if (!rs.getString(1).equals("2.2.3")) { - s_logger.error("ERROR: VERSION stored is not 2.2.3: " + rs.getString(1)); + } else if (!rs.getString(1).equals("2.2.4")) { + s_logger.error("ERROR: VERSION stored is not 2.2.4: " + rs.getString(1)); } rs.close(); pstmt.close(); diff --git a/server/test/com/cloud/upgrade/dao/InstanceGroup217To223UpgradeTest.java b/server/test/com/cloud/upgrade/dao/InstanceGroup217To224UpgradeTest.java similarity index 96% rename from server/test/com/cloud/upgrade/dao/InstanceGroup217To223UpgradeTest.java rename to server/test/com/cloud/upgrade/dao/InstanceGroup217To224UpgradeTest.java index 59419697fda..1977c42c517 100644 --- a/server/test/com/cloud/upgrade/dao/InstanceGroup217To223UpgradeTest.java +++ b/server/test/com/cloud/upgrade/dao/InstanceGroup217To224UpgradeTest.java @@ -36,8 +36,8 @@ import com.cloud.utils.db.DbTestUtils; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -public class InstanceGroup217To223UpgradeTest extends TestCase { - private static final Logger s_logger = Logger.getLogger(InstanceGroup217To223UpgradeTest.class); +public class InstanceGroup217To224UpgradeTest extends TestCase { + private static final Logger s_logger = Logger.getLogger(InstanceGroup217To224UpgradeTest.class); @Override @Before @@ -70,12 +70,12 @@ public class InstanceGroup217To223UpgradeTest extends TestCase { s_logger.debug("Basic zone test version is " + version); } - checker.upgrade("2.1.7", "2.2.3"); + checker.upgrade("2.1.7", "2.2.4"); conn = Transaction.getStandaloneConnection(); try { - s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.3 for Instance groups..."); + s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.4 for Instance groups..."); //Version check pstmt = conn.prepareStatement("SELECT version FROM version"); @@ -83,8 +83,8 @@ public class InstanceGroup217To223UpgradeTest extends TestCase { if (!rs.next()) { s_logger.error("ERROR: No version selected"); - } else if (!rs.getString(1).equals("2.2.3")) { - s_logger.error("ERROR: VERSION stored is not 2.2.3: " + rs.getString(1)); + } else if (!rs.getString(1).equals("2.2.4")) { + s_logger.error("ERROR: VERSION stored is not 2.2.4: " + rs.getString(1)); } rs.close(); pstmt.close(); diff --git a/server/test/com/cloud/upgrade/dao/PortForwarding217To221UpgradeTest.java b/server/test/com/cloud/upgrade/dao/PortForwarding217To224UpgradeTest.java similarity index 94% rename from server/test/com/cloud/upgrade/dao/PortForwarding217To221UpgradeTest.java rename to server/test/com/cloud/upgrade/dao/PortForwarding217To224UpgradeTest.java index 33719773c98..50c1704d056 100644 --- a/server/test/com/cloud/upgrade/dao/PortForwarding217To221UpgradeTest.java +++ b/server/test/com/cloud/upgrade/dao/PortForwarding217To224UpgradeTest.java @@ -36,8 +36,8 @@ import com.cloud.utils.db.DbTestUtils; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -public class PortForwarding217To221UpgradeTest extends TestCase { - private static final Logger s_logger = Logger.getLogger(PortForwarding217To221UpgradeTest.class); +public class PortForwarding217To224UpgradeTest extends TestCase { + private static final Logger s_logger = Logger.getLogger(PortForwarding217To224UpgradeTest.class); @Override @Before @@ -70,12 +70,12 @@ public class PortForwarding217To221UpgradeTest extends TestCase { s_logger.debug("Port forwarding test version is " + version); } - checker.upgrade("2.1.7", "2.2.3"); + checker.upgrade("2.1.7", "2.2.4"); conn = Transaction.getStandaloneConnection(); try { - s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.3 for Port forwarding rules..."); + s_logger.debug("Starting tesing upgrade from 2.1.7 to 2.2.4 for Port forwarding rules..."); //Version check pstmt = conn.prepareStatement("SELECT version FROM version"); @@ -83,8 +83,8 @@ public class PortForwarding217To221UpgradeTest extends TestCase { if (!rs.next()) { s_logger.error("ERROR: No version selected"); - } else if (!rs.getString(1).equals("2.2.3")) { - s_logger.error("ERROR: VERSION stored is not 2.2.3: " + rs.getString(1)); + } else if (!rs.getString(1).equals("2.2.4")) { + s_logger.error("ERROR: VERSION stored is not 2.2.4: " + rs.getString(1)); } rs.close(); pstmt.close();