From 6ba175dbec33e55fc21be85500aa185332eec5d7 Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 25 Apr 2018 19:46:26 +0200 Subject: [PATCH] Adding account info in responder.RefundIncrements, update accountSummary after refund --- engine/calldesc.go | 8 +++++--- engine/responder.go | 19 +++++++++++++++---- sessions/session.go | 13 +++++++++---- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/engine/calldesc.go b/engine/calldesc.go index 8da738463..8884671d6 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -899,7 +899,8 @@ func (cd *CallDescriptor) MaxDebit() (cc *CallCost, err error) { } // refundIncrements has no locks -func (cd *CallDescriptor) refundIncrements() (err error) { +// returns the updated account referenced by the CallDescriptor +func (cd *CallDescriptor) refundIncrements() (acnt *Account, err error) { accountsCache := make(map[string]*Account) for _, increment := range cd.Increments { account, found := accountsCache[increment.BalanceInfo.AccountID] @@ -935,11 +936,12 @@ func (cd *CallDescriptor) refundIncrements() (err error) { account.countUnits(-increment.Cost, utils.MONETARY, cc, balance) } } + acnt = accountsCache[utils.ConcatenatedKey(cd.Tenant, cd.Account)] return } -func (cd *CallDescriptor) RefundIncrements() (err error) { +func (cd *CallDescriptor) RefundIncrements() (acnt *Account, err error) { // get account list for locking // all must be locked in order to use cache cd.Increments.Decompress() @@ -953,7 +955,7 @@ func (cd *CallDescriptor) RefundIncrements() (err error) { } } _, err = guardian.Guardian.Guard(func() (iface interface{}, err error) { - err = cd.refundIncrements() + acnt, err = cd.refundIncrements() return }, 0, accMap.Slice()...) return diff --git a/engine/responder.go b/engine/responder.go index e4b222038..fc648ce91 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -197,11 +197,11 @@ func (rs *Responder) MaxDebit(arg *CallDescriptor, reply *CallCost) (err error) return } -func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err error) { +func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *Account) (err error) { cacheKey := utils.REFUND_INCR_CACHE_PREFIX + arg.CgrID + arg.RunID if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { if item.Value != nil { - *reply = *(item.Value.(*float64)) + *reply = *(item.Value.(*Account)) } return item.Err } @@ -229,9 +229,20 @@ func (rs *Responder) RefundIncrements(arg *CallDescriptor, reply *float64) (err return err } if !rs.usageAllowed(arg.TOR, arg.GetDuration()) { - return utils.ErrMaxUsageExceeded + err = utils.ErrMaxUsageExceeded + rs.getCache().Cache(cacheKey, &utils.ResponseCacheItem{ + Err: err, + }) + return + } + if acnt, err := arg.RefundIncrements(); err != nil { + rs.getCache().Cache(cacheKey, &utils.ResponseCacheItem{ + Err: err, + }) + return err + } else if acnt != nil { + *reply = *acnt } - err = arg.RefundIncrements() rs.getCache().Cache(cacheKey, &utils.ResponseCacheItem{ Value: reply, Err: err, diff --git a/sessions/session.go b/sessions/session.go index 1b6c4fedf..75ce1a7e7 100644 --- a/sessions/session.go +++ b/sessions/session.go @@ -230,8 +230,12 @@ func (self *SMGSession) refund(usage time.Duration) (err error) { TOR: self.CD.TOR, Increments: incrmts, } - var reply float64 - return self.rals.Call("Responder.RefundIncrements", cd, &reply) + var acnt engine.Account + err = self.rals.Call("Responder.RefundIncrements", cd, &acnt) + if acnt.ID != "" { // Account info updated, update also cached AccountSummary + self.EventCost.AccountSummary = acnt.AsAccountSummary() + } + return } // storeSMCost will send the SMCost to CDRs for storing @@ -251,8 +255,9 @@ func (self *SMGSession) storeSMCost() error { CostDetails: self.EventCost, } var reply string - if err := self.cdrsrv.Call("CdrsV2.StoreSMCost", engine.ArgsV2CDRSStoreSMCost{Cost: smCost, - CheckDuplicate: true}, &reply); err != nil { + if err := self.cdrsrv.Call("CdrsV2.StoreSMCost", + engine.ArgsV2CDRSStoreSMCost{Cost: smCost, + CheckDuplicate: true}, &reply); err != nil { if err == utils.ErrExists { self.refund(self.CD.GetDuration()) // Refund entire duration } else {