From 23bf64e8197508bf958c9ae04d5ccbd2beb5565b Mon Sep 17 00:00:00 2001 From: Radu Ioan Fericean Date: Mon, 20 Feb 2012 22:03:55 +0200 Subject: [PATCH] user budget sone and redis back on speed --- cmd/loader/loader.go | 30 ++++++++++-- timespans/kyoto_storage.go | 11 +++++ timespans/mongo_storage.go | 32 +++++++++---- timespans/redis_storage.go | 25 +++++++--- timespans/storage_interface.go | 2 + timespans/test.kch | Bin 6298288 -> 6298536 bytes timespans/test_userbudgets.json | 4 ++ timespans/userbudget_test.go | 80 ++++++++++++++++++++++++++++++++ 8 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 timespans/test_userbudgets.json diff --git a/cmd/loader/loader.go b/cmd/loader/loader.go index da0ea3e84..71b32d416 100644 --- a/cmd/loader/loader.go +++ b/cmd/loader/loader.go @@ -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) } } diff --git a/timespans/kyoto_storage.go b/timespans/kyoto_storage.go index 27a14cde6..91ee9499a 100644 --- a/timespans/kyoto_storage.go +++ b/timespans/kyoto_storage.go @@ -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()) +} diff --git a/timespans/mongo_storage.go b/timespans/mongo_storage.go index 5ffa73c08..6274046f9 100644 --- a/timespans/mongo_storage.go +++ b/timespans/mongo_storage.go @@ -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) +} diff --git a/timespans/redis_storage.go b/timespans/redis_storage.go index 673754642..4c024f284 100644 --- a/timespans/redis_storage.go +++ b/timespans/redis_storage.go @@ -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()) +} diff --git a/timespans/storage_interface.go b/timespans/storage_interface.go index 6463ec21e..a542697a1 100644 --- a/timespans/storage_interface.go +++ b/timespans/storage_interface.go @@ -11,4 +11,6 @@ type StorageGetter interface { SetDestination(*Destination) GetTariffPlan(string) (*TariffPlan, error) SetTariffPlan(*TariffPlan) + GetUserBudget(string) (*UserBudget, error) + SetUserBudget(*UserBudget) } diff --git a/timespans/test.kch b/timespans/test.kch index f17fec49cf270f5482338f5b1fc749764ef610d5..24026e9b13232879cbba1c96f383bb2abd61850d 100644 GIT binary patch delta 642 zcmZY6%TE(g6vy$>nSxVMP<&EfyhO2(dj@FJbm8C|w6H-`KxDKvPEtxTsSA=xgvCu= z>dG}cmb#cUQ5SABF8Vk4Cy;dE-tUmq)HuoK+{``a-ux!>G2Axx>f6S%&X_d7nDN|~niAKDAK4EQaKKIIP6aV(jr0*7A zM{PAVJ!xn5V~s@nc`G+o^ftUo$*sDgqF5>r6{ra%!QUj&t_p0n1HV))x%ntZ><=1= B(1-v4 delta 418 zcmZwCxlRIM7=>X6LV+kKpsa4lsz5T0go+>cZKObU5aJ~eNq`CpGOd)9bd)rci8tdt za0kAYg!z&u`Esgr7W&A%)JEp-nANiNe;xmFEKg)flTDw~v6u)+6Q<(YrwQq2rmhq# zwqe5#c43DDd)S8)F1T@kLwMkY4}Js?#1W2hf>WF!gmZ)uK@>5>k-!Bmkwi*gDe2$5 zacQF=Mj7M!Lp9sYK_HK7+~5{>xW@w?@q}l*;1vqq^lZ0q^|e`~mryhFca%^@1y$5g PM*~f?@S$hs?ZMy=`Fp5~ diff --git a/timespans/test_userbudgets.json b/timespans/test_userbudgets.json new file mode 100644 index 000000000..815ffc85e --- /dev/null +++ b/timespans/test_userbudgets.json @@ -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"}]} +] diff --git a/timespans/userbudget_test.go b/timespans/userbudget_test.go index 1d4da5e74..3896f2eca 100644 --- a/timespans/userbudget_test.go +++ b/timespans/userbudget_test.go @@ -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) + } +}