From ecc93ebd9b3e7b5059e540c3eac503be504cf283 Mon Sep 17 00:00:00 2001 From: "ye.zou" Date: Thu, 5 Mar 2026 20:34:25 +0800 Subject: [PATCH] [iscsi]: use platform compact hostId instead of storage bdc id for heartbeat offset ZSTAC-81797: iSCSI fencer used HeartbeatVolumeTO.hostId (storage bdc id, incremental up to 2000+) as heartbeat write offset multiplier. With 1MB heartbeat_required_space, host_id=2000 causes 2000MB offset, exceeding the 2GB heartbeat volume and failing heartbeat writes. Fix: use ExternalPrimaryStorageHostRefVO.hostId (platform-managed compact ID in [1, 999]) instead, same as CBD fencer already does. Resolves: ZSTAC-81797 Change-Id: Icac5ee2059df7cf93ca4bc23829ce855d6a7184c Co-Authored-By: Claude Opus 4.6 --- .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 66936e05dc0..0f773d193e7 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -20,10 +20,8 @@ import org.zstack.header.host.HostInventory; import org.zstack.header.host.HostVO; import org.zstack.header.message.MessageReply; -import org.zstack.header.storage.addon.primary.BaseVolumeInfo; -import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO; -import org.zstack.header.storage.addon.primary.HeartbeatVolumeTopology; -import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc; +import org.zstack.header.storage.addon.primary.*; +import org.zstack.storage.addon.primary.ExternalHostIdGetter; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.vm.VmInstanceMigrateExtensionPoint; import org.zstack.header.vm.VmInstanceSpec; @@ -38,6 +36,8 @@ import org.zstack.kvm.*; import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory; import org.zstack.utils.DebugUtils; +import org.zstack.utils.Utils; +import org.zstack.utils.logging.CLogger; import java.util.ArrayList; import java.util.List; @@ -49,6 +49,8 @@ public class KvmIscsiNodeServer implements Component, KVMStartVmExtensionPoint, VmInstanceMigrateExtensionPoint, KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint, KVMPreAttachIsoExtensionPoint, KvmSetupSelfFencerExtensionPoint { + private static final CLogger logger = Utils.getLogger(KvmIscsiNodeServer.class); + @Autowired private ExternalPrimaryStorageFactory extPsFactory; @@ -235,13 +237,24 @@ public void fail(ErrorCode errorCode) { @Override public void run(FlowTrigger trigger, Map data) { + ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class) + .eq(ExternalPrimaryStorageHostRefVO_.hostUuid, param.getHostUuid()) + .eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, param.getPrimaryStorage().getUuid()) + .find(); + if (ref == null || ref.getHostId() == 0) { + logger.warn(String.format("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]", + param.getHostUuid(), param.getPrimaryStorage().getUuid())); + ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef( + param.getHostUuid(), param.getPrimaryStorage().getUuid()); + } + KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd(); cmd.interval = param.getInterval(); cmd.maxAttempts = param.getMaxAttempts(); cmd.coveringPaths = heartbeatVol.getCoveringPaths(); cmd.heartbeatUrl = heartbeatVol.getInstallPath(); cmd.storageCheckerTimeout = param.getStorageCheckerTimeout(); - cmd.hostId = heartbeatVol.getHostId(); + cmd.hostId = ref.getHostId(); cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace(); cmd.hostUuid = param.getHostUuid(); cmd.strategy = param.getStrategy();