diff --git a/engine/calldesc.go b/engine/calldesc.go index 296e29ac7..fbd9bb298 100755 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -958,7 +958,7 @@ func (cd *CallDescriptor) GetLCRFromStorage() (*LCR, error) { keyVariants = append(keyVariants[:1], append(partialSubjects, keyVariants[1:]...)...) } for _, key := range keyVariants { - if lcr, err := dm.DataDB().GetLCR(key, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { + if lcr, err := dm.GetLCR(key, false, utils.NonTransactional); err != nil && err != utils.ErrNotFound { return nil, err } else if err == nil && lcr != nil { return lcr, nil diff --git a/engine/datamanager.go b/engine/datamanager.go index fa6a96557..700d2cf06 100644 --- a/engine/datamanager.go +++ b/engine/datamanager.go @@ -181,7 +181,7 @@ func (dm *DataManager) CacheDataFromDB(prfx string, ids []string, mustBeCached b case utils.DERIVEDCHARGERS_PREFIX: _, err = dm.DataDB().GetDerivedChargers(dataID, true, utils.NonTransactional) case utils.LCR_PREFIX: - _, err = dm.DataDB().GetLCR(dataID, true, utils.NonTransactional) + _, err = dm.GetLCR(dataID, true, utils.NonTransactional) case utils.ALIASES_PREFIX: _, err = dm.DataDB().GetAlias(dataID, true, utils.NonTransactional) case utils.REVERSE_ALIASES_PREFIX: @@ -523,3 +523,24 @@ func (dm *DataManager) RemoveActionTriggers(id, transactionID string) (err error cache.RemKey(utils.ACTION_TRIGGER_PREFIX+id, cacheCommit(transactionID), transactionID) return } + +func (dm *DataManager) GetLCR(id string, skipCache bool, transactionID string) (lcr *LCR, err error) { + key := utils.LCR_PREFIX + id + if !skipCache { + if x, ok := cache.Get(key); ok { + if x == nil { + return nil, utils.ErrNotFound + } + return x.(*LCR), nil + } + } + lcr, err = dm.DataDB().GetLCRDrv(id) + if err != nil { + if err == utils.ErrNotFound { + cache.Set(key, nil, cacheCommit(transactionID), transactionID) + } + return nil, err + } + cache.Set(key, lcr, cacheCommit(transactionID), transactionID) + return +} diff --git a/engine/loader_it_test.go b/engine/loader_it_test.go index 8beefbd5f..c63f2f9bd 100755 --- a/engine/loader_it_test.go +++ b/engine/loader_it_test.go @@ -261,7 +261,7 @@ func TestLoaderITWriteToDatabase(t *testing.T) { } for k, lcr := range loader.lcrs { - rcv, err := loader.dataStorage.GetLCR(k, true, utils.NonTransactional) + rcv, err := loader.dm.GetLCR(k, true, utils.NonTransactional) if err != nil { t.Error("Failed GetLCR: ", err.Error()) } diff --git a/engine/onstor_it_test.go b/engine/onstor_it_test.go index 90f169582..f962f9d8a 100644 --- a/engine/onstor_it_test.go +++ b/engine/onstor_it_test.go @@ -1218,13 +1218,13 @@ func testOnStorITCRUDLCR(t *testing.T) { }, } - if _, rcvErr := onStor.DataDB().GetLCR(lcr.GetId(), true, utils.NonTransactional); rcvErr != utils.ErrNotFound { + if _, rcvErr := onStor.GetLCR(lcr.GetId(), true, utils.NonTransactional); rcvErr != utils.ErrNotFound { t.Error(rcvErr) } if err := onStor.DataDB().SetLCR(lcr, utils.NonTransactional); err != nil { t.Error(err) } - if rcv, err := onStor.DataDB().GetLCR(lcr.GetId(), true, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetLCR(lcr.GetId(), true, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(lcr, rcv) { t.Errorf("Expecting: %v, received: %v", lcr, rcv) @@ -1237,7 +1237,7 @@ func testOnStorITCRUDLCR(t *testing.T) { // t.Error(rcvErr) // } // - if rcv, err := onStor.DataDB().GetLCR(lcr.GetId(), false, utils.NonTransactional); err != nil { + if rcv, err := onStor.GetLCR(lcr.GetId(), false, utils.NonTransactional); err != nil { t.Error(err) } else if !reflect.DeepEqual(lcr, rcv) { t.Errorf("Expecting: %v, received: %v", lcr, rcv) diff --git a/engine/storage_interface.go b/engine/storage_interface.go index d5bfc13c3..d893941ca 100755 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -59,7 +59,7 @@ type DataDB interface { SetReverseDestination(*Destination, string) error GetReverseDestination(string, bool, string) ([]string, error) UpdateReverseDestination(*Destination, *Destination, string) error - GetLCR(string, bool, string) (*LCR, error) + GetLCRDrv(string) (*LCR, error) SetLCR(*LCR, string) error SetCdrStats(*CdrStats) error GetCdrStats(string) (*CdrStats, error) diff --git a/engine/storage_map.go b/engine/storage_map.go index 5be0a3842..1ac8cc59c 100755 --- a/engine/storage_map.go +++ b/engine/storage_map.go @@ -285,26 +285,15 @@ func (ms *MapStorage) RemoveRatingProfile(key string, transactionID string) (err return } -func (ms *MapStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { +func (ms *MapStorage) GetLCRDrv(id string) (lcr *LCR, err error) { ms.mu.RLock() defer ms.mu.RUnlock() - key = utils.LCR_PREFIX + key - if !skipCache { - if x, ok := cache.Get(key); ok { - if x != nil { - return x.(*LCR), nil - } - return nil, utils.ErrNotFound - } - } - cCommit := cacheCommit(transactionID) + key := utils.LCR_PREFIX + id if values, ok := ms.dict[key]; ok { err = ms.ms.Unmarshal(values, &lcr) } else { - cache.Set(key, nil, cCommit, transactionID) return nil, utils.ErrNotFound } - cache.Set(key, lcr, cCommit, transactionID) return } diff --git a/engine/storage_mongo_datadb.go b/engine/storage_mongo_datadb.go index 2ca4f38ac..4210a205d 100755 --- a/engine/storage_mongo_datadb.go +++ b/engine/storage_mongo_datadb.go @@ -735,32 +735,21 @@ func (ms *MongoStorage) RemoveRatingProfile(key, transactionID string) error { return iter.Close() } -func (ms *MongoStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { - cacheKey := utils.LCR_PREFIX + key - if !skipCache { - if x, ok := cache.Get(cacheKey); ok { - if x == nil { - return nil, utils.ErrNotFound - } - return x.(*LCR), nil - } - } +func (ms *MongoStorage) GetLCRDrv(key string) (lcr *LCR, err error) { + var result struct { Key string Value *LCR } session, col := ms.conn(colLcr) defer session.Close() - cCommit := cacheCommit(transactionID) if err = col.Find(bson.M{"key": key}).One(&result); err != nil { if err == mgo.ErrNotFound { - cache.Set(cacheKey, nil, cCommit, transactionID) err = utils.ErrNotFound } return nil, err } lcr = result.Value - cache.Set(cacheKey, lcr, cCommit, transactionID) return } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 2a7ebb0e9..1c4c32108 100755 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -326,20 +326,11 @@ func (rs *RedisStorage) RemoveRatingProfile(key string, transactionID string) er return nil } -func (rs *RedisStorage) GetLCR(key string, skipCache bool, transactionID string) (lcr *LCR, err error) { - key = utils.LCR_PREFIX + key - if !skipCache { - if x, ok := cache.Get(key); ok { - if x == nil { - return nil, utils.ErrNotFound - } - return x.(*LCR), nil - } - } +func (rs *RedisStorage) GetLCRDrv(id string) (lcr *LCR, err error) { + key := utils.LCR_PREFIX + id var values []byte if values, err = rs.Cmd("GET", key).Bytes(); err != nil { if err == redis.ErrRespNil { // did not find the destination - cache.Set(key, nil, cacheCommit(transactionID), transactionID) err = utils.ErrNotFound } return @@ -347,7 +338,6 @@ func (rs *RedisStorage) GetLCR(key string, skipCache bool, transactionID string) if err = rs.ms.Unmarshal(values, &lcr); err != nil { return } - cache.Set(key, lcr, cacheCommit(transactionID), transactionID) return }