From 7a24dbd3f7f39c0bd3b887003e8b48f3f685ba25 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 7 May 2026 18:53:08 +0200 Subject: [PATCH] OCPP: fix flaky test deadlock between trigger handler and WS read loop (#29725) --- charger/ocpp_test_handler.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/charger/ocpp_test_handler.go b/charger/ocpp_test_handler.go index 1069dedb0..f3031c8b6 100644 --- a/charger/ocpp_test_handler.go +++ b/charger/ocpp_test_handler.go @@ -14,7 +14,10 @@ type ChargePointHandler struct { // core func (handler *ChargePointHandler) OnChangeAvailability(request *core.ChangeAvailabilityRequest) (confirmation *core.ChangeAvailabilityConfirmation, err error) { - defer func() { handler.triggerC <- core.ChangeAvailabilityFeatureName }() + // dispatch asynchronously: the trigger handler issues synchronous CP→CS + // requests whose responses are read by this same goroutine, so a blocking + // send would deadlock the WebSocket read loop + go func() { handler.triggerC <- core.ChangeAvailabilityFeatureName }() return core.NewChangeAvailabilityConfirmation(core.AvailabilityStatusAccepted), nil } @@ -61,7 +64,8 @@ func (handler *ChargePointHandler) OnUnlockConnector(request *core.UnlockConnect } func (handler *ChargePointHandler) OnTriggerMessage(request *remotetrigger.TriggerMessageRequest) (confirmation *remotetrigger.TriggerMessageConfirmation, err error) { - defer func() { handler.triggerC <- request.RequestedMessage }() + // see OnChangeAvailability for why this is async + go func() { handler.triggerC <- request.RequestedMessage }() return remotetrigger.NewTriggerMessageConfirmation(remotetrigger.TriggerMessageStatusAccepted), nil }