From b7c970f45f1deaba32171ab8a1aa15820009e7d9 Mon Sep 17 00:00:00 2001 From: Nicolas Vazquez Date: Wed, 11 Feb 2026 09:47:21 -0300 Subject: [PATCH] Fix issue with multiple KVM Host entries in host table (#12589) --- .../com/cloud/resource/ResourceManager.java | 2 ++ .../cloud/resource/ResourceManagerImpl.java | 27 ++++++++++++++++--- .../resource/MockResourceManagerImpl.java | 5 ++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java b/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java index 936e8b3448e..059578ab2ca 100755 --- a/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java +++ b/engine/components-api/src/main/java/com/cloud/resource/ResourceManager.java @@ -154,6 +154,8 @@ public interface ResourceManager extends ResourceService, Configurable { public HostVO findHostByGuid(String guid); + HostVO findHostByGuidPrefix(String guid); + public HostVO findHostByName(String name); HostStats getHostStatistics(Host host); diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java index 12ceac21322..96331477e89 100755 --- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java @@ -2261,15 +2261,26 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, private HostVO getNewHost(StartupCommand[] startupCommands) { StartupCommand startupCommand = startupCommands[0]; - HostVO host = findHostByGuid(startupCommand.getGuid()); + String fullGuid = startupCommand.getGuid(); + logger.debug(String.format("Trying to find Host by guid %s", fullGuid)); + HostVO host = findHostByGuid(fullGuid); if (host != null) { + logger.debug(String.format("Found Host by guid %s: %s", fullGuid, host)); return host; } - host = findHostByGuid(startupCommand.getGuidWithoutResource()); + String guidPrefix = startupCommand.getGuidWithoutResource(); + logger.debug(String.format("Trying to find Host by guid prefix %s", guidPrefix)); + host = findHostByGuidPrefix(guidPrefix); - return host; // even when host == null! + if (host != null) { + logger.debug(String.format("Found Host by guid prefix %s: %s", guidPrefix, host)); + return host; + } + + logger.debug(String.format("Could not find Host by guid %s", fullGuid)); + return null; } protected HostVO createHostVO(final StartupCommand[] cmds, final ServerResource resource, final Map details, List hostTags, @@ -3296,6 +3307,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, public HostVO findHostByGuid(final String guid) { final QueryBuilder sc = QueryBuilder.create(HostVO.class); sc.and(sc.entity().getGuid(), Op.EQ, guid); + sc.and(sc.entity().getRemoved(), Op.NULL); + return sc.find(); + } + + @Override + public HostVO findHostByGuidPrefix(String guid) { + final QueryBuilder sc = QueryBuilder.create(HostVO.class); + sc.and(sc.entity().getGuid(), Op.LIKE, guid + "%"); + sc.and(sc.entity().getRemoved(), Op.NULL); return sc.find(); } @@ -3303,6 +3323,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, public HostVO findHostByName(final String name) { final QueryBuilder sc = QueryBuilder.create(HostVO.class); sc.and(sc.entity().getName(), Op.EQ, name); + sc.and(sc.entity().getRemoved(), Op.NULL); return sc.find(); } diff --git a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java index b7bb2238334..48ac105a320 100755 --- a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java +++ b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java @@ -460,6 +460,11 @@ public class MockResourceManagerImpl extends ManagerBase implements ResourceMana return null; } + @Override + public HostVO findHostByGuidPrefix(String guid) { + return null; + } + /* (non-Javadoc) * @see com.cloud.resource.ResourceManager#findHostByName(java.lang.String) */