From a45a4a5218d6eb6d2b411cba00a59068200f2868 Mon Sep 17 00:00:00 2001 From: dahn Date: Tue, 13 Sep 2022 07:03:36 +0200 Subject: [PATCH 1/3] upgrade a backported patch (#6728) This PR tries to fix a problem with a privately backported feature. The columns added for the feature are not added idem potent so people can not backport them. I propose that all DB alteration from here on in will be done with the IDEM_POTENT_...() set of stored procedures that we have to prevent these kind of issues for users. --- .../src/main/resources/META-INF/db/schema-41610to41700.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 6885e499222..f51f88aef84 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -887,9 +887,8 @@ left join `cloud`.`mshost_status` on ((`cloud`.`mshost`.`uuid` = `cloud`.`mshost_status`.`ms_id`))); -- Alter event table to add resource_id and resource_type -ALTER TABLE `cloud`.`event` - ADD COLUMN `resource_id` bigint unsigned COMMENT 'ID of the resource associated with the event' AFTER `domain_id`, - ADD COLUMN `resource_type` varchar(32) COMMENT 'Type of the resource associated with the event' AFTER `resource_id`; +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.event','resource_id', 'bigint unsigned COMMENT "ID of the resource associated with the event" AFTER `domain_id`'); +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.event','resource_type', 'VARCHAR(32) COMMENT "Type of the resource associated with the event" AFTER `resource_id`'); DROP VIEW IF EXISTS `cloud`.`event_view`; CREATE VIEW `cloud`.`event_view` AS From e8b249f11d5e09a2fd7d5448ca815f0d922883d8 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 13 Sep 2022 14:11:15 +0530 Subject: [PATCH 2/3] server: fix netowork upgrade for IPv6 (#6729) Fixes network update for IPv6 offering upgrade --- .../main/java/com/cloud/network/Ipv6ServiceImpl.java | 2 +- .../java/com/cloud/network/Ipv6ServiceImplTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java index dd0f6c49e37..0ddae74daa6 100644 --- a/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java +++ b/server/src/main/java/com/cloud/network/Ipv6ServiceImpl.java @@ -501,7 +501,7 @@ public class Ipv6ServiceImpl extends ComponentLifecycleBase implements Ipv6Servi ipAddressDao.listByAssociatedVpc(network.getVpcId(), true); for (IPAddressVO address : addresses) { VlanVO vlan = vlanDao.findById(address.getVlanId()); - final List ranges = vlanDao.listIpv6RangeByZoneIdAndVlanId(network.getPhysicalNetworkId(), vlan.getVlanTag()); + final List ranges = vlanDao.listIpv6RangeByZoneIdAndVlanId(network.getDataCenterId(), vlan.getVlanTag()); if (CollectionUtils.isEmpty(ranges)) { s_logger.error(String.format("Unable to find IPv6 address for zone ID: %d, physical network ID: %d, VLAN: %s", network.getDataCenterId(), network.getPhysicalNetworkId(), vlan.getVlanTag())); InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, network.getDataCenterId()); diff --git a/server/src/test/java/com/cloud/network/Ipv6ServiceImplTest.java b/server/src/test/java/com/cloud/network/Ipv6ServiceImplTest.java index 1b0592abcb2..cebe54288ec 100644 --- a/server/src/test/java/com/cloud/network/Ipv6ServiceImplTest.java +++ b/server/src/test/java/com/cloud/network/Ipv6ServiceImplTest.java @@ -592,10 +592,10 @@ public class Ipv6ServiceImplTest { @Test public void testCheckNetworkIpv6UpgradeForNoIpv6Vlan() { - final long physicalNetworkId = 1L; + final long zoneId = 1L; Mockito.when(dataCenterGuestIpv6PrefixDao.listByDataCenterId(Mockito.anyLong())).thenReturn(List.of(Mockito.mock(DataCenterGuestIpv6PrefixVO.class))); Network network = Mockito.mock(Network.class); - Mockito.when(network.getPhysicalNetworkId()).thenReturn(physicalNetworkId); + Mockito.when(network.getDataCenterId()).thenReturn(zoneId); Mockito.when(network.getVpcId()).thenReturn(null); Mockito.when(ipAddressDao.listByAssociatedNetwork(Mockito.anyLong(), Mockito.anyBoolean())).thenReturn(List.of(Mockito.mock(IPAddressVO.class))); VlanVO vlanVO = Mockito.mock(VlanVO.class); @@ -610,16 +610,16 @@ public class Ipv6ServiceImplTest { @Test public void testCheckNetworkIpv6UpgradeForNetwork() { - final long physicalNetworkId = 1L; + final long zoneId = 1L; Mockito.when(dataCenterGuestIpv6PrefixDao.listByDataCenterId(Mockito.anyLong())).thenReturn(List.of(Mockito.mock(DataCenterGuestIpv6PrefixVO.class))); Network network = Mockito.mock(Network.class); - Mockito.when(network.getPhysicalNetworkId()).thenReturn(physicalNetworkId); + Mockito.when(network.getDataCenterId()).thenReturn(zoneId); Mockito.when(network.getVpcId()).thenReturn(null); Mockito.when(ipAddressDao.listByAssociatedNetwork(Mockito.anyLong(), Mockito.anyBoolean())).thenReturn(List.of(Mockito.mock(IPAddressVO.class))); VlanVO vlanVO = Mockito.mock(VlanVO.class); Mockito.when(vlanVO.getVlanTag()).thenReturn(vlan); Mockito.when(vlanDao.findById(Mockito.anyLong())).thenReturn(vlanVO); - Mockito.when(vlanDao.listIpv6RangeByZoneIdAndVlanId(physicalNetworkId, vlan)).thenReturn(List.of(vlanVO)); + Mockito.when(vlanDao.listIpv6RangeByZoneIdAndVlanId(zoneId, vlan)).thenReturn(List.of(vlanVO)); try { ipv6Service.checkNetworkIpv6Upgrade(network); } catch (InsufficientAddressCapacityException | ResourceAllocationException e) { From 77df050160d6a5343aab97571bf891e51b4b1201 Mon Sep 17 00:00:00 2001 From: mrog <4752942+mrog@users.noreply.github.com> Date: Tue, 13 Sep 2022 02:42:53 -0600 Subject: [PATCH 3/3] Reset unusable db connections (#6725) When the management service detects a broken database connection, it didn't do anything about it. It already has code to reset the connection, but that doesn't get used. This change causes the connection to be reset after it's found to be unusable. Fixes #6724 (see issue for repro steps) --- .../main/java/com/cloud/utils/db/ConnectionConcierge.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/framework/db/src/main/java/com/cloud/utils/db/ConnectionConcierge.java b/framework/db/src/main/java/com/cloud/utils/db/ConnectionConcierge.java index a1c473d5ffd..2ae0de90f26 100644 --- a/framework/db/src/main/java/com/cloud/utils/db/ConnectionConcierge.java +++ b/framework/db/src/main/java/com/cloud/utils/db/ConnectionConcierge.java @@ -174,7 +174,7 @@ public class ConnectionConcierge { Connection conn = TransactionLegacy.getStandaloneConnection(); if (conn == null) { - return "Unable to get anotehr db connection"; + return "Unable to get another db connection"; } concierge.reset(conn); @@ -198,9 +198,13 @@ public class ConnectionConcierge { protected void runInContext() { s_logger.trace("connection concierge keep alive task"); for (Map.Entry entry : _conns.entrySet()) { + String name = entry.getKey(); ConnectionConcierge concierge = entry.getValue(); if (concierge.keepAlive()) { - testValidity(entry.getKey(), entry.getValue().conn()); + if (testValidity(name, concierge.conn()) != null) { + s_logger.info("Resetting DB connection " + name); + resetConnection(name); + } } } }