diff --git a/apier/v1/aliases.go b/apier/v1/aliases.go index 93ebf639e..7800b6d72 100644 --- a/apier/v1/aliases.go +++ b/apier/v1/aliases.go @@ -52,7 +52,7 @@ func (self *ApierV1) AddRatingSubjectAliases(attrs AttrAddRatingSubjectAliases, als := engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Pairs: engine.AliasPairs{"Account": map[string]string{alias: attrs.Subject}, "Subject": map[string]string{alias: attrs.Subject}}, Weight: 10.0}}} - if err := aliases.Call("AliasesV1.SetAlias", &als, &ignr); err != nil { + if err := aliases.Call("AliasesV1.SetAlias", &engine.AttrAddAlias{Alias: &als}, &ignr); err != nil { return utils.NewErrServerError(err) } } @@ -104,7 +104,7 @@ func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *strin als := engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, Pairs: engine.AliasPairs{"Account": map[string]string{alias: attrs.Account}, "Subject": map[string]string{alias: attrs.Account}}, Weight: 10.0}}} - if err := aliases.Call("AliasesV1.SetAlias", &als, &ignr); err != nil { + if err := aliases.Call("AliasesV1.SetAlias", &engine.AttrAddAlias{Alias: &als}, &ignr); err != nil { return utils.NewErrServerError(err) } } diff --git a/cache2go/response_cache.go b/cache2go/response_cache.go index c27fdecbf..eba9dcf2e 100644 --- a/cache2go/response_cache.go +++ b/cache2go/response_cache.go @@ -54,10 +54,16 @@ func (rc *ResponseCache) Get(key string) (*CacheItem, error) { if rc.ttl == 0 { return nil, utils.ErrNotImplemented } + rc.mu.RLock() + item, ok := rc.cache[key] + rc.mu.RUnlock() + if ok { + return item, nil + } rc.wait(key) // wait for other goroutine processsing this key rc.mu.RLock() defer rc.mu.RUnlock() - item, ok := rc.cache[key] + item, ok = rc.cache[key] if !ok { return nil, ErrNotFound } diff --git a/cmd/cgr-engine/rater.go b/cmd/cgr-engine/rater.go index 7ce1cd254..08b4f2de7 100644 --- a/cmd/cgr-engine/rater.go +++ b/cmd/cgr-engine/rater.go @@ -239,7 +239,7 @@ func startRater(internalRaterChan chan *engine.Responder, cacheDoneChan chan str } responder := &engine.Responder{Bal: bal, ExitChan: exitChan, Stats: cdrStats} - responder.SetTimeToLive(cfg.ResponseCacheTTL) + responder.SetTimeToLive(cfg.ResponseCacheTTL, nil) apierRpcV1 := &v1.ApierV1{StorDb: loadDb, RatingDb: ratingDb, AccountDb: accountDb, CdrDb: cdrDb, LogDb: logDb, Sched: sched, Config: cfg, Responder: responder, CdrStatsSrv: cdrStats, Users: userServer} apierRpcV2 := &v2.ApierV2{ diff --git a/engine/responder.go b/engine/responder.go index 46e26a80a..ded672c1e 100644 --- a/engine/responder.go +++ b/engine/responder.go @@ -57,8 +57,9 @@ type Responder struct { responseCache *cache2go.ResponseCache } -func (rs *Responder) SetTimeToLive(timeToLive time.Duration) { +func (rs *Responder) SetTimeToLive(timeToLive time.Duration, out *int) error { rs.responseCache = cache2go.NewResponseCache(timeToLive) + return nil } func (rs *Responder) getCache() *cache2go.ResponseCache { @@ -263,7 +264,7 @@ func (rs *Responder) GetMaxSessionTime(arg *CallDescriptor, reply *float64) (err func (rs *Responder) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) error { cacheKey := "GetDerivedMaxSessionTime" + ev.CgrId if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { - *reply = *(item.Value.(*float64)) + *reply = item.Value.(float64) return item.Err } if rs.Bal != nil { @@ -367,7 +368,7 @@ func (rs *Responder) GetDerivedMaxSessionTime(ev *StoredCdr, reply *float64) err func (rs *Responder) GetSessionRuns(ev *StoredCdr, sRuns *[]*SessionRun) error { cacheKey := "GetSessionRuns" + ev.CgrId if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { - *sRuns = *(item.Value.(*[]*SessionRun)) + *sRuns = item.Value.([]*SessionRun) return item.Err } if rs.Bal != nil { @@ -446,7 +447,7 @@ func (rs *Responder) GetDerivedChargers(attrs *utils.AttrDerivedChargers, dcs *u func (rs *Responder) ProcessCdr(cdr *StoredCdr, reply *string) error { cacheKey := "ProcessCdr" + cdr.CgrId if item, err := rs.getCache().Get(cacheKey); err == nil && item != nil { - *reply = *(item.Value.(*string)) + *reply = item.Value.(string) return item.Err } if rs.CdrSrv == nil {