From d3835067cffd9b4f368b54d4534fda4e7d78ab1d Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 16 Jun 2014 17:58:25 +0200 Subject: [PATCH] Session manager fixups for derived charging --- .../fs_json/cgrates/tariffplans/DerivedChargers.csv | 2 +- mediator/mediator.go | 1 - sessionmanager/fsevent.go | 2 -- sessionmanager/fssessionmanager.go | 10 +++++++--- sessionmanager/session.go | 13 ++++++++++--- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv b/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv index 3336198e4..5a243dffd 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv @@ -1,2 +1,2 @@ #Direction,Tenant,Category,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,UsageField -*out,cgrates.org,call,1001,1001,fs_json_run,^rated,*default,*default,*default,1010,1010,*default,*default,*default,*default \ No newline at end of file +*out,cgrates.org,call,1001,1001,fs_json_run,^rated,*default,*default,*default,*default,^1002,*default,*default,*default,*default diff --git a/mediator/mediator.go b/mediator/mediator.go index 736963975..09997e17b 100644 --- a/mediator/mediator.go +++ b/mediator/mediator.go @@ -109,7 +109,6 @@ func (self *Mediator) rateCDR(storedCdr *utils.StoredCdr) error { } func (self *Mediator) RateCdr(storedCdr *utils.StoredCdr) error { - engine.Logger.Debug(fmt.Sprintf("Rating CDR: %v", storedCdr)) storedCdr.MediationRunId = utils.DEFAULT_RUNID cdrRuns := []*utils.StoredCdr{storedCdr} // Start with initial storCdr, will add here all to be mediated attrsDC := utils.AttrDerivedChargers{Tenant: storedCdr.Tenant, Category: storedCdr.Category, Direction: storedCdr.Direction, diff --git a/sessionmanager/fsevent.go b/sessionmanager/fsevent.go index b0edaa855..0d54d42b6 100644 --- a/sessionmanager/fsevent.go +++ b/sessionmanager/fsevent.go @@ -24,7 +24,6 @@ import ( "time" "github.com/cgrates/cgrates/config" - "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" "github.com/cgrates/fsock" ) @@ -202,6 +201,5 @@ func (fsev FSEvent) GetDuration(fieldName string) (dur time.Duration, err error) if strings.HasPrefix(fieldName, utils.STATIC_VALUE_PREFIX) { // Static value durStr = fieldName[len(utils.STATIC_VALUE_PREFIX):] } - engine.Logger.Info(fmt.Sprintf("Parsing duration out of string: %s, fieldName: %s, field dur: %s, fsev: %s", durStr, fsev[fieldName], fsev[DURATION], fsev)) return utils.ParseDurationWithSecs(durStr) } diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index 79f1bcec6..bbe46e0d5 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -248,14 +248,18 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) { return } dcs, _ = dcs.AppendDefaultRun() - for idx, dc := range dcs { + for _, dc := range dcs { if ev.GetReqType(dc.ReqTypeField) != utils.PREPAID { continue } - if len(s.sessionRuns[idx].callCosts) == 0 { + sr := s.GetSessionRun(dc.RunId) + if sr == nil { + continue // Did not save a sessionRun for this dc + } + if len(sr.callCosts) == 0 { continue // why would we have 0 callcosts } - lastCC := s.sessionRuns[idx].callCosts[len(s.sessionRuns[idx].callCosts)-1] + lastCC := sr.callCosts[len(sr.callCosts)-1] lastCC.Timespans.Decompress() // put credit back startTime, err := ev.GetAnswerTime(dc.AnswerTimeField) diff --git a/sessionmanager/session.go b/sessionmanager/session.go index 17cb67bf9..792902d56 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -37,6 +37,15 @@ type Session struct { sessionRuns []*SessionRun } +func (s *Session) GetSessionRun(runid string) *SessionRun { + for _, sr := range s.sessionRuns { + if sr.runId == runid { + return sr + } + } + return nil +} + // One individual run type SessionRun struct { runId string @@ -50,7 +59,6 @@ func NewSession(ev Event, sm SessionManager, dcs utils.DerivedChargers) *Session uuid: ev.GetUUID(), stopDebit: make(chan bool), sessionManager: sm, - sessionRuns: make([]*SessionRun, 0), } for _, dc := range dcs { if ev.GetReqType(dc.ReqTypeField) != utils.PREPAID { @@ -99,10 +107,9 @@ func (s *Session) debitLoop(runIdx int) { nextCd.TimeEnd = nextCd.TimeStart.Add(debitPeriod) nextCd.LoopIndex = index nextCd.DurationIndex += debitPeriod // first presumed duration - cc := &engine.CallCost{} + cc := new(engine.CallCost) if err := s.sessionManager.MaxDebit(&nextCd, cc); err != nil { engine.Logger.Err(fmt.Sprintf("Could not complete debit opperation: %v", err)) - // disconnect session s.sessionManager.DisconnectSession(s.uuid, SYSTEM_ERROR) return }