diff --git a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java index 49394e88b78..48ed6a7dc48 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java +++ b/compute/src/main/java/org/zstack/compute/host/HostTrackImpl.java @@ -251,6 +251,11 @@ public void cancel() { public void trackHost(String hostUuid) { + if (!destMaker.isManagedByUs(hostUuid)) { + logger.debug(String.format("skip tracking host[uuid:%s], not managed by us", hostUuid)); + return; + } + Tracker t = trackers.get(hostUuid); if (t != null) { t.cancel(); diff --git a/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy b/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy index eaf774fb84f..87a06e15abd 100644 --- a/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy +++ b/test/src/test/groovy/org/zstack/test/integration/kvm/host/HostConnectedTimeCase.groovy @@ -16,6 +16,11 @@ import org.zstack.utils.gson.JSONObjectUtil import org.zstack.header.network.l2.BatchCheckNetworkPhysicalInterfaceMsg import org.zstack.header.network.l2.BatchCheckNetworkPhysicalInterfaceReply import org.zstack.core.cloudbus.CloudBus +import org.zstack.core.cloudbus.ResourceDestinationMaker +import org.zstack.compute.host.HostTrackImpl + +import static org.mockito.Mockito.mock +import static org.mockito.Mockito.when class HostConnectedTimeCase extends SubCase { @@ -34,6 +39,7 @@ class HostConnectedTimeCase extends SubCase { @Override void test() { env.create { + testSkipTrackIfNotManagedByUs() testHostConnectedTime() } } @@ -43,6 +49,31 @@ class HostConnectedTimeCase extends SubCase { env.delete() } + /** + * Test for ZSTAC-76341: check isManagedByUs before trackHost to prevent dual MN tracking + */ + void testSkipTrackIfNotManagedByUs() { + HostInventory host = env.inventoryByName("kvm") as HostInventory + HostTrackImpl tracker = bean(HostTrackImpl.class) + + ResourceDestinationMaker originalDestMaker = tracker.@destMaker + + ResourceDestinationMaker mockDestMaker = mock(ResourceDestinationMaker.class) + when(mockDestMaker.isManagedByUs(host.uuid)).thenReturn(false) + tracker.@destMaker = mockDestMaker + + tracker.untrackHost(host.uuid) + assert !tracker.trackers.containsKey(host.uuid) + + tracker.trackHost(host.uuid) + assert !tracker.trackers.containsKey(host.uuid) : "Host should NOT be tracked when isManagedByUs returns false" + + tracker.@destMaker = originalDestMaker + + tracker.trackHost(host.uuid) + assert tracker.trackers.containsKey(host.uuid) : "Host should be tracked when isManagedByUs returns true" + } + void testHostConnectedTime() { HostInventory host = env.inventoryByName("kvm")