namespace ZB.MOM.WW.OtOpcUa.Commons.Messages.Deploy; /// /// The deploy-path timing contract shared by central (ConfigPublishCoordinator) and the node /// (DriverHostActor). One place, so the node's ack-hold timeout can never drift past the deadline /// central times the deployment out on. /// public static class DeployTimings { /// How long central waits for every expected node's ack before sealing the deployment TimedOut /// (ConfigPublishCoordinator.DefaultApplyDeadline). public static readonly TimeSpan ApplyDeadline = TimeSpan.FromMinutes(2); /// Gitea #601 — how far inside a node's held Applied ack is released /// when the address-space outcome has not arrived, leaving room for transport latency. public static readonly TimeSpan ApplyOutcomeSafetyMargin = TimeSpan.FromSeconds(15); /// Gitea #601 — the node's default apply-outcome timeout: − /// (105 s). Long enough that a slow-but-clean rebuild of a large /// address space is not labelled degraded, short enough to ack before central gives up. /// The timer is armed after the artifact read and driver reconcile, so if those alone took /// longer than the margin the ack can still land after the deadline — accepted: they are seconds in /// practice, and lengthening the margin would label more slow-but-clean rebuilds degraded. public static TimeSpan ApplyOutcomeTimeout => ApplyDeadline - ApplyOutcomeSafetyMargin; }