diff --git a/apier/v2/apier.go b/apier/v2/apier.go index e6ee783b3..7d600a9e3 100644 --- a/apier/v2/apier.go +++ b/apier/v2/apier.go @@ -223,6 +223,12 @@ func (self *ApierV2) LoadTariffPlanFromFolder(attrs utils.AttrLoadTpFromFolder, aps, _ := loader.GetLoadedIds(utils.ACTION_PLAN_PREFIX) utils.Logger.Info("ApierV1.LoadTariffPlanFromFolder, reloading cache.") + cstKeys, _ := loader.GetLoadedIds(utils.CDR_STATS_PREFIX) + userKeys, _ := loader.GetLoadedIds(utils.USERS_PREFIX) + li := loader.GetLoadInstance() + + loader.Init() + if err := self.RatingDb.CacheRatingPrefixValues(map[string][]string{ utils.DESTINATION_PREFIX: dstKeys, utils.RATING_PLAN_PREFIX: rpKeys, @@ -245,20 +251,18 @@ func (self *ApierV2) LoadTariffPlanFromFolder(attrs utils.AttrLoadTpFromFolder, self.Sched.LoadActionPlans(self.RatingDb) self.Sched.Restart() } - cstKeys, _ := loader.GetLoadedIds(utils.CDR_STATS_PREFIX) if len(cstKeys) != 0 && self.CdrStatsSrv != nil { if err := self.CdrStatsSrv.ReloadQueues(cstKeys, nil); err != nil { return err } } - userKeys, _ := loader.GetLoadedIds(utils.USERS_PREFIX) if len(userKeys) != 0 && self.Users != nil { var r string if err := self.Users.ReloadUsers("", &r); err != nil { return err } } - *reply = *loader.GetLoadInstance() + *reply = *li return nil } diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go index 8b5ef39e8..ac359032f 100644 --- a/cmd/cgr-loader/cgr-loader.go +++ b/cmd/cgr-loader/cgr-loader.go @@ -24,7 +24,6 @@ import ( "log" "net/rpc" "path" - "runtime" "strconv" "strings" @@ -310,9 +309,8 @@ func main() { if users != nil { userIds, _ = tpReader.GetLoadedIds(utils.USERS_PREFIX) } - // release the reader wit it's structures - tpReader = nil - runtime.GC() + // release the reader with it's structures + tpReader.Init() // Reload scheduler and cache if rater != nil { diff --git a/engine/tp_reader.go b/engine/tp_reader.go index 4ca0a5ee7..b53251cdf 100644 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -47,23 +47,8 @@ func NewTpReader(rs RatingStorage, as AccountingStorage, lr LoadReader, tpid, ti ratingStorage: rs, accountingStorage: as, lr: lr, - actions: make(map[string][]*Action), - actionPlans: make(map[string][]*ActionPlan), - actionsTriggers: make(map[string]ActionTriggers), - rates: make(map[string]*utils.TPRate), - destinations: make(map[string]*Destination), - destinationRates: make(map[string]*utils.TPDestinationRate), - timings: make(map[string]*utils.TPTiming), - ratingPlans: make(map[string]*RatingPlan), - ratingProfiles: make(map[string]*RatingProfile), - sharedGroups: make(map[string]*SharedGroup), - lcrs: make(map[string]*LCR), - accountActions: make(map[string]*Account), - cdrStats: make(map[string]*CdrStats), - users: make(map[string]*UserProfile), - aliases: make(map[string]*Alias), - derivedChargers: make(map[string]*utils.DerivedChargers), } + tpr.Init() //add *any and *asap timing tag (in case of no timings file) tpr.timings[utils.ANY] = &utils.TPTiming{ TimingId: utils.ANY, @@ -86,6 +71,25 @@ func NewTpReader(rs RatingStorage, as AccountingStorage, lr LoadReader, tpid, ti return tpr } +func (tpr *TpReader) Init() { + tpr.actions = make(map[string][]*Action) + tpr.actionPlans = make(map[string][]*ActionPlan) + tpr.actionsTriggers = make(map[string]ActionTriggers) + tpr.rates = make(map[string]*utils.TPRate) + tpr.destinations = make(map[string]*Destination) + tpr.destinationRates = make(map[string]*utils.TPDestinationRate) + tpr.timings = make(map[string]*utils.TPTiming) + tpr.ratingPlans = make(map[string]*RatingPlan) + tpr.ratingProfiles = make(map[string]*RatingProfile) + tpr.sharedGroups = make(map[string]*SharedGroup) + tpr.lcrs = make(map[string]*LCR) + tpr.accountActions = make(map[string]*Account) + tpr.cdrStats = make(map[string]*CdrStats) + tpr.users = make(map[string]*UserProfile) + tpr.aliases = make(map[string]*Alias) + tpr.derivedChargers = make(map[string]*utils.DerivedChargers) +} + func (tpr *TpReader) LoadDestinationsFiltered(tag string) (bool, error) { tpDests, err := tpr.lr.GetTpDestinations(tpr.tpid, tag)