checking in the upgrade stuff for now

This commit is contained in:
Alex Huang 2011-03-18 16:49:38 -07:00
parent ec96a9afea
commit 82f7504832
8 changed files with 113 additions and 78 deletions

View File

@ -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

View File

@ -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,9 +577,10 @@ public class ClusterManagerImpl implements ClusterManager {
// missed cleanup
Date cutTime = DateUtil.currentGMTTime();
List<ManagementServerHostVO> inactiveList = _mshostDao.getInactiveList(new Date(cutTime.getTime() - heartbeatThreshold));
if(inactiveList.size() > 0)
if(inactiveList.size() > 0) {
notifyNodeLeft(inactiveList);
}
}
private void peerScan() {
Date cutTime = DateUtil.currentGMTTime();
@ -632,8 +646,9 @@ public class ClusterManagerImpl implements ClusterManager {
profiler.stop();
if(profiler.getDuration() > 1000) {
if(s_logger.isDebugEnabled())
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())
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,9 +871,10 @@ 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)
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)
if(mshost == null) {
return false;
}
String targetIp = mshost.getServiceIP();
if("127.0.0.1".equals(targetIp) || "0.0.0.0".equals(targetIp)) {

View File

@ -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<Pair<String, String>, DbUpgrade[]> _upgradeMap = new HashMap<Pair<String, String>, DbUpgrade[]>();
protected HashMap<String, DbUpgrade[]> _upgradeMap = new HashMap<String, DbUpgrade[]>();
VersionDao _dao;
public DatabaseUpgradeChecker() {
_dao = ComponentLocator.inject(VersionDaoImpl.class);
_upgradeMap.put(new Pair<String, String>("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<String, String>(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,6 +119,8 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
}
}
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);
@ -137,27 +142,41 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
}
}
}
}
@Override
public void check() {
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();
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("DB version = " + dbVersion + " Code Version = " + currentVersion);
}
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();
}
}
}

View File

@ -34,9 +34,7 @@ import javax.persistence.TemporalType;
@Table(name="version")
public class VersionVO {
public enum Step {
Dump,
Upgrade,
Cleanup,
Complete
};

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();