20392cf246
Interlocking changes across the gateway server (shared GatewaySession.cs / SessionManager.cs), committed together: - GWC-01 (Critical): alarm monitor now attaches as an internal (non-counted) distributor subscriber instead of a second raw drain of the single worker event channel; WorkerClient._events -> SingleReader with a claimed-once guard so a future dual-consumer regression throws loudly. - GWC-02 (High): faulted sessions are swept in CloseExpiredLeasesAsync (IsFaultedReapable + FaultedReason); new FaultedGraceSeconds (default 0). - GWC-03 (High): configurable MaxSparseArrayLength (default 1_000_000) enforced before allocation. - TST-02 (High, security): StreamEvents attach now enforces the opening key id -> PermissionDenied on owner mismatch. - TST-12 (Medium): CLAUDE.md retention-defaults sentence corrected. Verified: NonWindows build clean; targeted tests 135/135 on macOS, plus WorkerClientTests 18/18 on the Windows host.
41 lines
1.8 KiB
C#
41 lines
1.8 KiB
C#
namespace ZB.MOM.WW.MxGateway.Server.Configuration;
|
|
|
|
public sealed class EventOptions
|
|
{
|
|
/// <summary>
|
|
/// Gets the event queue capacity.
|
|
/// </summary>
|
|
public int QueueCapacity { get; init; } = 10_000;
|
|
|
|
/// <summary>
|
|
/// Gets the backpressure policy for event queue overflow.
|
|
/// </summary>
|
|
public EventBackpressurePolicy BackpressurePolicy { get; init; } = EventBackpressurePolicy.FailFast;
|
|
|
|
/// <summary>
|
|
/// Gets the maximum number of events retained in the per-session replay ring buffer
|
|
/// used to re-deliver events a returning subscriber missed (reconnect/reattach).
|
|
/// When the buffer exceeds this count the oldest retained events are evicted first.
|
|
/// A value of <c>0</c> disables replay retention entirely.
|
|
/// </summary>
|
|
public int ReplayBufferCapacity { get; init; } = 1024;
|
|
|
|
/// <summary>
|
|
/// Gets the maximum age, in seconds, of an event retained in the per-session replay
|
|
/// ring buffer. Entries older than this are evicted regardless of capacity. A value
|
|
/// of <c>0</c> disables age-based eviction (only <see cref="ReplayBufferCapacity"/>
|
|
/// bounds the buffer).
|
|
/// </summary>
|
|
public double ReplayRetentionSeconds { get; init; } = 300;
|
|
|
|
/// <summary>
|
|
/// Gets the maximum <c>total_length</c> a sparse-array write may declare before the
|
|
/// gateway rejects it with <c>InvalidArgument</c>, enforced in
|
|
/// <see cref="Sessions.SparseArrayExpander"/> before the full array is materialized.
|
|
/// Guards against a single write forcing a multi-GB allocation. The default of
|
|
/// 1,000,000 elements is far above any realistic MXAccess array write yet well below
|
|
/// the frame-size ceiling.
|
|
/// </summary>
|
|
public int MaxSparseArrayLength { get; init; } = 1_000_000;
|
|
}
|