From 3d169f64fe789940135dd319ca445e6bb5d03c79 Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 6 Oct 2023 16:31:18 +0200 Subject: [PATCH] Ocpp: fix a race condition --- charger/ocpp/cs.go | 3 +++ charger/ocpp/cs_core.go | 30 ------------------------------ charger/ocpp/instance.go | 7 ++++++- 3 files changed, 9 insertions(+), 31 deletions(-) diff --git a/charger/ocpp/cs.go b/charger/ocpp/cs.go index 3f5929fd9..9a303c1a6 100644 --- a/charger/ocpp/cs.go +++ b/charger/ocpp/cs.go @@ -44,6 +44,9 @@ func (cs *CS) errorHandler(errC <-chan error) { } func (cs *CS) ChargepointByID(id string) (*CP, error) { + cs.mu.Lock() + defer cs.mu.Unlock() + cp, ok := cs.cps[id] if !ok { return nil, fmt.Errorf("unknown charge point: %s", id) diff --git a/charger/ocpp/cs_core.go b/charger/ocpp/cs_core.go index ac833ff40..551a4644a 100644 --- a/charger/ocpp/cs_core.go +++ b/charger/ocpp/cs_core.go @@ -47,9 +47,6 @@ func (cs *CS) TriggerMessageRequest(id string, requestedMessage remotetrigger.Me // cp actions func (cs *CS) OnAuthorize(id string, request *core.AuthorizeRequest) (*core.AuthorizeConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -59,9 +56,6 @@ func (cs *CS) OnAuthorize(id string, request *core.AuthorizeRequest) (*core.Auth } func (cs *CS) OnBootNotification(id string, request *core.BootNotificationRequest) (*core.BootNotificationConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -71,9 +65,6 @@ func (cs *CS) OnBootNotification(id string, request *core.BootNotificationReques } func (cs *CS) OnDataTransfer(id string, request *core.DataTransferRequest) (*core.DataTransferConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -83,9 +74,6 @@ func (cs *CS) OnDataTransfer(id string, request *core.DataTransferRequest) (*cor } func (cs *CS) OnHeartbeat(id string, request *core.HeartbeatRequest) (*core.HeartbeatConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -95,9 +83,6 @@ func (cs *CS) OnHeartbeat(id string, request *core.HeartbeatRequest) (*core.Hear } func (cs *CS) OnMeterValues(id string, request *core.MeterValuesRequest) (*core.MeterValuesConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -107,9 +92,6 @@ func (cs *CS) OnMeterValues(id string, request *core.MeterValuesRequest) (*core. } func (cs *CS) OnStatusNotification(id string, request *core.StatusNotificationRequest) (*core.StatusNotificationConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -119,9 +101,6 @@ func (cs *CS) OnStatusNotification(id string, request *core.StatusNotificationRe } func (cs *CS) OnStartTransaction(id string, request *core.StartTransactionRequest) (*core.StartTransactionConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -131,9 +110,6 @@ func (cs *CS) OnStartTransaction(id string, request *core.StartTransactionReques } func (cs *CS) OnStopTransaction(id string, request *core.StopTransactionRequest) (*core.StopTransactionConfirmation, error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -143,9 +119,6 @@ func (cs *CS) OnStopTransaction(id string, request *core.StopTransactionRequest) } func (cs *CS) OnDiagnosticsStatusNotification(id string, request *firmware.DiagnosticsStatusNotificationRequest) (confirmation *firmware.DiagnosticsStatusNotificationConfirmation, err error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err @@ -155,9 +128,6 @@ func (cs *CS) OnDiagnosticsStatusNotification(id string, request *firmware.Diagn } func (cs *CS) OnFirmwareStatusNotification(id string, request *firmware.FirmwareStatusNotificationRequest) (confirmation *firmware.FirmwareStatusNotificationConfirmation, err error) { - cs.mu.Lock() - defer cs.mu.Unlock() - cp, err := cs.ChargepointByID(id) if err != nil { return nil, err diff --git a/charger/ocpp/instance.go b/charger/ocpp/instance.go index 73da687c5..8b8cae70c 100644 --- a/charger/ocpp/instance.go +++ b/charger/ocpp/instance.go @@ -52,7 +52,12 @@ func Instance() *CS { go instance.errorHandler(cs.Errors()) go cs.Start(8887, "/{ws}") - time.Sleep(time.Second) + // wait for server to start + for range time.Tick(10 * time.Millisecond) { + if dispatcher.IsRunning() { + break + } + } }) return instance