mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
user budget sone and redis back on speed
This commit is contained in:
@@ -19,12 +19,14 @@ var (
|
||||
apfile = flag.String("apfile", "ap.json", "Activation Periods containing intervals file")
|
||||
destfile = flag.String("destfile", "dest.json", "Destinations file")
|
||||
tpfile = flag.String("tpfile", "tp.json", "Tariff plans file")
|
||||
ubfile = flag.String("ubfile", "ub.json", "User budgets file")
|
||||
)
|
||||
|
||||
func writeToStorage(storage timespans.StorageGetter,
|
||||
callDescriptors []*timespans.CallDescriptor,
|
||||
destinations []*timespans.Destination,
|
||||
tariffPlans []*timespans.TariffPlan) {
|
||||
tariffPlans []*timespans.TariffPlan,
|
||||
userBudgets []*timespans.UserBudget) {
|
||||
for _, cd := range callDescriptors {
|
||||
storage.SetActivationPeriods(cd.GetKey(), cd.ActivationPeriods)
|
||||
log.Printf("Storing %q", cd.GetKey())
|
||||
@@ -37,6 +39,10 @@ func writeToStorage(storage timespans.StorageGetter,
|
||||
storage.SetTariffPlan(tp)
|
||||
log.Printf("Storing %q", tp.Id)
|
||||
}
|
||||
for _, ub := range userBudgets {
|
||||
storage.SetUserBudget(ub)
|
||||
log.Printf("Storing %q", ub.Id)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
@@ -92,19 +98,35 @@ func main() {
|
||||
}
|
||||
fin.Close()
|
||||
|
||||
// reading user budgets
|
||||
fin, err = os.Open(*ubfile)
|
||||
|
||||
if err != nil {
|
||||
log.Print("Cannot open user budgets input file", err)
|
||||
}
|
||||
|
||||
dec = json.NewDecoder(fin)
|
||||
|
||||
var userBudgets []*timespans.UserBudget
|
||||
if err := dec.Decode(&userBudgets); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
fin.Close()
|
||||
|
||||
switch *storage {
|
||||
case "kyoto":
|
||||
storage, _ := timespans.NewKyotoStorage(*kyotofile)
|
||||
defer storage.Close()
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans)
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans, userBudgets)
|
||||
case "mongo":
|
||||
storage, _ := timespans.NewMongoStorage("127.0.0.1", "test")
|
||||
defer storage.Close()
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans)
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans, userBudgets)
|
||||
|
||||
default:
|
||||
storage, _ := timespans.NewRedisStorage(*redisserver, *redisdb)
|
||||
defer storage.Close()
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans)
|
||||
writeToStorage(storage, callDescriptors, destinations, tariffPlans, userBudgets)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,3 +62,14 @@ func (ks *KyotoStorage) GetTariffPlan(key string) (tp *TariffPlan, err error) {
|
||||
func (ks *KyotoStorage) SetTariffPlan(tp *TariffPlan) {
|
||||
ks.db.Set(tp.Id, tp.store())
|
||||
}
|
||||
|
||||
func (ks *KyotoStorage) GetUserBudget(key string) (ub *UserBudget, err error) {
|
||||
values, err := ks.db.Get(key)
|
||||
ub = &UserBudget{Id: key}
|
||||
ub.restore(values)
|
||||
return
|
||||
}
|
||||
|
||||
func (ks *KyotoStorage) SetUserBudget(ub *UserBudget) {
|
||||
ks.db.Set(ub.Id, ub.store())
|
||||
}
|
||||
|
||||
@@ -23,11 +23,11 @@ func NewMongoStorage(address, db string) (*MongoStorage, error) {
|
||||
session.SetMode(mgo.Monotonic, true)
|
||||
|
||||
index := mgo.Index{Key: []string{"key"}, Unique: true, DropDups: true, Background: true}
|
||||
err = session.DB(db).C("ap").EnsureIndex(index)
|
||||
err = session.DB(db).C("activationPeriods").EnsureIndex(index)
|
||||
index = mgo.Index{Key: []string{"id"}, Unique: true, DropDups: true, Background: true}
|
||||
err = session.DB(db).C("dest").EnsureIndex(index)
|
||||
index = mgo.Index{Key: []string{"id"}, Unique: true, DropDups: true, Background: true}
|
||||
err = session.DB(db).C("tp").EnsureIndex(index)
|
||||
err = session.DB(db).C("destinations").EnsureIndex(index)
|
||||
err = session.DB(db).C("tariffPlans").EnsureIndex(index)
|
||||
err = session.DB(db).C("userBudget").EnsureIndex(index)
|
||||
|
||||
return &MongoStorage{db: session.DB(db), session: session}, nil
|
||||
}
|
||||
@@ -37,37 +37,49 @@ func (ms *MongoStorage) Close() {
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetActivationPeriods(key string) (aps []*ActivationPeriod, err error) {
|
||||
ndb := ms.db.C("ap")
|
||||
ndb := ms.db.C("activationPeriods")
|
||||
result := KeyValue{}
|
||||
err = ndb.Find(bson.M{"key": key}).One(&result)
|
||||
return result.ActivationPeriods, err
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) SetActivationPeriods(key string, aps []*ActivationPeriod) {
|
||||
ndb := ms.db.C("ap")
|
||||
ndb := ms.db.C("activationPeriods")
|
||||
ndb.Insert(&KeyValue{key, aps})
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetDestination(key string) (result *Destination, err error) {
|
||||
ndb := ms.db.C("dest")
|
||||
ndb := ms.db.C("destinations")
|
||||
result = &Destination{}
|
||||
err = ndb.Find(bson.M{"id": key}).One(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) SetDestination(dest *Destination) {
|
||||
ndb := ms.db.C("dest")
|
||||
ndb := ms.db.C("destinations")
|
||||
ndb.Insert(&dest)
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetTariffPlan(key string) (result *TariffPlan, err error) {
|
||||
ndb := ms.db.C("tp")
|
||||
ndb := ms.db.C("tariffPlans")
|
||||
result = &TariffPlan{}
|
||||
err = ndb.Find(bson.M{"id": key}).One(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) SetTariffPlan(tp *TariffPlan) {
|
||||
ndb := ms.db.C("tp")
|
||||
ndb := ms.db.C("tariffPlans")
|
||||
ndb.Insert(&tp)
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) GetUserBudget(key string) (result *UserBudget, err error) {
|
||||
ndb := ms.db.C("userBudget")
|
||||
result = &UserBudget{}
|
||||
err = ndb.Find(bson.M{"id": key}).One(result)
|
||||
return
|
||||
}
|
||||
|
||||
func (ms *MongoStorage) SetUserBudget(ub *UserBudget) {
|
||||
ndb := ms.db.C("userBudget")
|
||||
ndb.Insert(&ub)
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func (rs *RedisStorage) Close() {
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetActivationPeriods(key string) (aps []*ActivationPeriod, err error) {
|
||||
rs.db.Select(rs.dbNb)
|
||||
//rs.db.Select(rs.dbNb)
|
||||
elem, err := rs.db.Get(key)
|
||||
values := elem.String()
|
||||
if err == nil {
|
||||
@@ -36,7 +36,7 @@ func (rs *RedisStorage) GetActivationPeriods(key string) (aps []*ActivationPerio
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) SetActivationPeriods(key string, aps []*ActivationPeriod) {
|
||||
rs.db.Select(rs.dbNb)
|
||||
//.db.Select(rs.dbNb)
|
||||
result := ""
|
||||
for _, ap := range aps {
|
||||
result += ap.store() + "\n"
|
||||
@@ -45,7 +45,7 @@ func (rs *RedisStorage) SetActivationPeriods(key string, aps []*ActivationPeriod
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetDestination(key string) (dest *Destination, err error) {
|
||||
rs.db.Select(rs.dbNb + 1)
|
||||
//rs.db.Select(rs.dbNb + 1)
|
||||
values, err := rs.db.Get(key)
|
||||
dest = &Destination{Id: key}
|
||||
dest.restore(values.String())
|
||||
@@ -53,12 +53,12 @@ func (rs *RedisStorage) GetDestination(key string) (dest *Destination, err error
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) SetDestination(dest *Destination) {
|
||||
rs.db.Select(rs.dbNb + 1)
|
||||
//rs.db.Select(rs.dbNb + 1)
|
||||
rs.db.Set(dest.Id, dest.store())
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetTariffPlan(key string) (tp *TariffPlan, err error) {
|
||||
rs.db.Select(rs.dbNb + 2)
|
||||
//rs.db.Select(rs.dbNb + 2)
|
||||
values, err := rs.db.Get(key)
|
||||
tp = &TariffPlan{Id: key}
|
||||
tp.restore(values.String())
|
||||
@@ -66,6 +66,19 @@ func (rs *RedisStorage) GetTariffPlan(key string) (tp *TariffPlan, err error) {
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) SetTariffPlan(tp *TariffPlan) {
|
||||
rs.db.Select(rs.dbNb + 2)
|
||||
//rs.db.Select(rs.dbNb + 2)
|
||||
rs.db.Set(tp.Id, tp.store())
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) GetUserBudget(key string) (ub *UserBudget, err error) {
|
||||
//rs.db.Select(rs.dbNb + 3)
|
||||
values, err := rs.db.Get(key)
|
||||
ub = &UserBudget{Id: key}
|
||||
ub.restore(values.String())
|
||||
return
|
||||
}
|
||||
|
||||
func (rs *RedisStorage) SetUserBudget(ub *UserBudget) {
|
||||
//rs.db.Select(rs.dbNb + 3)
|
||||
rs.db.Set(ub.Id, ub.store())
|
||||
}
|
||||
|
||||
@@ -11,4 +11,6 @@ type StorageGetter interface {
|
||||
SetDestination(*Destination)
|
||||
GetTariffPlan(string) (*TariffPlan, error)
|
||||
SetTariffPlan(*TariffPlan)
|
||||
GetUserBudget(string) (*UserBudget, error)
|
||||
SetUserBudget(*UserBudget)
|
||||
}
|
||||
|
||||
Binary file not shown.
4
timespans/test_userbudgets.json
Normal file
4
timespans/test_userbudgets.json
Normal file
@@ -0,0 +1,4 @@
|
||||
[
|
||||
{"Id":"rif","Credit":21,"SmsCredit":0,"ResetDayOfTheMonth":10,"TariffPlanId":"","MinuteBuckets": [{"Seconds":10,"Priority":10,"Price":0.01,"DestinationId":"nationale"},
|
||||
{"Seconds":100,"Priority":20,"Price":0,"DestinationId":"retea"}]}
|
||||
]
|
||||
@@ -49,6 +49,47 @@ func TestUserBudgetStoreRestore(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBudgetKyotoStore(t *testing.T) {
|
||||
getter, _ := NewKyotoStorage("test.kch")
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
result, _ := getter.GetUserBudget(rifsBudget.Id)
|
||||
if result.SmsCredit != rifsBudget.SmsCredit || len(result.MinuteBuckets) != len(rifsBudget.MinuteBuckets) {
|
||||
t.Errorf("Expected %q was %q", rifsBudget, result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBudgetRedisStore(t *testing.T) {
|
||||
getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10)
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
result, _ := getter.GetUserBudget(rifsBudget.Id)
|
||||
if result.SmsCredit != rifsBudget.SmsCredit || len(result.MinuteBuckets) != len(rifsBudget.MinuteBuckets) {
|
||||
t.Errorf("Expected %q was %q", rifsBudget, result)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBudgetMongoStore(t *testing.T) {
|
||||
getter, _ := NewMongoStorage("127.0.0.1", "test")
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
result, _ := getter.GetUserBudget(rifsBudget.Id)
|
||||
if result.SmsCredit != rifsBudget.SmsCredit || len(result.MinuteBuckets) != len(rifsBudget.MinuteBuckets) {
|
||||
t.Errorf("Expected %q was %q", rifsBudget, result)
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************** Benchmarks *******************************/
|
||||
|
||||
@@ -64,3 +105,42 @@ func BenchmarkGetSecondForPrefix(b *testing.B) {
|
||||
ub1.GetSecondsForPrefix(nil, "0723")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkUserBudgetKyotoStoreRestore(b *testing.B) {
|
||||
getter, _ := NewKyotoStorage("test.kch")
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
for i := 0; i < b.N; i++ {
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
getter.GetUserBudget(rifsBudget.Id)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkUserBudgetRedisStoreRestore(b *testing.B) {
|
||||
getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10)
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
for i := 0; i < b.N; i++ {
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
getter.GetUserBudget(rifsBudget.Id)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkUserBudgetMongoStoreRestore(b *testing.B) {
|
||||
getter, _ := NewMongoStorage("127.0.0.1", "test")
|
||||
defer getter.Close()
|
||||
b1 := &MinuteBucket{Seconds: 10, Priority: 10, Price: 0.01, DestinationId: "nationale"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Priority: 20, Price: 0.0, DestinationId: "retea"}
|
||||
seara := &TariffPlan{Id: "seara", SmsCredit: 100, MinuteBuckets: []*MinuteBucket{b1, b2}}
|
||||
rifsBudget := &UserBudget{Id: "rif", MinuteBuckets: []*MinuteBucket{b1, b2}, Credit: 21, tariffPlan: seara, ResetDayOfTheMonth: 10}
|
||||
for i := 0; i < b.N; i++ {
|
||||
getter.SetUserBudget(rifsBudget)
|
||||
getter.GetUserBudget(rifsBudget.Id)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user