From b06755245efae32aad7bb045bf8a53ac987040b2 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Mon, 27 Jul 2015 23:00:02 +0300 Subject: [PATCH] fixes for local tests --- apier/v1/aliases.go | 4 +- engine/storage_interface.go | 4 +- engine/storage_map.go | 65 +++++++++++++----- engine/storage_redis.go | 133 +++++++++++++++++++++++++----------- engine/storage_test.go | 6 +- engine/tp_reader.go | 4 +- 6 files changed, 151 insertions(+), 65 deletions(-) diff --git a/apier/v1/aliases.go b/apier/v1/aliases.go index 7825531a0..aa6f50b8a 100644 --- a/apier/v1/aliases.go +++ b/apier/v1/aliases.go @@ -72,7 +72,7 @@ func (self *ApierV1) RemRatingSubjectAliases(tenantRatingSubject engine.TenantRa if missing := utils.MissingStructFields(&tenantRatingSubject, []string{"Tenant", "Subject"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } - if err := self.RatingDb.RemoveRpAliases([]*engine.TenantRatingSubject{&tenantRatingSubject}); err != nil { + if err := self.RatingDb.RemoveRpAliases([]*engine.TenantRatingSubject{&tenantRatingSubject}, false); err != nil { if err == utils.ErrNotFound { return err } @@ -125,7 +125,7 @@ func (self *ApierV1) RemAccountAliases(tenantAccount engine.TenantAccount, reply if missing := utils.MissingStructFields(&tenantAccount, []string{"Tenant", "Account"}); len(missing) != 0 { return utils.NewErrMandatoryIeMissing(missing...) } - if err := self.RatingDb.RemoveAccAliases([]*engine.TenantAccount{&tenantAccount}); err != nil { + if err := self.RatingDb.RemoveAccAliases([]*engine.TenantAccount{&tenantAccount}, false); err != nil { if err == utils.ErrNotFound { return err } diff --git a/engine/storage_interface.go b/engine/storage_interface.go index 4bf0e220b..6c05d287e 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -49,7 +49,7 @@ type RatingStorage interface { SetRatingProfile(*RatingProfile) error GetRpAlias(string, bool) (string, error) SetRpAlias(string, string) error - RemoveRpAliases([]*TenantRatingSubject) error + RemoveRpAliases([]*TenantRatingSubject, bool) error GetRPAliases(string, string, bool) ([]string, error) GetDestination(string) (*Destination, error) SetDestination(*Destination) error @@ -69,7 +69,7 @@ type RatingStorage interface { GetAllActionPlans() (map[string]ActionPlans, error) GetAccAlias(string, bool) (string, error) SetAccAlias(string, string) error - RemoveAccAliases([]*TenantAccount) error + RemoveAccAliases([]*TenantAccount, bool) error GetAccountAliases(string, string, bool) ([]string, error) SetUser(*UserProfile) error GetUser(string) (*UserProfile, error) diff --git a/engine/storage_map.go b/engine/storage_map.go index 8c6d62045..09ca2539b 100644 --- a/engine/storage_map.go +++ b/engine/storage_map.go @@ -342,18 +342,30 @@ func (ms *MapStorage) SetRpAlias(key, alias string) (err error) { return } -func (ms *MapStorage) RemoveRpAliases(tenantRtSubjects []*TenantRatingSubject) (err error) { - for key, _ := range ms.dict { - for _, tntRtSubj := range tenantRtSubjects { - tenantPrfx := utils.RP_ALIAS_PREFIX + tntRtSubj.Tenant + utils.CONCATENATED_KEY_SEP - if strings.HasPrefix(key, utils.RP_ALIAS_PREFIX) { - alsSubj, err := ms.GetRpAlias(key[len(utils.RP_ALIAS_PREFIX):], true) - if err != nil { - return err - } - if len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tntRtSubj.Subject == alsSubj { - cache2go.RemKey(key) +func (ms *MapStorage) RemoveRpAliases(tenantRtSubjects []*TenantRatingSubject, skipCache bool) (err error) { + if skipCache { + for key, value := range ms.dict { + for _, tenantRtSubj := range tenantRtSubjects { + tenantPrfx := utils.RP_ALIAS_PREFIX + tenantRtSubj.Tenant + utils.CONCATENATED_KEY_SEP + if strings.HasPrefix(key, utils.RP_ALIAS_PREFIX) && len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tenantRtSubj.Subject == string(value) { delete(ms.dict, key) + cache2go.RemKey(key) + } + } + } + } else { + alsMap, err := cache2go.GetAllEntries(utils.RP_ALIAS_PREFIX) + if err != nil { + return err + } + + for key, aliasInterface := range alsMap { + alias := aliasInterface.Value().(string) + for _, tenantRtSubj := range tenantRtSubjects { + tenantPrfx := tenantRtSubj.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tenantRtSubj.Subject == alias { + delete(ms.dict, utils.RP_ALIAS_PREFIX+key) + cache2go.RemKey(utils.RP_ALIAS_PREFIX + key) } } } @@ -408,12 +420,31 @@ func (ms *MapStorage) SetAccAlias(key, alias string) (err error) { return } -func (ms *MapStorage) RemoveAccAliases(tenantAccounts []*TenantAccount) (err error) { - for key, value := range ms.dict { - for _, tntAcnt := range tenantAccounts { - tenantPrfx := utils.ACC_ALIAS_PREFIX + tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP - if strings.HasPrefix(key, utils.ACC_ALIAS_PREFIX) && len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tntAcnt.Account == string(value) { - delete(ms.dict, key) +func (ms *MapStorage) RemoveAccAliases(tenantAccounts []*TenantAccount, skipCache bool) (err error) { + if skipCache { + for key, value := range ms.dict { + for _, tntAcnt := range tenantAccounts { + tenantPrfx := utils.ACC_ALIAS_PREFIX + tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP + if strings.HasPrefix(key, utils.ACC_ALIAS_PREFIX) && len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tntAcnt.Account == string(value) { + delete(ms.dict, key) + cache2go.RemKey(key) + } + } + } + } else { + alsMap, err := cache2go.GetAllEntries(utils.ACC_ALIAS_PREFIX) + if err != nil { + return err + } + + for key, aliasInterface := range alsMap { + alias := aliasInterface.Value().(string) + for _, tntAcnt := range tenantAccounts { + tenantPrfx := tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) >= len(tenantPrfx) && key[:len(tenantPrfx)] == tenantPrfx && tntAcnt.Account == alias { + delete(ms.dict, utils.ACC_ALIAS_PREFIX+key) + cache2go.RemKey(utils.ACC_ALIAS_PREFIX + key) + } } } } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 5f5648bda..20075cb5c 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -411,28 +411,56 @@ func (rs *RedisStorage) SetRpAlias(key, alias string) (err error) { } // Removes the aliases of a specific account, on a tenant -func (rs *RedisStorage) RemoveRpAliases(tenantRtSubjects []*TenantRatingSubject) (err error) { - alsMap, err := cache2go.GetAllEntries(utils.RP_ALIAS_PREFIX) - if err != nil { - return err - } - - for key, aliasInterface := range alsMap { - alias := aliasInterface.Value().(string) - for _, tntRSubj := range tenantRtSubjects { - tenantPrfx := tntRSubj.Tenant + utils.CONCATENATED_KEY_SEP - if len(key) < len(tenantPrfx) || !strings.HasPrefix(key, tenantPrfx) { // filter out the tenant for accounts - continue - } - if tntRSubj.Subject != alias { - continue - } - if _, err = rs.db.Del(utils.RP_ALIAS_PREFIX + key); err != nil { - return err - } - cache2go.RemKey(utils.RP_ALIAS_PREFIX + key) - break +func (rs *RedisStorage) RemoveRpAliases(tenantRtSubjects []*TenantRatingSubject, skipCache bool) (err error) { + if skipCache { + alsKeys, err := rs.db.Keys(utils.RP_ALIAS_PREFIX + "*") + if err != nil { + return err } + for _, key := range alsKeys { + for _, tntRSubj := range tenantRtSubjects { + tenantPrfx := utils.RP_ALIAS_PREFIX + tntRSubj.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) < len(tenantPrfx) || tenantPrfx != key[:len(tenantPrfx)] { // filter out the tenant for accounts + continue + } + alias, err := rs.GetRpAlias(key[len(utils.RP_ALIAS_PREFIX):], true) + if err != nil { + return err + } + if tntRSubj.Subject != alias { + continue + } + cache2go.RemKey(key) + if _, err = rs.db.Del(key); err != nil { + return err + } + break + } + } + } else { + alsMap, err := cache2go.GetAllEntries(utils.RP_ALIAS_PREFIX) + if err != nil { + return err + } + + for key, aliasInterface := range alsMap { + alias := aliasInterface.Value().(string) + for _, tntRSubj := range tenantRtSubjects { + tenantPrfx := tntRSubj.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) < len(tenantPrfx) || !strings.HasPrefix(key, tenantPrfx) { // filter out the tenant for accounts + continue + } + if tntRSubj.Subject != alias { + continue + } + if _, err = rs.db.Del(utils.RP_ALIAS_PREFIX + key); err != nil { + return err + } + cache2go.RemKey(utils.RP_ALIAS_PREFIX + key) + break + } + } + } return } @@ -506,26 +534,53 @@ func (rs *RedisStorage) SetAccAlias(key, alias string) (err error) { return } -func (rs *RedisStorage) RemoveAccAliases(tenantAccounts []*TenantAccount) (err error) { - alsMap, err := cache2go.GetAllEntries(utils.ACC_ALIAS_PREFIX) - if err != nil { - return err - } +func (rs *RedisStorage) RemoveAccAliases(tenantAccounts []*TenantAccount, skipCache bool) (err error) { + if skipCache { + alsKeys, err := rs.db.Keys(utils.ACC_ALIAS_PREFIX + "*") + if err != nil { + return err + } + for _, key := range alsKeys { + for _, tntAcnt := range tenantAccounts { + tenantPrfx := utils.ACC_ALIAS_PREFIX + tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) < len(tenantPrfx) || tenantPrfx != key[:len(tenantPrfx)] { // filter out the tenant for accounts + continue + } + alias, err := rs.GetAccAlias(key[len(utils.ACC_ALIAS_PREFIX):], true) + if err != nil { + return err + } + if tntAcnt.Account != alias { + continue + } + cache2go.RemKey(key) + if _, err = rs.db.Del(key); err != nil { + return err + } + } + } - for key, aliasInterface := range alsMap { - alias := aliasInterface.Value().(string) - for _, tntAcnt := range tenantAccounts { - tenantPrfx := tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP - if len(key) < len(tenantPrfx) || !strings.HasPrefix(key, tenantPrfx) { // filter out the tenant for accounts - continue + } else { + alsMap, err := cache2go.GetAllEntries(utils.ACC_ALIAS_PREFIX) + if err != nil { + return err + } + + for key, aliasInterface := range alsMap { + alias := aliasInterface.Value().(string) + for _, tntAcnt := range tenantAccounts { + tenantPrfx := tntAcnt.Tenant + utils.CONCATENATED_KEY_SEP + if len(key) < len(tenantPrfx) || !strings.HasPrefix(key, tenantPrfx) { // filter out the tenant for accounts + continue + } + if tntAcnt.Account != alias { + continue + } + if _, err = rs.db.Del(utils.ACC_ALIAS_PREFIX + key); err != nil { + return err + } + cache2go.RemKey(utils.ACC_ALIAS_PREFIX + key) } - if tntAcnt.Account != alias { - continue - } - if _, err = rs.db.Del(utils.ACC_ALIAS_PREFIX + key); err != nil { - return err - } - cache2go.RemKey(utils.ACC_ALIAS_PREFIX + key) } } return diff --git a/engine/storage_test.go b/engine/storage_test.go index 21cf88006..faa089e75 100644 --- a/engine/storage_test.go +++ b/engine/storage_test.go @@ -159,7 +159,7 @@ func TestRemRSubjAliases(t *testing.T) { if err := ratingStorage.SetRpAlias(utils.RatingSubjectAliasKey("itsyscom.com", "2003"), "1001"); err != nil { t.Error(err) } - if err := ratingStorage.RemoveRpAliases([]*TenantRatingSubject{&TenantRatingSubject{Tenant: "cgrates.org", Subject: "1001"}}); err != nil { + if err := ratingStorage.RemoveRpAliases([]*TenantRatingSubject{&TenantRatingSubject{Tenant: "cgrates.org", Subject: "1001"}}, true); err != nil { t.Error(err) } if cgrAliases, err := ratingStorage.GetRPAliases("cgrates.org", "1001", true); err != nil { @@ -184,7 +184,7 @@ func TestStorageRpAliases(t *testing.T) { if _, err := ratingStorage.GetRpAlias("cgrates.org:1991", true); err != nil { t.Error("Alias not found after setting") } - if err := ratingStorage.RemoveRpAliases([]*TenantRatingSubject{&TenantRatingSubject{Tenant: "cgrates.org", Subject: "1991"}}); err != nil { + if err := ratingStorage.RemoveRpAliases([]*TenantRatingSubject{&TenantRatingSubject{Tenant: "cgrates.org", Subject: "1991"}}, true); err != nil { t.Error(err) } if _, err := ratingStorage.GetRpAlias("cgrates.org:1991", true); err == nil { @@ -225,7 +225,7 @@ func TestStorageAccAliases(t *testing.T) { if _, err := ratingStorage.GetAccAlias("cgrates.org:1991", true); err != nil { t.Error("Alias not found after setting") } - if err := ratingStorage.RemoveAccAliases([]*TenantAccount{&TenantAccount{Tenant: "cgrates.org", Account: "1991"}}); err != nil { + if err := ratingStorage.RemoveAccAliases([]*TenantAccount{&TenantAccount{Tenant: "cgrates.org", Account: "1991"}}, true); err != nil { t.Error(err) } if _, err := ratingStorage.GetAccAlias("cgrates.org:1991", true); err == nil { diff --git a/engine/tp_reader.go b/engine/tp_reader.go index 86be943ac..32d53df70 100644 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -1251,7 +1251,7 @@ func (tpr *TpReader) WriteToDatabase(flush, verbose bool) (err error) { if verbose { log.Print("Rating Profile Aliases:") } - if err := tpr.ratingStorage.RemoveRpAliases(tpr.dirtyRpAliases); err != nil { + if err := tpr.ratingStorage.RemoveRpAliases(tpr.dirtyRpAliases, true); err != nil { return err } for key, alias := range tpr.rpAliases { @@ -1266,7 +1266,7 @@ func (tpr *TpReader) WriteToDatabase(flush, verbose bool) (err error) { if verbose { log.Print("Account Aliases:") } - if err := tpr.ratingStorage.RemoveAccAliases(tpr.dirtyAccAliases); err != nil { + if err := tpr.ratingStorage.RemoveAccAliases(tpr.dirtyAccAliases, true); err != nil { return err } for key, alias := range tpr.accAliases {