diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index 57fb6adf7..1c1742277 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -24,6 +24,7 @@ import ( "path" "reflect" "testing" + "time" "github.com/cgrates/cgrates/cache" "github.com/cgrates/cgrates/config" @@ -43,7 +44,9 @@ var sTestsOnStorIT = []func(t *testing.T){ testOnStorITSetReqFilterIndexes, testOnStorITGetReqFilterIndexes, testOnStorITMatchReqFilterIndex, - testOnStorITCacheDataFromDB, + testOnStorITCacheDestinations, + testOnStorITCacheReverseDestinations, + testOnStorITCacheRatingPlan, } func TestOnStorITRedisConnect(t *testing.T) { @@ -82,8 +85,9 @@ func TestOnStorITMongo(t *testing.T) { func testOnStorITFlush(t *testing.T) { if err := onStor.Flush(""); err != nil { - t.Error("Failed to Flush redis database", err.Error()) + t.Error(err) } + cache.Flush() } func testOnStorITSetGetDerivedCharges(t *testing.T) { @@ -204,9 +208,12 @@ func testOnStorITMatchReqFilterIndex(t *testing.T) { } } -func testOnStorITCacheDataFromDB(t *testing.T) { +func testOnStorITCacheDestinations(t *testing.T) { + if err := onStor.CacheDataFromDB("INVALID", nil, false); err == nil || err.Error() != utils.UnsupportedCachePrefix { + t.Error(err) + } dst := &Destination{Id: "TEST_CACHE", Prefixes: []string{"+491", "+492", "+493"}} - if err := onStor.SetDestination(dst, ""); err != nil { + if err := onStor.SetDestination(dst, utils.NonTransactional); err != nil { t.Error(err) } if _, hasIt := cache.Get(utils.DESTINATION_PREFIX + dst.Id); hasIt { @@ -227,3 +234,78 @@ func testOnStorITCacheDataFromDB(t *testing.T) { t.Error("Wrong item in the cache") } } + +func testOnStorITCacheReverseDestinations(t *testing.T) { + dst := &Destination{Id: "TEST_CACHE", Prefixes: []string{"+491", "+492", "+493"}} + if err := onStor.SetReverseDestination(dst, utils.NonTransactional); err != nil { + t.Error(err) + } + for _, prfx := range dst.Prefixes { + if _, hasIt := cache.Get(utils.REVERSE_DESTINATION_PREFIX + dst.Id); hasIt { + t.Errorf("Prefix: %s already in cache", prfx) + } + } + if err := onStor.CacheDataFromDB(utils.REVERSE_DESTINATION_PREFIX, dst.Prefixes, false); err != nil { + t.Error(err) + } + for _, prfx := range dst.Prefixes { + if itm, hasIt := cache.Get(utils.REVERSE_DESTINATION_PREFIX + prfx); !hasIt { + t.Error("Did not cache") + } else if !reflect.DeepEqual([]string{dst.Id}, itm.([]string)) { + t.Error("Wrong item in the cache") + } + } +} + +func testOnStorITCacheRatingPlan(t *testing.T) { + rp := &RatingPlan{ + Id: "TEST_RP_CACHE", + Timings: map[string]*RITiming{ + "59a981b9": &RITiming{ + Years: utils.Years{}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{1, 2, 3, 4, 5}, + StartTime: "00:00:00", + }, + }, + Ratings: map[string]*RIRate{ + "ebefae11": &RIRate{ + ConnectFee: 0, + Rates: []*Rate{ + &Rate{ + GroupIntervalStart: 0, + Value: 0.2, + RateIncrement: time.Second, + RateUnit: time.Minute, + }, + }, + RoundingMethod: utils.ROUNDING_MIDDLE, + RoundingDecimals: 4, + }, + }, + DestinationRates: map[string]RPRateList{ + "GERMANY": []*RPRate{ + &RPRate{ + Timing: "59a981b9", + Rating: "ebefae11", + Weight: 10, + }, + }, + }, + } + if err := onStor.SetRatingPlan(rp, utils.NonTransactional); err != nil { + t.Error(err) + } + if _, hasIt := cache.Get(utils.RATING_PLAN_PREFIX + rp.Id); hasIt { + t.Error("Already in cache") + } + if err := onStor.CacheDataFromDB(utils.RATING_PLAN_PREFIX, []string{rp.Id}, false); err != nil { + t.Error(err) + } + if itm, hasIt := cache.Get(utils.RATING_PLAN_PREFIX + rp.Id); !hasIt { + t.Error("Did not cache") + } else if rcvRp := itm.(*RatingPlan); !reflect.DeepEqual(rp, rcvRp) { + t.Error("Wrong item in the cache") + } +} diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index 4236b919f..7b7e56aa7 100644 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -473,7 +473,9 @@ func (ms *MongoStorage) PreloadCacheForPrefix(prefix string) error { // prfx represents the cache prefix, ids should be nil if all available data should be loaded // mustBeCached specifies that data needs to be cached in order to be retrieved from db func (ms *MongoStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached bool) (err error) { - if !utils.IsSliceMember([]string{utils.DESTINATION_PREFIX}, prfx) { + if !utils.IsSliceMember([]string{utils.DESTINATION_PREFIX, + utils.REVERSE_DESTINATION_PREFIX, + utils.RATING_PLAN_PREFIX}, prfx) { return utils.NewCGRError(utils.REDIS, utils.MandatoryIEMissingCaps, utils.UnsupportedCachePrefix, @@ -495,12 +497,17 @@ func (ms *MongoStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached } switch prfx { case utils.DESTINATION_PREFIX: - if _, err = ms.GetDestination(dataID, false, utils.NonTransactional); err != nil { - return utils.NewCGRError(utils.REDIS, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("redis error <%s> querying GetDestination for prefix: <%s>, dataID: <%s>", prfx, dataID)) - } + _, err = ms.GetDestination(dataID, false, utils.NonTransactional) + case utils.REVERSE_DESTINATION_PREFIX: + _, err = ms.GetReverseDestination(dataID, false, utils.NonTransactional) + case utils.RATING_PLAN_PREFIX: + _, err = ms.GetRatingPlan(dataID, false, utils.NonTransactional) + } + if err != nil { + return utils.NewCGRError(utils.REDIS, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error <%s> querying mongo for category: <%s>, dataID: <%s>", prfx, dataID)) } } return @@ -657,7 +664,7 @@ func (ms *MongoStorage) SetRatingPlan(rp *RatingPlan, transactionID string) erro var response int historyScribe.Call("HistoryV1.Record", rp.GetHistoryRecord(), &response) } - cache.Set(utils.RATING_PLAN_PREFIX+rp.Id, rp, cacheCommit(transactionID), transactionID) + //cache.Set(utils.RATING_PLAN_PREFIX+rp.Id, rp, cacheCommit(transactionID), transactionID) return err } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 6f37d9b51..35fbd20bd 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -273,7 +273,9 @@ func (rs *RedisStorage) RebuildReverseForPrefix(prefix string) error { // prfx represents the cache prefix, ids should be nil if all available data should be loaded // mustBeCached specifies that data needs to be cached in order to be retrieved from db func (rs *RedisStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached bool) (err error) { - if !utils.IsSliceMember([]string{utils.DESTINATION_PREFIX}, prfx) { + if !utils.IsSliceMember([]string{utils.DESTINATION_PREFIX, + utils.REVERSE_DESTINATION_PREFIX, + utils.RATING_PLAN_PREFIX}, prfx) { return utils.NewCGRError(utils.REDIS, utils.MandatoryIEMissingCaps, utils.UnsupportedCachePrefix, @@ -295,12 +297,17 @@ func (rs *RedisStorage) CacheDataFromDB(prfx string, ids []string, mustBeCached } switch prfx { case utils.DESTINATION_PREFIX: - if _, err = rs.GetDestination(dataID, false, utils.NonTransactional); err != nil { - return utils.NewCGRError(utils.REDIS, - utils.ServerErrorCaps, - err.Error(), - fmt.Sprintf("redis error <%s> querying GetDestination for prefix: <%s>, dataID: <%s>", prfx, dataID)) - } + _, err = rs.GetDestination(dataID, false, utils.NonTransactional) + case utils.REVERSE_DESTINATION_PREFIX: + _, err = rs.GetReverseDestination(dataID, false, utils.NonTransactional) + case utils.RATING_PLAN_PREFIX: + _, err = rs.GetRatingPlan(dataID, false, utils.NonTransactional) + } + if err != nil { + return utils.NewCGRError(utils.REDIS, + utils.ServerErrorCaps, + err.Error(), + fmt.Sprintf("error <%s> querying redis for category: <%s>, dataID: <%s>", prfx, dataID)) } } return @@ -364,7 +371,7 @@ func (rs *RedisStorage) SetRatingPlan(rp *RatingPlan, transactionID string) (err response := 0 go historyScribe.Call("HistoryV1.Record", rp.GetHistoryRecord(), &response) } - cache.Set(utils.RATING_PLAN_PREFIX+rp.Id, rp, cacheCommit(transactionID), transactionID) + //cache.Set(utils.RATING_PLAN_PREFIX+rp.Id, rp, cacheCommit(transactionID), transactionID) return }