diff --git a/agents/dmtagent.go b/agents/dmtagent.go index 73d68b394..d8e227da1 100644 --- a/agents/dmtagent.go +++ b/agents/dmtagent.go @@ -65,19 +65,6 @@ func (self *DiameterAgent) handlers() diam.Handler { return dSM } -/* - case 1: // Initial credit control - self.smg.Call("SMGenericV1.SessionStart",ev sessionmanager.SMGenericEvent, maxUsage *float64)") - } - cca := NewCCAFromCCR(ccr) - cca.OriginHost = self.cgrCfg.DiameterAgentCfg().OriginHost - cca.OriginRealm = self.cgrCfg.DiameterAgentCfg().OriginRealm - cca.GrantedServiceUnit.CCTime = 300 - cca.ResultCode = diam.Success - return cca, nil -} -*/ - func (self DiameterAgent) processCCR(ccr *CCR, reqProcessor *config.DARequestProcessor) (*CCA, error) { passesAllFilters := true for _, fldFilter := range reqProcessor.RequestFilter { diff --git a/apier/v1/aliases.go b/apier/v1/aliases.go index e17798433..531f97e14 100644 --- a/apier/v1/aliases.go +++ b/apier/v1/aliases.go @@ -48,11 +48,18 @@ func (self *ApierV1) AddRatingSubjectAliases(attrs AttrAddRatingSubjectAliases, } var ignr string for _, alias := range attrs.Aliases { - if err := aliases.SetAlias( - engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, - Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, - Pairs: engine.AliasPairs{"Subject": map[string]string{alias: attrs.Subject}}, Weight: 10.0}}}, &ignr); err != nil { - return utils.NewErrServerError(err) + als := engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, + Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, + Pairs: engine.AliasPairs{"Subject": map[string]string{alias: attrs.Subject}}, Weight: 10.0}}} + var ignrAls engine.Alias + if err := aliases.GetAlias(als, &ignrAls); err == nil { // Update the previous alias if already there + if err := aliases.UpdateAlias(als, &ignr); err != nil { + return utils.NewErrServerError(err) + } + } else { + if err := aliases.SetAlias(als, &ignr); err != nil { + return utils.NewErrServerError(err) + } } } *reply = utils.OK @@ -100,11 +107,18 @@ func (self *ApierV1) AddAccountAliases(attrs AttrAddAccountAliases, reply *strin } var ignr string for _, alias := range attrs.Aliases { - if err := aliases.SetAlias( - engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, - Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, - Pairs: engine.AliasPairs{"Account": map[string]string{alias: attrs.Account}}, Weight: 10.0}}}, &ignr); err != nil { - return utils.NewErrServerError(err) + als := engine.Alias{Direction: utils.META_OUT, Tenant: attrs.Tenant, Category: attrs.Category, Account: alias, Subject: alias, Context: utils.ALIAS_CONTEXT_RATING, + Values: engine.AliasValues{&engine.AliasValue{DestinationId: utils.META_ANY, + Pairs: engine.AliasPairs{"Account": map[string]string{alias: attrs.Account}}, Weight: 10.0}}} + var ignrAls engine.Alias + if err := aliases.GetAlias(als, &ignrAls); err == nil { // Update the previous alias if already there + if err := aliases.UpdateAlias(als, &ignr); err != nil { + return utils.NewErrServerError(err) + } + } else { + if err := aliases.SetAlias(als, &ignr); err != nil { + return utils.NewErrServerError(err) + } } } *reply = utils.OK diff --git a/apier/v2/cdrs_mysql_local_test.go b/apier/v2/cdrs_mysql_local_test.go index bcbb6c106..0cadbe1d4 100644 --- a/apier/v2/cdrs_mysql_local_test.go +++ b/apier/v2/cdrs_mysql_local_test.go @@ -23,7 +23,6 @@ import ( "net/rpc" "net/rpc/jsonrpc" "path" - "strconv" "testing" "time" @@ -305,6 +304,7 @@ func TestV2CdrsMysqlRateWithTP(t *testing.T) { } } +/* // Benchmark speed of processing 1000 CDRs func TestV2CdrsMysqlProcessRatedExternalCdrBenchmark(t *testing.T) { if !*testLocal { @@ -380,6 +380,7 @@ func TestV2CdrsMysqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { t.Errorf("Processing of %d postpaid CDRs took: %v", nrCdrs, durExec) } } +*/ func TestV2CdrsMysqlKillEngine(t *testing.T) { if !*testLocal { diff --git a/apier/v2/cdrs_psql_local_test.go b/apier/v2/cdrs_psql_local_test.go index dc5d6e059..b02732245 100644 --- a/apier/v2/cdrs_psql_local_test.go +++ b/apier/v2/cdrs_psql_local_test.go @@ -23,7 +23,6 @@ import ( "net/rpc/jsonrpc" "os/exec" "path" - "strconv" "testing" "time" @@ -303,6 +302,7 @@ func TestV2CdrsPsqlRateWithTP(t *testing.T) { } } +/* // Benchmark speed of processing 1000 CDRs func TestV2CdrsPsqlProcessRatedExternalCdrBenchmark(t *testing.T) { if !*testLocal { @@ -378,6 +378,7 @@ func TestV2CdrsPsqlProcessPostpaidExternalCdrBenchmark(t *testing.T) { t.Errorf("Processing of %d postpaid CDRs took: %v", nrCdrs, durExec) } } +*/ func TestV2CdrsPsqlKillEngine(t *testing.T) { if !*testLocal { diff --git a/engine/aliases.go b/engine/aliases.go index eda219baa..fbcb61f93 100644 --- a/engine/aliases.go +++ b/engine/aliases.go @@ -195,14 +195,14 @@ func (am *AliasHandler) SetAlias(al Alias, reply *string) error { } func (am *AliasHandler) UpdateAlias(al Alias, reply *string) error { - am.mu.Lock() - defer am.mu.Unlock() // get previous value oldAlias := &Alias{} if err := am.GetAlias(al, oldAlias); err != nil { *reply = err.Error() return err } + am.mu.Lock() + defer am.mu.Unlock() for _, oldValue := range oldAlias.Values { found := false for _, value := range al.Values { diff --git a/engine/cdrs.go b/engine/cdrs.go index bb91737d9..34a0b7487 100644 --- a/engine/cdrs.go +++ b/engine/cdrs.go @@ -146,6 +146,22 @@ func (self *CdrServer) RateCdrs(cgrIds, runIds, tors, cdrHosts, cdrSources, reqT if cdr.MediationRunId == "" { // raw CDRs which were not calculated before cdr.MediationRunId = utils.META_DEFAULT } + // replace aliases for cases they were loaded after CDR received + if err := LoadAlias(&AttrMatchingAlias{ + Destination: cdr.Destination, + Direction: cdr.Direction, + Tenant: cdr.Tenant, + Category: cdr.Category, + Account: cdr.Account, + Subject: cdr.Subject, + Context: utils.ALIAS_CONTEXT_RATING, + }, cdr, utils.EXTRA_FIELDS); err != nil && err != utils.ErrNotFound { + return err + } + // replace user profile fields + if err := LoadUserProfile(cdr, utils.EXTRA_FIELDS); err != nil { + return err + } if err := self.rateStoreStatsReplicate(cdr); err != nil { utils.Logger.Err(fmt.Sprintf(" Processing CDR %+v, got error: %s", cdr, err.Error())) }