From 53a4895683592a8356d20de86f8e4bdf0bc81751 Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Fri, 3 Apr 2015 19:40:18 +0300 Subject: [PATCH] fix build and test on lcr qos sorter --- apier/v1/accounts.go | 16 +++++----- apier/v1/apier.go | 12 ++++---- apier/v2/apier.go | 4 +-- engine/lcr.go | 10 ++++-- engine/lcr_test.go | 69 ++++++++++++++++++++++++++++++++++++++++++ scheduler/scheduler.go | 4 +-- 6 files changed, 95 insertions(+), 20 deletions(-) diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index 62cddae7a..77359dbb9 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -80,7 +80,7 @@ func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) e return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } } - _, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { + _, err := engine.AccLock.Guard(func() (float64, error) { ats, err := self.AccountDb.GetActionTimings(attrs.ActionPlanId) if err != nil { return 0, err @@ -92,7 +92,7 @@ func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) e return 0, err } return 0, nil - }) + }, engine.ACTION_TIMING_PREFIX) if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } @@ -130,7 +130,7 @@ func (self *ApierV1) RemAccountActionTriggers(attrs AttrRemAcntActionTriggers, r return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } balanceId := utils.AccountKey(attrs.Tenant, attrs.Account, attrs.Direction) - _, err := engine.AccLock.Guard(balanceId, func() (float64, error) { + _, err := engine.AccLock.Guard(func() (float64, error) { ub, err := self.AccountDb.GetAccount(balanceId) if err != nil { return 0, err @@ -150,7 +150,7 @@ func (self *ApierV1) RemAccountActionTriggers(attrs AttrRemAcntActionTriggers, r return 0, err } return 0, nil - }) + }, balanceId) if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } @@ -174,7 +174,7 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error { balanceId := utils.AccountKey(attr.Tenant, attr.Account, attr.Direction) var ub *engine.Account var ats engine.ActionPlan - _, err := engine.AccLock.Guard(balanceId, func() (float64, error) { + _, err := engine.AccLock.Guard(func() (float64, error) { if bal, _ := self.AccountDb.GetAccount(balanceId); bal != nil { ub = bal } else { // Not found in db, create it here @@ -199,17 +199,17 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error { return 0, err } return 0, nil - }) + }, balanceId) if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } if len(ats) != 0 { - _, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { // ToDo: Try locking it above on read somehow + _, err := engine.AccLock.Guard(func() (float64, error) { // ToDo: Try locking it above on read somehow if err := self.AccountDb.SetActionTimings(attr.ActionPlanId, ats); err != nil { return 0, err } return 0, nil - }) + }, engine.ACTION_TIMING_PREFIX) if err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } diff --git a/apier/v1/apier.go b/apier/v1/apier.go index e70e2e1b3..60f23ba34 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -588,7 +588,7 @@ func (self *ApierV1) AddTriggeredAction(attr AttrAddActionTrigger, reply *string } tag := utils.AccountKey(attr.Tenant, attr.Account, attr.BalanceDirection) - _, err = engine.AccLock.Guard(tag, func() (float64, error) { + _, err = engine.AccLock.Guard(func() (float64, error) { userBalance, err := self.AccountDb.GetAccount(tag) if err != nil { return 0, err @@ -600,7 +600,7 @@ func (self *ApierV1) AddTriggeredAction(attr AttrAddActionTrigger, reply *string return 0, err } return 0, nil - }) + }, tag) if err != nil { *reply = err.Error() return err @@ -658,7 +658,7 @@ func (self *ApierV1) ResetTriggeredActions(attr AttrResetTriggeredAction, reply } } accID := utils.AccountKey(attr.Tenant, attr.Account, attr.Direction) - _, err := engine.AccLock.Guard(accID, func() (float64, error) { + _, err := engine.AccLock.Guard(func() (float64, error) { acc, err := self.AccountDb.GetAccount(accID) if err != nil { return 0, err @@ -670,7 +670,7 @@ func (self *ApierV1) ResetTriggeredActions(attr AttrResetTriggeredAction, reply return 0, err } return 0, nil - }) + }, accID) if err != nil { *reply = err.Error() return err @@ -685,12 +685,12 @@ func (self *ApierV1) LoadAccountActions(attrs utils.TPAccountActions, reply *str return fmt.Errorf("%s:%s", utils.ERR_MANDATORY_IE_MISSING, "TPid") } dbReader := engine.NewDbReader(self.StorDb, self.RatingDb, self.AccountDb, attrs.TPid) - if _, err := engine.AccLock.Guard(attrs.KeyId(), func() (float64, error) { + if _, err := engine.AccLock.Guard(func() (float64, error) { if err := dbReader.LoadAccountActionsFiltered(&attrs); err != nil { return 0, err } return 0, nil - }); err != nil { + }, attrs.KeyId()); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } // ToDo: Get the action keys loaded by dbReader so we reload only these in cache diff --git a/apier/v2/apier.go b/apier/v2/apier.go index 9e4efc059..f7f8e7d9f 100644 --- a/apier/v2/apier.go +++ b/apier/v2/apier.go @@ -73,12 +73,12 @@ func (self *ApierV2) LoadAccountActions(attrs AttrLoadAccountActions, reply *str tpAa := &utils.TPAccountActions{TPid: attrs.TPid} tpAa.SetAccountActionsId(attrs.AccountActionsId) - if _, err := engine.AccLock.Guard(attrs.AccountActionsId, func() (float64, error) { + if _, err := engine.AccLock.Guard(func() (float64, error) { if err := dbReader.LoadAccountActionsFiltered(tpAa); err != nil { return 0, err } return 0, nil - }); err != nil { + }, attrs.AccountActionsId); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } // ToDo: Get the action keys loaded by dbReader so we reload only these in cache diff --git a/engine/lcr.go b/engine/lcr.go index e8bc0ba03..9bdd4f54c 100644 --- a/engine/lcr.go +++ b/engine/lcr.go @@ -229,7 +229,13 @@ func (qoss QOSSorter) Swap(i, j int) { } func (qoss QOSSorter) Less(i, j int) bool { - //for _, param := range qoss[i].qosSortParams - //qoss[i].Cost > qoss[j].Cost + for _, param := range qoss[i].qosSortParams { + if qoss[i].QOS[param] < qoss[j].QOS[param] { + return true + } + if qoss[i].QOS[param] == qoss[j].QOS[param] { + continue + } + } return false } diff --git a/engine/lcr_test.go b/engine/lcr_test.go index c17b24b37..cf4837ac7 100644 --- a/engine/lcr_test.go +++ b/engine/lcr_test.go @@ -17,3 +17,72 @@ along with this program. If not, see */ package engine + +import ( + "sort" + "testing" +) + +func TestLcrQOSSorter(t *testing.T) { + s := QOSSorter{ + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 3, + "ACD": 3, + }, + qosSortParams: []string{ASR, ACD}, + }, + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 1, + "ACD": 1, + }, + qosSortParams: []string{ASR, ACD}, + }, + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 2, + "ACD": 2, + }, + qosSortParams: []string{ASR, ACD}, + }, + } + sort.Sort(s) + if s[0].QOS[ASR] != 1 || + s[1].QOS[ASR] != 2 || + s[2].QOS[ASR] != 3 { + t.Error("Lcr qos sort failed: ", s) + } +} + +func TestLcrQOSSorterOACD(t *testing.T) { + s := QOSSorter{ + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 1, + "ACD": 3, + }, + qosSortParams: []string{ASR, ACD}, + }, + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 1, + "ACD": 1, + }, + qosSortParams: []string{ASR, ACD}, + }, + &LCRSupplierCost{ + QOS: map[string]float64{ + "ASR": 1, + "ACD": 2, + }, + qosSortParams: []string{ASR, ACD}, + }, + } + sort.Sort(s) + if s[0].QOS[ACD] != 1 || + s[1].QOS[ACD] != 2 || + s[2].QOS[ACD] != 3 { + t.Error("Lcr qos sort failed: ", s) + } +} diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 1a93ac91a..db8b01a8a 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -108,10 +108,10 @@ func (s *Scheduler) LoadActionTimings(storage engine.AccountingStorage) { newAts = append(newAts, at) } if toBeSaved { - engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { + engine.AccLock.Guard(func() (float64, error) { storage.SetActionTimings(key, newAts) return 0, nil - }) + }, engine.ACTION_TIMING_PREFIX) } } sort.Sort(s.queue)