From 65a7f1c145d51c789072134f15aa0b8f03c86da5 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Tue, 27 Jan 2026 18:21:17 +0200 Subject: [PATCH] add guardian lock for dispatcher route race condition --- dispatchers/libdispatcher.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dispatchers/libdispatcher.go b/dispatchers/libdispatcher.go index 466681ec7..33223c8ce 100644 --- a/dispatchers/libdispatcher.go +++ b/dispatchers/libdispatcher.go @@ -24,7 +24,9 @@ import ( "strconv" "sync" + "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/guardian" "github.com/cgrates/cgrates/utils" ) @@ -230,6 +232,9 @@ func (*singleResultstrategyDispatcher) dispatch(dm *engine.DataManager, routeID if routeID != nil && *routeID != "" { // overwrite routeID with RouteID:Subsystem *routeID = utils.ConcatenatedKey(*routeID, subsystem) + guardID := utils.ConcatenatedKey(utils.DispatcherS, utils.RouteID, *routeID) + refID := guardian.Guardian.GuardIDs("", config.CgrConfig().GeneralCfg().LockingTimeout, guardID) + defer guardian.Guardian.UnguardIDs(refID) // use previously discovered route if x, ok := engine.Cache.Get(utils.CacheDispatcherRoutes, *routeID); ok && x != nil { @@ -316,6 +321,9 @@ func (ld *loadStrategyDispatcher) dispatch(dm *engine.DataManager, routeID *stri if routeID != nil && *routeID != "" { // overwrite routeID with RouteID:Subsystem *routeID = utils.ConcatenatedKey(*routeID, subsystem) + guardID := utils.ConcatenatedKey(utils.DispatcherS, utils.RouteID, *routeID) + refID := guardian.Guardian.GuardIDs("", config.CgrConfig().GeneralCfg().LockingTimeout, guardID) + defer guardian.Guardian.UnguardIDs(refID) // use previously discovered route if x, ok := engine.Cache.Get(utils.CacheDispatcherRoutes, *routeID); ok && x != nil {