mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-16 05:39:54 +05:00
Fix AddAccountAliases and AddRatingSubjectAliases APIs, fix deadlock in updateAlias
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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("<CDRS> Processing CDR %+v, got error: %s", cdr, err.Error()))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user