diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 43359d3c6aa..51b84fba69e 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -335,6 +335,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } newVol.setDeviceId(oldVol.getDeviceId()); newVol.setInstanceId(oldVol.getInstanceId()); + newVol.setRecreatable(oldVol.isRecreatable()); return _volsDao.persist(newVol); } @@ -2532,11 +2533,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag for (VolumeVO vol : recreateVols) { VolumeVO newVol; if (vol.getState() == Volume.State.Allocated) { - vol.setRecreatable(true); newVol = vol; } else { newVol = switchVolume(vol, vm); - newVol.setRecreatable(true); // update the volume->storagePool map since volumeId has changed if (dest.getStorageForDisks() != null && dest.getStorageForDisks().containsKey(vol)) { StoragePool poolWithOldVol = dest.getStorageForDisks().get(vol); diff --git a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java index 373234c22dd..c22e8919e2f 100644 --- a/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/server/src/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -62,6 +62,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { _upgradeMap.put("2.1.7", new DbUpgrade[] { new Upgrade217to218(), new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to223(), new Upgrade222to224() }); _upgradeMap.put("2.1.8", new DbUpgrade[] { new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to223(), new Upgrade222to224(), new Upgrade218to224DomainVlans() }); _upgradeMap.put("2.1.9", new DbUpgrade[] { new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to223(), new Upgrade222to224(), new Upgrade218to224DomainVlans() }); + _upgradeMap.put("2.2.1", new DbUpgrade[] { new Upgrade221to222(), new Upgrade222to224()}); _upgradeMap.put("2.2.2", new DbUpgrade[] { new Upgrade222to224() }); _upgradeMap.put("2.2.3", new DbUpgrade[] { new Upgrade222to224() }); } diff --git a/server/src/com/cloud/upgrade/dao/Upgrade222to224.java b/server/src/com/cloud/upgrade/dao/Upgrade222to224.java index 933172e1189..4e6a4758ec3 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade222to224.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade222to224.java @@ -60,15 +60,20 @@ public class Upgrade222to224 implements DbUpgrade { @Override public void performDataMigration(Connection conn) { - updateClusterIdInOpHostCapacity(conn); - updateGuestOsType(conn); - updateNicsWithMode(conn); - updateUserStatsWithNetwork(conn); - dropIndexIfExists(conn); - fixBasicZoneNicCount(conn); - updateTotalCPUInOpHostCapacity(conn); - upgradeGuestOs(conn); - upgradeAccountVlanMap(conn); + try { + updateClusterIdInOpHostCapacity(conn); + updateGuestOsType(conn); + updateNicsWithMode(conn); + updateUserStatsWithNetwork(conn); + dropIndexIfExists(conn); + fixBasicZoneNicCount(conn); + updateTotalCPUInOpHostCapacity(conn); + upgradeGuestOs(conn); + upgradeAccountVlanMap(conn); + fixRecreatableVolumesProblem(conn); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to perform data migration", e); + } } @Override @@ -100,6 +105,17 @@ public class Upgrade222to224 implements DbUpgrade { throw new CloudRuntimeException("Unable to update the guest os type for default template as a part of 222 to 224 upgrade", e); } } + + // fixes bug 9597 + private void fixRecreatableVolumesProblem(Connection conn) throws SQLException { + PreparedStatement pstmt = conn.prepareStatement("UPDATE volumes as v SET recreatable=(SELECT recreatable FROM disk_offering d WHERE d.id = v.disk_offering_id)"); + pstmt.execute(); + pstmt.close(); + + pstmt = conn.prepareStatement("UPDATE volumes SET recreatable=0 WHERE disk_offering_id is NULL"); + pstmt.execute(); + pstmt.close(); + } private void updateClusterIdInOpHostCapacity(Connection conn) { PreparedStatement pstmt = null;