mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
@@ -82,7 +82,7 @@ func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) e
|
||||
}
|
||||
}
|
||||
_, err := engine.Guardian.Guard(func() (interface{}, error) {
|
||||
ats, err := self.RatingDb.GetActionPlans(attrs.ActionPlanId)
|
||||
ats, err := self.RatingDb.GetActionPlans(attrs.ActionPlanId, false)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else if len(ats) == 0 {
|
||||
@@ -175,7 +175,7 @@ func (self *ApierV1) SetAccount(attr utils.AttrSetAccount, reply *string) error
|
||||
|
||||
if len(attr.ActionPlanId) != 0 {
|
||||
var err error
|
||||
ats, err = self.RatingDb.GetActionPlans(attr.ActionPlanId)
|
||||
ats, err = self.RatingDb.GetActionPlans(attr.ActionPlanId, false)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
@@ -712,6 +712,7 @@ func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) error
|
||||
if err := self.RatingDb.SetActionPlans(attrs.Id, storeAtms); err != nil {
|
||||
return utils.NewErrServerError(err)
|
||||
}
|
||||
self.RatingDb.CacheRatingPrefixValues(map[string][]string{utils.ACTION_PLAN_PREFIX: []string{attrs.Id}})
|
||||
if attrs.ReloadScheduler {
|
||||
if self.Sched == nil {
|
||||
return errors.New("SCHEDULER_NOT_ENABLED")
|
||||
|
||||
@@ -487,7 +487,7 @@ func TestMaxSessionTimeWithAccount(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxSessionTimeWithMaxRate(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -513,7 +513,7 @@ func TestMaxSessionTimeWithMaxRate(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxSessionTimeWithMaxCost(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -536,7 +536,7 @@ func TestMaxSessionTimeWithMaxCost(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetCostWithMaxCost(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -558,7 +558,7 @@ func TestGetCostWithMaxCost(t *testing.T) {
|
||||
}
|
||||
}
|
||||
func TestGetCostRoundingIssue(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -582,7 +582,7 @@ func TestGetCostRoundingIssue(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetCostMaxDebitRoundingIssue(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -614,7 +614,7 @@ func TestGetCostMaxDebitRoundingIssue(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxSessionTimeWithMaxCostFree(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -637,7 +637,7 @@ func TestMaxSessionTimeWithMaxCostFree(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxDebitWithMaxCostFree(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -660,7 +660,7 @@ func TestMaxDebitWithMaxCostFree(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetCostWithMaxCostFree(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -714,11 +714,11 @@ func TestMaxSessionTimeWithAccountAlias(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxSessionTimeWithAccountShared(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED0_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED0_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
ap, _ = ratingStorage.GetActionPlans("TOPUP_SHARED10_AT")
|
||||
ap, _ = ratingStorage.GetActionPlans("TOPUP_SHARED10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -753,11 +753,11 @@ func TestMaxSessionTimeWithAccountShared(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxDebitWithAccountShared(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED0_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED0_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
ap, _ = ratingStorage.GetActionPlans("TOPUP_SHARED10_AT")
|
||||
ap, _ = ratingStorage.GetActionPlans("TOPUP_SHARED10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -974,7 +974,7 @@ func TestMaxSesionTimeLongerThanMoney(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDebitFromShareAndNormal(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_SHARED10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -1002,7 +1002,7 @@ func TestDebitFromShareAndNormal(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDebitFromEmptyShare(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_EMPTY_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP_EMPTY_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -1030,7 +1030,7 @@ func TestDebitFromEmptyShare(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestDebitNegatve(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("POST_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("POST_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -1069,7 +1069,7 @@ func TestDebitNegatve(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxDebitZeroDefinedRate(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -1097,7 +1097,7 @@ func TestMaxDebitZeroDefinedRate(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxDebitZeroDefinedRateOnlyMinutes(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
@@ -1125,7 +1125,7 @@ func TestMaxDebitZeroDefinedRateOnlyMinutes(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMaxDebitConsumesMinutes(t *testing.T) {
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT")
|
||||
ap, _ := ratingStorage.GetActionPlans("TOPUP10_AT", false)
|
||||
for _, at := range ap {
|
||||
at.Execute()
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ type RatingStorage interface {
|
||||
SetSharedGroup(*SharedGroup) error
|
||||
GetActionTriggers(string) (ActionTriggers, error)
|
||||
SetActionTriggers(string, ActionTriggers) error
|
||||
GetActionPlans(string) (ActionPlans, error)
|
||||
GetActionPlans(string, bool) (ActionPlans, error)
|
||||
SetActionPlans(string, ActionPlans) error
|
||||
GetAllActionPlans() (map[string]ActionPlans, error)
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ func (ms *MapStorage) GetKeysForPrefix(prefix string) ([]string, error) {
|
||||
}
|
||||
|
||||
func (ms *MapStorage) CacheRatingAll() error {
|
||||
return ms.cacheRating(nil, nil, nil, nil, nil, nil, nil)
|
||||
return ms.cacheRating(nil, nil, nil, nil, nil, nil, nil, nil)
|
||||
}
|
||||
|
||||
func (ms *MapStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
@@ -74,6 +74,7 @@ func (ms *MapStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for _, prefix := range prefixes {
|
||||
@@ -82,7 +83,7 @@ func (ms *MapStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
}
|
||||
pm[prefix] = nil
|
||||
}
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (ms *MapStorage) CacheRatingPrefixValues(prefixes map[string][]string) error {
|
||||
@@ -93,6 +94,7 @@ func (ms *MapStorage) CacheRatingPrefixValues(prefixes map[string][]string) erro
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for prefix, ids := range prefixes {
|
||||
@@ -101,10 +103,10 @@ func (ms *MapStorage) CacheRatingPrefixValues(prefixes map[string][]string) erro
|
||||
}
|
||||
pm[prefix] = ids
|
||||
}
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (ms *MapStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, shgKeys []string) error {
|
||||
func (ms *MapStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, aplKeys, shgKeys []string) error {
|
||||
cache2go.BeginTransaction()
|
||||
if dKeys == nil || (float64(cache2go.CountEntries(utils.DESTINATION_PREFIX))*utils.DESTINATIONS_LOAD_THRESHOLD < float64(len(dKeys))) {
|
||||
cache2go.RemPrefixKey(utils.DESTINATION_PREFIX)
|
||||
@@ -126,6 +128,9 @@ func (ms *MapStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actK
|
||||
if actKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.ACTION_PREFIX) // Forced until we can fine tune it
|
||||
}
|
||||
if aplKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.ACTION_PLAN_PREFIX)
|
||||
}
|
||||
if shgKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.SHARED_GROUP_PREFIX) // Forced until we can fine tune it
|
||||
}
|
||||
@@ -171,6 +176,13 @@ func (ms *MapStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actK
|
||||
return err
|
||||
}
|
||||
}
|
||||
if strings.HasPrefix(k, utils.ACTION_PLAN_PREFIX) {
|
||||
cache2go.RemKey(k)
|
||||
if _, err := ms.GetActionPlans(k[len(utils.ACTION_PLAN_PREFIX):], true); err != nil {
|
||||
cache2go.RollbackTransaction()
|
||||
return err
|
||||
}
|
||||
}
|
||||
if strings.HasPrefix(k, utils.SHARED_GROUP_PREFIX) {
|
||||
cache2go.RemKey(k)
|
||||
if _, err := ms.GetSharedGroup(k[len(utils.SHARED_GROUP_PREFIX):], true); err != nil {
|
||||
@@ -665,9 +677,18 @@ func (ms *MapStorage) SetActionTriggers(key string, atrs ActionTriggers) (err er
|
||||
return
|
||||
}
|
||||
|
||||
func (ms *MapStorage) GetActionPlans(key string) (ats ActionPlans, err error) {
|
||||
if values, ok := ms.dict[utils.ACTION_PLAN_PREFIX+key]; ok {
|
||||
func (ms *MapStorage) GetActionPlans(key string, skipCache bool) (ats ActionPlans, err error) {
|
||||
key = utils.ACTION_PLAN_PREFIX + key
|
||||
if !skipCache {
|
||||
if x, err := cache2go.Get(key); err == nil {
|
||||
return x.(ActionPlans), nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if values, ok := ms.dict[key]; ok {
|
||||
err = ms.ms.Unmarshal(values, &ats)
|
||||
cache2go.Cache(key, ats)
|
||||
} else {
|
||||
return nil, utils.ErrNotFound
|
||||
}
|
||||
@@ -686,14 +707,15 @@ func (ms *MapStorage) SetActionPlans(key string, ats ActionPlans) (err error) {
|
||||
}
|
||||
|
||||
func (ms *MapStorage) GetAllActionPlans() (ats map[string]ActionPlans, err error) {
|
||||
ats = make(map[string]ActionPlans)
|
||||
for key, value := range ms.dict {
|
||||
if !strings.HasPrefix(key, utils.ACTION_PLAN_PREFIX) {
|
||||
continue
|
||||
}
|
||||
var tempAts ActionPlans
|
||||
err = ms.ms.Unmarshal(value, &tempAts)
|
||||
ats[key[len(utils.ACTION_PLAN_PREFIX):]] = tempAts
|
||||
apls, err := cache2go.GetAllEntries(utils.ACTION_PLAN_PREFIX)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ats = make(map[string]ActionPlans, len(apls))
|
||||
for key, value := range apls {
|
||||
apl := value.Value().(ActionPlans)
|
||||
ats[key[len(utils.ACTION_PLAN_PREFIX):]] = apl
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
@@ -225,7 +225,7 @@ func (ms *MongoStorage) Flush(ignore string) (err error) {
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) CacheRatingAll() error {
|
||||
return ms.cacheRating(nil, nil, nil, nil, nil, nil, nil)
|
||||
return ms.cacheRating(nil, nil, nil, nil, nil, nil, nil, nil)
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
@@ -236,6 +236,7 @@ func (ms *MongoStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for _, prefix := range prefixes {
|
||||
@@ -244,7 +245,7 @@ func (ms *MongoStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
}
|
||||
pm[prefix] = nil
|
||||
}
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) CacheRatingPrefixValues(prefixes map[string][]string) error {
|
||||
@@ -255,6 +256,7 @@ func (ms *MongoStorage) CacheRatingPrefixValues(prefixes map[string][]string) er
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for prefix, ids := range prefixes {
|
||||
@@ -263,10 +265,10 @@ func (ms *MongoStorage) CacheRatingPrefixValues(prefixes map[string][]string) er
|
||||
}
|
||||
pm[prefix] = ids
|
||||
}
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return ms.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, shgKeys []string) (err error) {
|
||||
func (ms *MongoStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, aplKeys, shgKeys []string) (err error) {
|
||||
cache2go.BeginTransaction()
|
||||
keyResult := struct{ Key string }{}
|
||||
idResult := struct{ Id string }{}
|
||||
@@ -430,6 +432,35 @@ func (ms *MongoStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, ac
|
||||
utils.Logger.Info("Finished actions caching.")
|
||||
}
|
||||
|
||||
if aplKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.ACTION_PLAN_PREFIX)
|
||||
}
|
||||
if aplKeys == nil {
|
||||
utils.Logger.Info("Caching all action plans")
|
||||
iter := ms.db.C(colApl).Find(nil).Select(bson.M{"key": 1}).Iter()
|
||||
aplKeys = make([]string, 0)
|
||||
for iter.Next(&keyResult) {
|
||||
aplKeys = append(aplKeys, utils.ACTION_PLAN_PREFIX+keyResult.Key)
|
||||
}
|
||||
if err := iter.Close(); err != nil {
|
||||
cache2go.RollbackTransaction()
|
||||
return err
|
||||
}
|
||||
cache2go.RemPrefixKey(utils.ACTION_PLAN_PREFIX)
|
||||
} else if len(aplKeys) != 0 {
|
||||
utils.Logger.Info(fmt.Sprintf("Caching action plans: %v", aplKeys))
|
||||
}
|
||||
for _, key := range aplKeys {
|
||||
cache2go.RemKey(key)
|
||||
if _, err = ms.GetActionPlans(key[len(utils.ACTION_PLAN_PREFIX):], true); err != nil {
|
||||
cache2go.RollbackTransaction()
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(aplKeys) != 0 {
|
||||
utils.Logger.Info("Finished action plans caching.")
|
||||
}
|
||||
|
||||
if shgKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.SHARED_GROUP_PREFIX)
|
||||
}
|
||||
@@ -1025,7 +1056,14 @@ func (ms *MongoStorage) SetActionTriggers(key string, atrs ActionTriggers) (err
|
||||
return err
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetActionPlans(key string) (ats ActionPlans, err error) {
|
||||
func (ms *MongoStorage) GetActionPlans(key string, skipCache bool) (ats ActionPlans, err error) {
|
||||
if !skipCache {
|
||||
if x, err := cache2go.Get(utils.ACTION_PLAN_PREFIX + key); err == nil {
|
||||
return x.(ActionPlans), nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var kv struct {
|
||||
Key string
|
||||
Value ActionPlans
|
||||
@@ -1033,6 +1071,7 @@ func (ms *MongoStorage) GetActionPlans(key string) (ats ActionPlans, err error)
|
||||
err = ms.db.C(colApl).Find(bson.M{"key": key}).One(&kv)
|
||||
if err == nil {
|
||||
ats = kv.Value
|
||||
cache2go.Cache(utils.ACTION_PLAN_PREFIX+key, ats)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -1046,15 +1085,17 @@ func (ms *MongoStorage) SetActionPlans(key string, ats ActionPlans) error {
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetAllActionPlans() (ats map[string]ActionPlans, err error) {
|
||||
var kv struct {
|
||||
Key string
|
||||
Value ActionPlans
|
||||
apls, err := cache2go.GetAllEntries(utils.ACTION_PLAN_PREFIX)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
iter := ms.db.C(colApl).Find(nil).Iter()
|
||||
ats = make(map[string]ActionPlans)
|
||||
for iter.Next(&kv) {
|
||||
ats[kv.Key] = kv.Value
|
||||
|
||||
ats = make(map[string]ActionPlans, len(apls))
|
||||
for key, value := range apls {
|
||||
apl := value.Value().(ActionPlans)
|
||||
ats[key[len(utils.ACTION_PLAN_PREFIX):]] = apl
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ func (rs *RedisStorage) GetKeysForPrefix(prefix string) ([]string, error) {
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) CacheRatingAll() error {
|
||||
return rs.cacheRating(nil, nil, nil, nil, nil, nil, nil)
|
||||
return rs.cacheRating(nil, nil, nil, nil, nil, nil, nil, nil)
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
@@ -79,6 +79,7 @@ func (rs *RedisStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for _, prefix := range prefixes {
|
||||
@@ -87,7 +88,7 @@ func (rs *RedisStorage) CacheRatingPrefixes(prefixes ...string) error {
|
||||
}
|
||||
pm[prefix] = nil
|
||||
}
|
||||
return rs.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return rs.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) CacheRatingPrefixValues(prefixes map[string][]string) error {
|
||||
@@ -98,6 +99,7 @@ func (rs *RedisStorage) CacheRatingPrefixValues(prefixes map[string][]string) er
|
||||
utils.LCR_PREFIX: []string{},
|
||||
utils.DERIVEDCHARGERS_PREFIX: []string{},
|
||||
utils.ACTION_PREFIX: []string{},
|
||||
utils.ACTION_PLAN_PREFIX: []string{},
|
||||
utils.SHARED_GROUP_PREFIX: []string{},
|
||||
}
|
||||
for prefix, ids := range prefixes {
|
||||
@@ -106,10 +108,10 @@ func (rs *RedisStorage) CacheRatingPrefixValues(prefixes map[string][]string) er
|
||||
}
|
||||
pm[prefix] = ids
|
||||
}
|
||||
return rs.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
return rs.cacheRating(pm[utils.DESTINATION_PREFIX], pm[utils.RATING_PLAN_PREFIX], pm[utils.RATING_PROFILE_PREFIX], pm[utils.LCR_PREFIX], pm[utils.DERIVEDCHARGERS_PREFIX], pm[utils.ACTION_PREFIX], pm[utils.ACTION_PLAN_PREFIX], pm[utils.SHARED_GROUP_PREFIX])
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, shgKeys []string) (err error) {
|
||||
func (rs *RedisStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, actKeys, aplKeys, shgKeys []string) (err error) {
|
||||
cache2go.BeginTransaction()
|
||||
if dKeys == nil || (float64(cache2go.CountEntries(utils.DESTINATION_PREFIX))*utils.DESTINATIONS_LOAD_THRESHOLD < float64(len(dKeys))) {
|
||||
// if need to load more than a half of exiting keys load them all
|
||||
@@ -241,6 +243,30 @@ func (rs *RedisStorage) cacheRating(dKeys, rpKeys, rpfKeys, lcrKeys, dcsKeys, ac
|
||||
utils.Logger.Info("Finished actions caching.")
|
||||
}
|
||||
|
||||
if aplKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.ACTION_PLAN_PREFIX)
|
||||
}
|
||||
if aplKeys == nil {
|
||||
utils.Logger.Info("Caching all action plans")
|
||||
if aplKeys, err = rs.db.Keys(utils.ACTION_PLAN_PREFIX + "*"); err != nil {
|
||||
cache2go.RollbackTransaction()
|
||||
return err
|
||||
}
|
||||
cache2go.RemPrefixKey(utils.ACTION_PLAN_PREFIX)
|
||||
} else if len(aplKeys) != 0 {
|
||||
utils.Logger.Info(fmt.Sprintf("Caching action plan: %v", aplKeys))
|
||||
}
|
||||
for _, key := range aplKeys {
|
||||
cache2go.RemKey(key)
|
||||
if _, err = rs.GetActionPlans(key[len(utils.ACTION_PLAN_PREFIX):], true); err != nil {
|
||||
cache2go.RollbackTransaction()
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(aplKeys) != 0 {
|
||||
utils.Logger.Info("Finished action plans caching.")
|
||||
}
|
||||
|
||||
if shgKeys == nil {
|
||||
cache2go.RemPrefixKey(utils.SHARED_GROUP_PREFIX)
|
||||
}
|
||||
@@ -826,10 +852,19 @@ func (rs *RedisStorage) SetActionTriggers(key string, atrs ActionTriggers) (err
|
||||
return
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetActionPlans(key string) (ats ActionPlans, err error) {
|
||||
func (rs *RedisStorage) GetActionPlans(key string, skipCache bool) (ats ActionPlans, err error) {
|
||||
key = utils.ACTION_PLAN_PREFIX + key
|
||||
if !skipCache {
|
||||
if x, err := cache2go.Get(key); err == nil {
|
||||
return x.(ActionPlans), nil
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
var values []byte
|
||||
if values, err = rs.db.Get(utils.ACTION_PLAN_PREFIX + key); err == nil {
|
||||
if values, err = rs.db.Get(key); err == nil {
|
||||
err = rs.ms.Unmarshal(values, &ats)
|
||||
cache2go.Cache(key, ats)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -849,19 +884,15 @@ func (rs *RedisStorage) SetActionPlans(key string, ats ActionPlans) (err error)
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetAllActionPlans() (ats map[string]ActionPlans, err error) {
|
||||
keys, err := rs.db.Keys(utils.ACTION_PLAN_PREFIX + "*")
|
||||
apls, err := cache2go.GetAllEntries(utils.ACTION_PLAN_PREFIX)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ats = make(map[string]ActionPlans, len(keys))
|
||||
for _, key := range keys {
|
||||
values, err := rs.db.Get(key)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
var tempAts ActionPlans
|
||||
err = rs.ms.Unmarshal(values, &tempAts)
|
||||
ats[key[len(utils.ACTION_PLAN_PREFIX):]] = tempAts
|
||||
|
||||
ats = make(map[string]ActionPlans, len(apls))
|
||||
for key, value := range apls {
|
||||
apl := value.Value().(ActionPlans)
|
||||
ats[key[len(utils.ACTION_PLAN_PREFIX):]] = apl
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
@@ -652,7 +652,7 @@ func (tpr *TpReader) LoadAccountActionsFiltered(qriedAA *TpAccountAction) error
|
||||
if accountAction.ActionPlanId != "" {
|
||||
// get old userBalanceIds
|
||||
var exitingAccountIds []string
|
||||
existingActionPlans, err := tpr.ratingStorage.GetActionPlans(accountAction.ActionPlanId)
|
||||
existingActionPlans, err := tpr.ratingStorage.GetActionPlans(accountAction.ActionPlanId, true)
|
||||
if err == nil && len(existingActionPlans) > 0 {
|
||||
// all action timings from a specific tag shuld have the same list of user balances from the first one
|
||||
exitingAccountIds = existingActionPlans[0].AccountIds
|
||||
|
||||
@@ -118,6 +118,7 @@ func (s *Scheduler) LoadActionPlans(storage engine.RatingStorage) {
|
||||
if toBeSaved {
|
||||
engine.Guardian.Guard(func() (interface{}, error) {
|
||||
storage.SetActionPlans(key, newApls)
|
||||
storage.CacheRatingPrefixValues(map[string][]string{utils.ACTION_PLAN_PREFIX: []string{key}})
|
||||
return 0, nil
|
||||
}, 0, utils.ACTION_PLAN_PREFIX)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user