Fix AddAccountAliases and AddRatingSubjectAliases APIs, fix deadlock in updateAlias

This commit is contained in:
DanB
2015-11-27 20:52:43 +01:00
parent 7bcd168a01
commit d3c326c372
6 changed files with 46 additions and 27 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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()))
}