From 44a55a0edc639569b757149cd2b455c360cb0885 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 13 Mar 2019 11:54:10 +0200 Subject: [PATCH] Updated asActiveSessions --- sessions/session.go | 33 +++++++++++++++++++++++++++++++++ sessions/sessions.go | 39 +++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/sessions/session.go b/sessions/session.go index 1b8bdb192..a1779b61a 100644 --- a/sessions/session.go +++ b/sessions/session.go @@ -150,6 +150,39 @@ func (s *Session) AsActiveSessions(tmz, nodeID string) (aSs []*ActiveSession) { s.RUnlock() return } +func (s *Session) asActiveSessions(sr *SRun, tmz, nodeID string) (aS *ActiveSession) { + s.RLock() + aS = &ActiveSession{ + CGRID: s.CGRID, + RunID: sr.Event.GetStringIgnoreErrors(utils.RunID), + ToR: sr.Event.GetStringIgnoreErrors(utils.ToR), + OriginID: s.EventStart.GetStringIgnoreErrors(utils.OriginID), + OriginHost: s.EventStart.GetStringIgnoreErrors(utils.OriginHost), + Source: utils.SessionS + "_" + s.EventStart.GetStringIgnoreErrors(utils.EVENT_NAME), + RequestType: sr.Event.GetStringIgnoreErrors(utils.RequestType), + Tenant: s.Tenant, + Category: sr.Event.GetStringIgnoreErrors(utils.Category), + Account: sr.Event.GetStringIgnoreErrors(utils.Account), + Subject: sr.Event.GetStringIgnoreErrors(utils.Subject), + Destination: sr.Event.GetStringIgnoreErrors(utils.Destination), + SetupTime: sr.Event.GetTimeIgnoreErrors(utils.SetupTime, tmz), + AnswerTime: sr.Event.GetTimeIgnoreErrors(utils.AnswerTime, tmz), + Usage: sr.TotalUsage, + ExtraFields: sr.Event.AsMapStringIgnoreErrors( + utils.NewStringMap(utils.MainCDRFields...)), + NodeID: nodeID, + DebitInterval: s.DebitInterval, + } + if sr.CD != nil { + aS.LoopIndex = sr.CD.LoopIndex + aS.DurationIndex = sr.CD.DurationIndex + aS.MaxRate = sr.CD.MaxRate + aS.MaxRateUnit = sr.CD.MaxRateUnit + aS.MaxCostSoFar = sr.CD.MaxCostSoFar + } + s.RUnlock() + return +} // TotalUsage returns the first session run total usage func (s *Session) TotalUsage() (tDur time.Duration) { diff --git a/sessions/sessions.go b/sessions/sessions.go index 5b2595b46..b4656f262 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -903,31 +903,30 @@ func (sS *SessionS) asActiveSessions(fltrs map[string]string, var remainingSessions []*Session // Survived index matching ss := sS.getSessions(fltrs[utils.CGRID], psv) for _, s := range ss { - remainingSessions = append(remainingSessions, s.Clone()) + remainingSessions = append(remainingSessions, s) } if len(fltrs) != 0 { // Still have some filters to match - for i := 0; i < len(remainingSessions); { - if !remainingSessions[i].EventStart.HasField(utils.RunID) { // ToDo: try removing dependency on default run - remainingSessions[i].EventStart.Set(utils.RunID, utils.META_DEFAULT) - } - matchingAll := true - for fltrFldName, fltrFldVal := range fltrs { - if remainingSessions[i].EventStart.GetStringIgnoreErrors(fltrFldName) != fltrFldVal { // No Match - matchingAll = false - break + for _, s := range remainingSessions { + for _, sr := range s.SRuns { + matchingAll := true + for fltrFldName, fltrFldVal := range fltrs { + if sr.Event.GetStringIgnoreErrors(fltrFldName) != fltrFldVal { // No Match + matchingAll = false + break + } + } + if matchingAll { + aSs = append(aSs, s.asActiveSessions(sr, sS.cgrCfg.GeneralCfg().DefaultTimezone, + sS.cgrCfg.GeneralCfg().NodeID)) } } - if !matchingAll { - remainingSessions = append(remainingSessions[:i], remainingSessions[i+1:]...) - continue // if we have stripped, don't increase index so we can check next element by next run - } - i++ } - } - for _, s := range remainingSessions { - aSs = append(aSs, - s.AsActiveSessions(sS.cgrCfg.GeneralCfg().DefaultTimezone, - sS.cgrCfg.GeneralCfg().NodeID)...) // Expensive for large number of sessions + } else { + for _, s := range remainingSessions { + aSs = append(aSs, + s.AsActiveSessions(sS.cgrCfg.GeneralCfg().DefaultTimezone, + sS.cgrCfg.GeneralCfg().NodeID)...) // Expensive for large number of sessions + } } if count { return nil, len(aSs), nil