diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index 187f7ae65..2ed5b4d74 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -51,6 +51,7 @@ var sTestsOnStorIT = []func(t *testing.T){ testOnStorITCacheRatingProfile, testOnStorITCacheActions, testOnStorITCacheActionPlan, + testOnStorITCacheActionTriggers, testOnStorITCacheSharedGroup, testOnStorITCacheDerivedChargers, testOnStorITCacheLCR, @@ -454,6 +455,35 @@ func testOnStorITCacheActionPlan(t *testing.T) { } } +func testOnStorITCacheActionTriggers(t *testing.T) { + ats := ActionTriggers{ + &ActionTrigger{ + ID: "testOnStorITCacheActionTrigger", + Balance: &BalanceFilter{Type: utils.StringPointer(utils.MONETARY), Directions: utils.StringMapPointer(utils.NewStringMap(utils.OUT)), Timings: make([]*RITiming, 0)}, + ThresholdValue: 2, + ThresholdType: utils.TRIGGER_MAX_EVENT_COUNTER, + ActionsID: "TEST_ACTIONS", + LastExecutionTime: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), + ExpirationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local(), + ActivationDate: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC).Local()}, + } + atsID := ats[0].ID + if err := onStor.SetActionTriggers(atsID, ats, utils.NonTransactional); err != nil { + t.Error(err) + } + if _, hasIt := cache.Get(utils.ACTION_TRIGGER_PREFIX + atsID); hasIt { + t.Error("Already in cache") + } + if err := onStor.CacheDataFromDB(utils.ACTION_TRIGGER_PREFIX, []string{atsID}, false); err != nil { + t.Error(err) + } + if itm, hasIt := cache.Get(utils.ACTION_TRIGGER_PREFIX + atsID); !hasIt { + t.Error("Did not cache") + } else if rcv := itm.(ActionTriggers); !reflect.DeepEqual(ats, rcv) { + t.Errorf("Expecting: %+v, received: %+v", ats, rcv) + } +} + func testOnStorITCacheSharedGroup(t *testing.T) { sg := &SharedGroup{ Id: "SG1", diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index db4607933..27f8f565d 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -447,6 +447,7 @@ func (ms *MongoStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached utils.RATING_PROFILE_PREFIX, utils.ACTION_PREFIX, utils.ACTION_PLAN_PREFIX, + utils.ACTION_TRIGGER_PREFIX, utils.SHARED_GROUP_PREFIX, utils.DERIVEDCHARGERS_PREFIX, utils.LCR_PREFIX, @@ -491,6 +492,8 @@ func (ms *MongoStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached nrItems = ms.cacheCfg.Actions.Limit case utils.ACTION_PLAN_PREFIX: nrItems = ms.cacheCfg.ActionPlans.Limit + case utils.ACTION_TRIGGER_PREFIX: + nrItems = ms.cacheCfg.ActionTriggers.Limit case utils.SHARED_GROUP_PREFIX: nrItems = ms.cacheCfg.SharedGroups.Limit case utils.DERIVEDCHARGERS_PREFIX: @@ -527,6 +530,8 @@ func (ms *MongoStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached _, err = ms.GetActions(dataID, false, utils.NonTransactional) case utils.ACTION_PLAN_PREFIX: _, err = ms.GetActionPlan(dataID, false, utils.NonTransactional) + case utils.ACTION_TRIGGER_PREFIX: + _, err = ms.GetActionTriggers(dataID, true, utils.NonTransactional) case utils.SHARED_GROUP_PREFIX: _, err = ms.GetSharedGroup(dataID, false, utils.NonTransactional) case utils.DERIVEDCHARGERS_PREFIX: @@ -1425,8 +1430,9 @@ func (ms *MongoStorage) AddLoadHistory(ldInst *utils.LoadInstance, loadHistSize } func (ms *MongoStorage) GetActionTriggers(key string, skipCache bool, transactionID string) (atrs ActionTriggers, err error) { + cacheKey := utils.ACTION_TRIGGER_PREFIX + key if !skipCache { - if x, ok := cache.Get(utils.ACTION_TRIGGER_PREFIX + key); ok { + if x, ok := cache.Get(cacheKey); ok { if x != nil { return x.(ActionTriggers), nil } @@ -1440,11 +1446,15 @@ func (ms *MongoStorage) GetActionTriggers(key string, skipCache bool, transactio } session, col := ms.conn(colAtr) defer session.Close() - err = col.Find(bson.M{"key": key}).One(&kv) - if err == nil { - atrs = kv.Value + if err = col.Find(bson.M{"key": key}).One(&kv); err != nil { + if err == mgo.ErrNotFound { + cache.Set(cacheKey, nil, cacheCommit(transactionID), transactionID) + err = utils.ErrNotFound + } + return } - cache.Set(utils.ACTION_TRIGGER_PREFIX+key, atrs, cacheCommit(transactionID), transactionID) + atrs = kv.Value + cache.Set(cacheKey, atrs, cacheCommit(transactionID), transactionID) return } @@ -1462,7 +1472,6 @@ func (ms *MongoStorage) SetActionTriggers(key string, atrs ActionTriggers, trans Key string Value ActionTriggers }{Key: key, Value: atrs}) - cache.RemKey(utils.ACTION_TRIGGER_PREFIX+key, cacheCommit(transactionID), transactionID) return err } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index b51d6d989..139d0b8af 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -239,6 +239,7 @@ func (rs *RedisStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached utils.RATING_PROFILE_PREFIX, utils.ACTION_PREFIX, utils.ACTION_PLAN_PREFIX, + utils.ACTION_TRIGGER_PREFIX, utils.SHARED_GROUP_PREFIX, utils.DERIVEDCHARGERS_PREFIX, utils.LCR_PREFIX, @@ -283,6 +284,8 @@ func (rs *RedisStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached nrItems = rs.cacheCfg.Actions.Limit case utils.ACTION_PLAN_PREFIX: nrItems = rs.cacheCfg.ActionPlans.Limit + case utils.ACTION_TRIGGER_PREFIX: + nrItems = rs.cacheCfg.ActionTriggers.Limit case utils.SHARED_GROUP_PREFIX: nrItems = rs.cacheCfg.SharedGroups.Limit case utils.DERIVEDCHARGERS_PREFIX: @@ -308,29 +311,31 @@ func (rs *RedisStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached } switch prfx { case utils.DESTINATION_PREFIX: - _, err = rs.GetDestination(dataID, false, utils.NonTransactional) + _, err = rs.GetDestination(dataID, true, utils.NonTransactional) case utils.REVERSE_DESTINATION_PREFIX: - _, err = rs.GetReverseDestination(dataID, false, utils.NonTransactional) + _, err = rs.GetReverseDestination(dataID, true, utils.NonTransactional) case utils.RATING_PLAN_PREFIX: - _, err = rs.GetRatingPlan(dataID, false, utils.NonTransactional) + _, err = rs.GetRatingPlan(dataID, true, utils.NonTransactional) case utils.RATING_PROFILE_PREFIX: - _, err = rs.GetRatingProfile(dataID, false, utils.NonTransactional) + _, err = rs.GetRatingProfile(dataID, true, utils.NonTransactional) case utils.ACTION_PREFIX: - _, err = rs.GetActions(dataID, false, utils.NonTransactional) + _, err = rs.GetActions(dataID, true, utils.NonTransactional) case utils.ACTION_PLAN_PREFIX: - _, err = rs.GetActionPlan(dataID, false, utils.NonTransactional) + _, err = rs.GetActionPlan(dataID, true, utils.NonTransactional) + case utils.ACTION_TRIGGER_PREFIX: + _, err = rs.GetActionTriggers(dataID, true, utils.NonTransactional) case utils.SHARED_GROUP_PREFIX: - _, err = rs.GetSharedGroup(dataID, false, utils.NonTransactional) + _, err = rs.GetSharedGroup(dataID, true, utils.NonTransactional) case utils.DERIVEDCHARGERS_PREFIX: - _, err = rs.GetDerivedChargers(dataID, false, utils.NonTransactional) + _, err = rs.GetDerivedChargers(dataID, true, utils.NonTransactional) case utils.LCR_PREFIX: - _, err = rs.GetLCR(dataID, false, utils.NonTransactional) + _, err = rs.GetLCR(dataID, true, utils.NonTransactional) case utils.ALIASES_PREFIX: - _, err = rs.GetAlias(dataID, false, utils.NonTransactional) + _, err = rs.GetAlias(dataID, true, utils.NonTransactional) case utils.REVERSE_ALIASES_PREFIX: - _, err = rs.GetReverseAlias(dataID, false, utils.NonTransactional) + _, err = rs.GetReverseAlias(dataID, true, utils.NonTransactional) case utils.ResourceLimitsPrefix: - _, err = rs.GetResourceLimit(dataID, false, utils.NonTransactional) + _, err = rs.GetResourceLimit(dataID, true, utils.NonTransactional) } if err != nil { return utils.NewCGRError(utils.REDIS, @@ -1069,15 +1074,22 @@ func (rs *RedisStorage) GetActionTriggers(key string, skipCache bool, transactio key = utils.ACTION_TRIGGER_PREFIX + key if !skipCache { if x, ok := cache.Get(key); ok { - if x != nil { - return x.(ActionTriggers), nil + if x == nil { + return nil, utils.ErrNotFound } - return nil, utils.ErrNotFound + return x.(ActionTriggers), nil } } var values []byte - if values, err = rs.Cmd("GET", key).Bytes(); err == nil { - err = rs.ms.Unmarshal(values, &atrs) + if values, err = rs.Cmd("GET", key).Bytes(); err != nil { + if err.Error() == "wrong type" { // did not find the destination + cache.Set(key, nil, cacheCommit(transactionID), transactionID) + err = utils.ErrNotFound + } + return + } + if err = rs.ms.Unmarshal(values, &atrs); err != nil { + return } cache.Set(key, atrs, cacheCommit(transactionID), transactionID) return @@ -1088,12 +1100,13 @@ func (rs *RedisStorage) SetActionTriggers(key string, atrs ActionTriggers, trans // delete the key return rs.Cmd("DEL", utils.ACTION_TRIGGER_PREFIX+key).Err } - result, err := rs.ms.Marshal(atrs) - if err != nil { + var result []byte + if result, err = rs.ms.Marshal(atrs); err != nil { return err } - err = rs.Cmd("SET", utils.ACTION_TRIGGER_PREFIX+key, result).Err - cache.RemKey(utils.ACTION_TRIGGER_PREFIX+key, cacheCommit(transactionID), transactionID) + if err = rs.Cmd("SET", utils.ACTION_TRIGGER_PREFIX+key, result).Err; err != nil { + return + } return }