From 725854a9333537220696fd226469e0fd02d7f489 Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Thu, 2 Jul 2026 13:30:27 +0800 Subject: [PATCH] [kvm]: sync explicit timeout to command Sync an explicitly configured KVM message timeout into HasThreadContext command task context before serializing the command, so agent-side task timeout receives the same fresh deadline. Resolves: ZSTAC-85800 Change-Id: Ia6df378166f2e0600dfa2b1985b2ce722187fac0 --- .../java/org/zstack/kvm/KVMHostHttpCallMsg.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostHttpCallMsg.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostHttpCallMsg.java index 9e2730d3b08..ccaee04cda9 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostHttpCallMsg.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHostHttpCallMsg.java @@ -1,11 +1,15 @@ package org.zstack.kvm; +import org.zstack.core.timeout.ApiTimeoutManagerImpl; +import org.zstack.header.HasThreadContext; import org.zstack.header.host.HostMessage; import org.zstack.header.log.NoLogging; import org.zstack.header.message.CarrierMessage; import org.zstack.header.message.NeedReplyMessage; import org.zstack.utils.gson.JSONObjectUtil; +import java.util.Map; + public abstract class KVMHostHttpCallMsg extends NeedReplyMessage implements HostMessage, CarrierMessage { private String path; @NoLogging(behavior = NoLogging.Behavior.Auto, classNameField = "commandClassName") @@ -39,6 +43,15 @@ public String getCommand() { } public void setCommand(Object command) { + if (command instanceof HasThreadContext && getTimeout() != -1) { + Map taskContext = ((HasThreadContext) command).getTaskContext(); + if (taskContext != null) { + taskContext.put(ApiTimeoutManagerImpl.TASK_CONTEXT_MESSAGE_TIMEOUT, String.valueOf(getTimeout())); + taskContext.put(ApiTimeoutManagerImpl.TASK_CONTEXT_MESSAGE_DEADLINE, + String.valueOf(getMessageDeadline() != -1 ? getMessageDeadline() : + System.currentTimeMillis() + getTimeout())); + } + } this.command = JSONObjectUtil.toJsonString(command); commandClassName = command.getClass().getName(); }