From b3dbf0daa998c17ebc3e09b3df57570a0407bd3b Mon Sep 17 00:00:00 2001 From: DanB Date: Tue, 8 Nov 2016 20:54:05 +0100 Subject: [PATCH] SMGeneric - passive sessions indexing --- sessionmanager/smgeneric.go | 39 ++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 6e6350523..dcbd399d5 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -288,19 +288,19 @@ func (smg *SMGeneric) indexPSession(s *SMGSession) bool { func (smg *SMGeneric) unindexPSession(cgrID string) bool { smg.pSIMux.Lock() defer smg.pSIMux.Unlock() - if _, hasIt := smg.aSessionsRIndex[cgrID]; !hasIt { + if _, hasIt := smg.pSessionsRIndex[cgrID]; !hasIt { return false } - for _, riFNV := range smg.aSessionsRIndex[cgrID] { - delete(smg.aSessionsIndex[riFNV.fieldName][riFNV.fieldValue], cgrID) - if len(smg.aSessionsIndex[riFNV.fieldName][riFNV.fieldValue]) == 0 { - delete(smg.aSessionsIndex[riFNV.fieldName], riFNV.fieldValue) + for _, riFNV := range smg.pSessionsRIndex[cgrID] { + delete(smg.pSessionsIndex[riFNV.fieldName][riFNV.fieldValue], cgrID) + if len(smg.pSessionsIndex[riFNV.fieldName][riFNV.fieldValue]) == 0 { + delete(smg.pSessionsIndex[riFNV.fieldName], riFNV.fieldValue) } - if len(smg.aSessionsIndex[riFNV.fieldName]) == 0 { - delete(smg.aSessionsIndex, riFNV.fieldName) + if len(smg.pSessionsIndex[riFNV.fieldName]) == 0 { + delete(smg.pSessionsIndex, riFNV.fieldName) } } - delete(smg.aSessionsRIndex, cgrID) + delete(smg.pSessionsRIndex, cgrID) return true } @@ -510,16 +510,11 @@ func (smg *SMGeneric) getPassiveSessions(cgrID, runID string) (pss map[string][] return } -// deletePassiveSessions is used to remove a reference from the passiveSessions table -// ToDo: test it -func (smg *SMGeneric) deletePassiveSessions(cgrID string) { - smg.pSessionsMux.Lock() - delete(smg.passiveSessions, cgrID) - smg.pSessionsMux.Unlock() -} - // setPassiveSession is called when a session is set via RPC in passive sessions table func (smg *SMGeneric) setPassiveSessions(cgrID string, ss []*SMGSession) (err error) { + if len(ss) == 0 { + return + } for _, cacheKey := range []string{"InitiateSession" + cgrID, "UpdateSession" + cgrID, "TerminateSession" + cgrID} { if _, err := smg.responseCache.Get(cacheKey); err == nil { // Stop processing passive when there has been an update over active RPC if _, hasCGRID := smg.passiveSessions[cgrID]; hasCGRID { @@ -531,6 +526,9 @@ func (smg *SMGeneric) setPassiveSessions(cgrID string, ss []*SMGSession) (err er smg.unrecordASession(cgrID) smg.pSessionsMux.Lock() smg.passiveSessions[cgrID] = ss + for _, s := range ss { + smg.indexPSession(s) + } smg.pSessionsMux.Unlock() return } @@ -551,6 +549,15 @@ func (smg *SMGeneric) removePassiveSessions(cgrID string) (err error) { return } +// deletePassiveSessions is used to remove a reference from the passiveSessions table +// ToDo: test it +func (smg *SMGeneric) deletePassiveSessions(cgrID string) { + smg.pSessionsMux.Lock() + smg.unindexPSession(cgrID) + delete(smg.passiveSessions, cgrID) + smg.pSessionsMux.Unlock() +} + // passiveToActive will transition the sessions from passive to active table // ToDo: test func (smg *SMGeneric) passiveToActive(cgrID string) (pSS []*SMGSession) {