Keep subtag acks and alarm reads safe on the managed ack path
ci / nightly-windev (push) Has been skipped
ci / windows-x86 (pull_request) Successful in 2m0s
ci / nightly-windev (pull_request) Has been skipped
ci / java (pull_request) Successful in 2m16s
ci / java (push) Successful in 2m19s
ci / portable (push) Failing after 2m31s
ci / portable (pull_request) Failing after 2m36s
ci / windows-x86 (push) Successful in 3m11s
ci / nightly-windev (push) Has been skipped
ci / windows-x86 (pull_request) Successful in 2m0s
ci / nightly-windev (pull_request) Has been skipped
ci / java (pull_request) Successful in 2m16s
ci / java (push) Successful in 2m19s
ci / portable (push) Failing after 2m31s
ci / portable (pull_request) Failing after 2m36s
ci / windows-x86 (push) Successful in 3m11s
Review fixes for the opt-in managed GUID ack: - Subtag-mode GUID acks (forced subtag, or failover on the standby) stay on the consumer; their GUIDs are synthetic and only the subtag consumer can resolve them. Forced-subtag sessions no longer build a managed client. - A failed managed Initialize/Register/Subscribe drops back to the wnwrap ack path instead of failing the alarm subscription. - Drop stale crefs to a nonexistent Unverified member in WnalNativeAckConsumer. - Unit tests for routing, fallback, and disposal; document MXGATEWAY_USE_MANAGED_ALARM_ACK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -793,6 +793,28 @@ in the codebase for the forward-compat shape, but the gateway-side
|
||||
`AcknowledgeAlarmByName` when the public RPC supplies a recognizable
|
||||
`Provider!Group.Tag` reference.
|
||||
|
||||
**Opt-in managed GUID ack.** Setting `MXGATEWAY_USE_MANAGED_ALARM_ACK=1`
|
||||
in the gateway's environment (workers inherit it) routes GUID-keyed acks
|
||||
through `aaAlarmManagedClient.AlarmClient.AlarmAckByGUID` instead of the
|
||||
wnwrap method. That managed method is implemented on this build and
|
||||
carries operator domain and full name natively. The worker reaches it by
|
||||
reflection (`AaManagedAlarmAckConsumer`) because the members are
|
||||
non-public, and runs its own Initialize → Register → Subscribe lifecycle
|
||||
against the alarm subscription expression. The path is deliberately
|
||||
conservative:
|
||||
|
||||
- If the DLL cannot load or the lifecycle returns a non-zero status, the
|
||||
worker drops back to the wnwrap ack path; alarm reads never fail
|
||||
because of it.
|
||||
- Subtag-mode acks (forced subtag, or failover currently on the standby)
|
||||
stay on the subtag consumer: their GUIDs are synthetic and only it can
|
||||
resolve them.
|
||||
- By-name acks stay on wnwrap — `AlarmClient` has no by-name ack.
|
||||
|
||||
A zero return still means *accepted*, not *applied*; a secured
|
||||
(`MxSecurityOperate`) alarm needs an authenticated operator. The skip-gated
|
||||
`AlarmManagedGuidAckLiveSmokeTests` asserts the ack actually lands.
|
||||
|
||||
### 5. STA / threading — resolved
|
||||
|
||||
The wnwrap COM is `ThreadingModel=Apartment`. The consumer's
|
||||
|
||||
Reference in New Issue
Block a user