Skip to content

Commit d0545cb

Browse files
AlanJagerclaude
andcommitted
<fix>[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 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9826a0e commit d0545cb

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
import org.zstack.header.host.HostInventory;
2121
import org.zstack.header.host.HostVO;
2222
import org.zstack.header.message.MessageReply;
23-
import org.zstack.header.storage.addon.primary.BaseVolumeInfo;
24-
import org.zstack.header.storage.addon.primary.HeartbeatVolumeTO;
25-
import org.zstack.header.storage.addon.primary.HeartbeatVolumeTopology;
26-
import org.zstack.header.storage.addon.primary.PrimaryStorageNodeSvc;
23+
import org.zstack.header.storage.addon.primary.*;
24+
import org.zstack.storage.addon.primary.ExternalHostIdGetter;
2725
import org.zstack.header.vm.VmInstanceInventory;
2826
import org.zstack.header.vm.VmInstanceMigrateExtensionPoint;
2927
import org.zstack.header.vm.VmInstanceSpec;
@@ -38,6 +36,8 @@
3836
import org.zstack.kvm.*;
3937
import org.zstack.storage.addon.primary.ExternalPrimaryStorageFactory;
4038
import org.zstack.utils.DebugUtils;
39+
import org.zstack.utils.Utils;
40+
import org.zstack.utils.logging.CLogger;
4141

4242
import java.util.ArrayList;
4343
import java.util.List;
@@ -49,6 +49,8 @@
4949
public class KvmIscsiNodeServer implements Component, KVMStartVmExtensionPoint, VmInstanceMigrateExtensionPoint,
5050
KVMConvertVolumeExtensionPoint, KVMDetachVolumeExtensionPoint, KVMAttachVolumeExtensionPoint,
5151
KVMPreAttachIsoExtensionPoint, KvmSetupSelfFencerExtensionPoint {
52+
private static final CLogger logger = Utils.getLogger(KvmIscsiNodeServer.class);
53+
5254
@Autowired
5355
private ExternalPrimaryStorageFactory extPsFactory;
5456

@@ -235,13 +237,24 @@ public void fail(ErrorCode errorCode) {
235237

236238
@Override
237239
public void run(FlowTrigger trigger, Map data) {
240+
ExternalPrimaryStorageHostRefVO ref = Q.New(ExternalPrimaryStorageHostRefVO.class)
241+
.eq(ExternalPrimaryStorageHostRefVO_.hostUuid, param.getHostUuid())
242+
.eq(ExternalPrimaryStorageHostRefVO_.primaryStorageUuid, param.getPrimaryStorage().getUuid())
243+
.find();
244+
if (ref == null || ref.getHostId() == 0) {
245+
logger.warn(String.format("not found hostId for hostUuid[%s] and primaryStorageUuid[%s]",
246+
param.getHostUuid(), param.getPrimaryStorage().getUuid()));
247+
ref = new ExternalHostIdGetter(999).getOrAllocateHostIdRef(
248+
param.getHostUuid(), param.getPrimaryStorage().getUuid());
249+
}
250+
238251
KvmSetupSelfFencerCmd cmd = new KvmSetupSelfFencerCmd();
239252
cmd.interval = param.getInterval();
240253
cmd.maxAttempts = param.getMaxAttempts();
241254
cmd.coveringPaths = heartbeatVol.getCoveringPaths();
242255
cmd.heartbeatUrl = heartbeatVol.getInstallPath();
243256
cmd.storageCheckerTimeout = param.getStorageCheckerTimeout();
244-
cmd.hostId = heartbeatVol.getHostId();
257+
cmd.hostId = ref.getHostId();
245258
cmd.heartbeatRequiredSpace = heartbeatVol.getHeartbeatRequiredSpace();
246259
cmd.hostUuid = param.getHostUuid();
247260
cmd.strategy = param.getStrategy();

0 commit comments

Comments
 (0)