diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index 50fe295f2d..a5eb7a93a3 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -521,6 +521,7 @@ public static class HostFactResponse extends AgentResponse { @GrayVersion(value = "5.0.0") private VirtualizerInfoTO virtualizerInfo; private String iscsiInitiatorName; + private String cpuFeatureMd5; public String getOsDistribution() { return osDistribution; @@ -782,6 +783,14 @@ public String getDeployMode() { public void setDeployMode(String deployMode) { this.deployMode = deployMode; } + + public String getCpuFeatureMd5() { + return cpuFeatureMd5; + } + + public void setCpuFeatureMd5(String cpuFeatureMd5) { + this.cpuFeatureMd5 = cpuFeatureMd5; + } } public static class HostCapacityCmd extends AgentCommand { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index 558aded638..6a6bbcd382 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -6206,10 +6206,35 @@ private void saveKvmHostRelatedFacts(HostFactResponse ret) { } deleteCpuHistoryVOIfCpuModeNameChange(ret.getCpuModelName()); + + // check CPU feature MD5 change + String newMd5 = ret.getCpuFeatureMd5(); + if (newMd5 != null) { + String oldMd5 = KVMSystemTags.CPU_FEATURE_MD5.getTokenByResourceUuid( + self.getUuid(), KVMSystemTags.CPU_FEATURE_MD5_TOKEN); + + if (oldMd5 != null && !oldMd5.equals(newMd5)) { + deleteCpuHistoryVOOnCpuFeatureChange(); + logger.debug(String.format("host[uuid:%s] CPU feature changed, old MD5: %s, new MD5: %s, deleted related CpuFeaturesHistoryVO records", + self.getUuid(), oldMd5, newMd5)); + } + + createTagWithoutNonValue(KVMSystemTags.CPU_FEATURE_MD5, + KVMSystemTags.CPU_FEATURE_MD5_TOKEN, newMd5, true); + } } }; } + private void deleteCpuHistoryVOOnCpuFeatureChange() { + SQL.New(CpuFeaturesHistoryVO.class) + .eq(CpuFeaturesHistoryVO_.srcHostUuid, self.getUuid()) + .delete(); + SQL.New(CpuFeaturesHistoryVO.class) + .eq(CpuFeaturesHistoryVO_.dstHostUuid, self.getUuid()) + .delete(); + } + private void deleteCpuHistoryVOIfCpuModeNameChange(String cpuModelName){ // delete all records that do not match the cpuModelName of the source physical machine SQL.New(CpuFeaturesHistoryVO.class) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java index d1dc3a495e..e5c14fb9d5 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMSystemTags.java @@ -35,6 +35,9 @@ public class KVMSystemTags { public static final String CPU_MODEL_NAME_TOKEN = "name"; public static PatternedSystemTag CPU_MODEL_NAME = new PatternedSystemTag(String.format("cpuModelName::{%s}", CPU_MODEL_NAME_TOKEN), HostVO.class); + public static final String CPU_FEATURE_MD5_TOKEN = "cpuFeatureMd5"; + public static PatternedSystemTag CPU_FEATURE_MD5 = new PatternedSystemTag(String.format("cpuFeatureMd5::{%s}", CPU_FEATURE_MD5_TOKEN), HostVO.class); + public static final String CHECK_CLUSTER_CPU_MODEL_TOKEN = "enable"; public static PatternedSystemTag CHECK_CLUSTER_CPU_MODEL = new PatternedSystemTag(String.format("check::cluster::cpu::model::{%s}", CHECK_CLUSTER_CPU_MODEL_TOKEN), ClusterVO.class);