diff --git a/balancer/balancer_test.go b/balancer/balancer_test.go index 7b6ac2716..9c1517b0a 100644 --- a/balancer/balancer_test.go +++ b/balancer/balancer_test.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package balancer import ( diff --git a/cmd/cgr-console/cgr-console.go b/cmd/cgr-console/cgr-console.go index 81a631a3e..4f16929ac 100644 --- a/cmd/cgr-console/cgr-console.go +++ b/cmd/cgr-console/cgr-console.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( diff --git a/cmd/cgr-loader/actions.go b/cmd/cgr-loader/actions.go index 89fd683c7..1f77bcc5d 100644 --- a/cmd/cgr-loader/actions.go +++ b/cmd/cgr-loader/actions.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( @@ -185,7 +186,7 @@ func loadAccountActions() { if record[0] == "Tenant" { continue } - tag := fmt.Sprintf("%s:%s:%s", record[0], record[1], record[2]) + tag := fmt.Sprintf("%s:%s:%s", record[2], record[0], record[1]) aTriggers, exists := actionsTriggers[record[4]] if !exists { log.Printf("Could not get action triggers for tag %v", record[4]) diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go index 7f25408ba..74bcd66b6 100644 --- a/cmd/cgr-loader/cgr-loader.go +++ b/cmd/cgr-loader/cgr-loader.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( @@ -60,7 +61,7 @@ func writeToDatabase() { // rating profiles for _, cds := range ratingProfiles { for _, cd := range cds { - storage.SetActivationPeriodsOrFallback(cd.GetKey(), cd.ActivationPeriods, cd.FallbackKey) + err = storage.SetActivationPeriodsOrFallback(cd.GetKey(), cd.ActivationPeriods, cd.FallbackKey) log.Print(cd.GetKey()) } } diff --git a/cmd/cgr-loader/rates.go b/cmd/cgr-loader/rates.go index ed975a53d..eb180698d 100644 --- a/cmd/cgr-loader/rates.go +++ b/cmd/cgr-loader/rates.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( diff --git a/cmd/stress/cgr-balancerstress/cgr-balancerstress.go b/cmd/stress/cgr-balancerstress/cgr-balancerstress.go index 8813f4897..f67739400 100644 --- a/cmd/stress/cgr-balancerstress/cgr-balancerstress.go +++ b/cmd/stress/cgr-balancerstress/cgr-balancerstress.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( diff --git a/cmd/stress/cgr-raterstress/cgr-raterstress.go b/cmd/stress/cgr-raterstress/cgr-raterstress.go index bca38e3fc..6c7c40690 100644 --- a/cmd/stress/cgr-raterstress/cgr-raterstress.go +++ b/cmd/stress/cgr-raterstress/cgr-raterstress.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( @@ -26,10 +27,9 @@ import ( ) var ( - runs = flag.Int("runs", 10000, "stress cycle number") + runs = flag.Int("runs", 10000, "stress cycle number") ) - func main() { flag.Parse() t1 := time.Date(2012, time.February, 02, 17, 30, 0, 0, time.UTC) diff --git a/cmd/stress/cgr-spansstress/cgr-spansstress.go b/cmd/stress/cgr-spansstress/cgr-spansstress.go index 796214695..e58e445a2 100644 --- a/cmd/stress/cgr-spansstress/cgr-spansstress.go +++ b/cmd/stress/cgr-spansstress/cgr-spansstress.go @@ -15,6 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see */ + package main import ( @@ -65,7 +66,7 @@ func main() { log.Print(result, j, err) memstats := new(runtime.MemStats) - runtime.ReadMemStats(memstats) - log.Printf("memstats before GC: Kbytes = %d footprint = %d", + runtime.ReadMemStats(memstats) + log.Printf("memstats before GC: Kbytes = %d footprint = %d", memstats.HeapAlloc/1024, memstats.Sys/1024) } diff --git a/timespans/actions.go b/timespans/actions.go index c45b83110..fbba7f3e2 100644 --- a/timespans/actions.go +++ b/timespans/actions.go @@ -84,6 +84,7 @@ var ( "CHANGE_TO_PREPAID": changeToPrepaidAction, "TOPUP_RESET": topupResetAction, "TOPUP_ADD": topupAddAction, + "DEBIT": debitAction, } ) @@ -108,11 +109,16 @@ func changeToPrepaidAction(ub *UserBalance, a *Action) (err error) { } func topupResetAction(ub *UserBalance, a *Action) (err error) { - - return + ub.BalanceMap[a.BalanceId] = a.Units + return storageGetter.SetUserBalance(ub) } func topupAddAction(ub *UserBalance, a *Action) (err error) { + ub.BalanceMap[a.BalanceId] += a.Units + return storageGetter.SetUserBalance(ub) +} + +func debitAction(ub *UserBalance, a *Action) (err error) { return } diff --git a/timespans/callcost_test.go b/timespans/callcost_test.go index 93b1f7968..d951318ae 100644 --- a/timespans/callcost_test.go +++ b/timespans/callcost_test.go @@ -25,7 +25,7 @@ import ( ) func init() { - sg, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) + sg, _ := NewRedixStorage("tcp:127.0.0.1:6379", 10) SetStorageGetter(sg) } @@ -78,8 +78,6 @@ func TestMultipleResultMerge(t *testing.T) { } func TestMultipleInputLeftMerge(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() t1 := time.Date(2012, time.February, 2, 17, 59, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 18, 01, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} @@ -104,8 +102,6 @@ func TestMultipleInputLeftMerge(t *testing.T) { } func TestMultipleInputRightMerge(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() t1 := time.Date(2012, time.February, 2, 17, 58, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 17, 59, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} diff --git a/timespans/calldesc_test.go b/timespans/calldesc_test.go index 26ba213d1..d5f8abe5e 100644 --- a/timespans/calldesc_test.go +++ b/timespans/calldesc_test.go @@ -24,19 +24,13 @@ import ( //"log" ) -/* -json -BenchmarkRedisGetCost 5000 462787 ns/op -BenchmarkKyotoGetCost 10000 203543 ns/op - -gob -BenchmarkRedisGetCost 10000 258751 ns/op -BenchmarkKyotoGetCost 50000 38449 ns/op -*/ +var ( + getter StorageGetter +) func init() { - sg, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - SetStorageGetter(sg) + getter, _ = NewRedisStorage("tcp:127.0.0.1:6379", 10) + SetStorageGetter(getter) } func TestSplitSpans(t *testing.T) { @@ -116,9 +110,6 @@ func TestMultipleActivationPeriods(t *testing.T) { } func TestSpansMultipleActivationPeriods(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 7, 23, 50, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 8, 0, 30, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0257308200", TimeStart: t1, TimeEnd: t2} @@ -130,9 +121,6 @@ func TestSpansMultipleActivationPeriods(t *testing.T) { } func TestLessThanAMinute(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 8, 23, 50, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 8, 23, 50, 30, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0257308200", TimeStart: t1, TimeEnd: t2} @@ -144,9 +132,6 @@ func TestLessThanAMinute(t *testing.T) { } func TestUniquePrice(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 8, 22, 50, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 8, 23, 50, 21, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0723045326", TimeStart: t1, TimeEnd: t2} @@ -158,9 +143,6 @@ func TestUniquePrice(t *testing.T) { } func TestPresentSecodCost(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 8, 22, 50, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 8, 23, 50, 21, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0723", TimeStart: t1, TimeEnd: t2} @@ -172,9 +154,6 @@ func TestPresentSecodCost(t *testing.T) { } func TestMinutesCost(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 8, 22, 50, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 8, 22, 51, 50, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "minutosu", Destination: "0723", TimeStart: t1, TimeEnd: t2} @@ -187,8 +166,6 @@ func TestMinutesCost(t *testing.T) { } func TestMaxSessionTimeNoUserBalance(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0723", Amount: 1000} result, err := cd.GetMaxSessionTime() if result != 1000 || err != nil { @@ -197,8 +174,6 @@ func TestMaxSessionTimeNoUserBalance(t *testing.T) { } func TestMaxSessionTimeWithUserBalance(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() cd := &CallDescriptor{Tenant: "vdf", Subject: "minutosu", Destination: "0723", Amount: 5400} result, err := cd.GetMaxSessionTime() if result != 1080 || err != nil { @@ -207,8 +182,6 @@ func TestMaxSessionTimeWithUserBalance(t *testing.T) { } func TestMaxSessionTimeNoCredit(t *testing.T) { - getter, _ := NewRedisStorage("tcp:127.0.0.1:6379", 10) - defer getter.Close() cd := &CallDescriptor{Tenant: "vdf", Subject: "broker", Destination: "0723", Amount: 5400} result, err := cd.GetMaxSessionTime() if result != 100 || err != nil { @@ -236,9 +209,6 @@ func TestMaxSessionTimeNoCredit(t *testing.T) { /*********************************** BENCHMARKS ***************************************/ func BenchmarkRedisGetting(b *testing.B) { b.StopTimer() - getter, _ := NewRedisStorage("", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 2, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 18, 30, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} @@ -250,9 +220,6 @@ func BenchmarkRedisGetting(b *testing.B) { func BenchmarkRedisRestoring(b *testing.B) { b.StopTimer() - getter, _ := NewRedisStorage("", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 2, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 18, 30, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} @@ -264,9 +231,6 @@ func BenchmarkRedisRestoring(b *testing.B) { func BenchmarkRedisGetCost(b *testing.B) { b.StopTimer() - getter, _ := NewRedisStorage("", 10) - defer getter.Close() - t1 := time.Date(2012, time.February, 2, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 18, 30, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} @@ -278,7 +242,6 @@ func BenchmarkRedisGetCost(b *testing.B) { func BenchmarkSplitting(b *testing.B) { b.StopTimer() - t1 := time.Date(2012, time.February, 2, 17, 30, 0, 0, time.UTC) t2 := time.Date(2012, time.February, 2, 18, 30, 0, 0, time.UTC) cd := &CallDescriptor{Tenant: "vdf", Subject: "rif", Destination: "0256", TimeStart: t1, TimeEnd: t2} @@ -291,8 +254,6 @@ func BenchmarkSplitting(b *testing.B) { func BenchmarkRedisSingleGetSessionTime(b *testing.B) { b.StopTimer() - getter, _ := NewRedisStorage("", 10) - defer getter.Close() cd := &CallDescriptor{Tenant: "vdf", Subject: "minutosu", Destination: "0723", Amount: 100} b.StartTimer() for i := 0; i < b.N; i++ { @@ -302,8 +263,6 @@ func BenchmarkRedisSingleGetSessionTime(b *testing.B) { func BenchmarkRedisMultipleGetSessionTime(b *testing.B) { b.StopTimer() - getter, _ := NewRedisStorage("", 10) - defer getter.Close() cd := &CallDescriptor{Tenant: "vdf", Subject: "minutosu", Destination: "0723", Amount: 5400} b.StartTimer() for i := 0; i < b.N; i++ { diff --git a/timespans/storage_redis.go b/timespans/storage_redis.go index 4690adb0c..4294ba2e9 100644 --- a/timespans/storage_redis.go +++ b/timespans/storage_redis.go @@ -19,8 +19,10 @@ along with this program. If not, see package timespans import ( - "github.com/simonz05/godis" + // "bytes" + // "encoding/gob" "encoding/json" + "github.com/simonz05/godis" ) const ( @@ -30,6 +32,7 @@ const ( type RedisStorage struct { dbNb int db *godis.Client + //net bytes.Buffer } func NewRedisStorage(address string, db int) (*RedisStorage, error) { @@ -51,8 +54,12 @@ func (rs *RedisStorage) GetActivationPeriodsOrFallback(key string) (aps []*Activ if err != nil { return } + // rs.net.Reset() + // rs.net.Write(elem) + // err = gob.NewDecoder(&rs.net).Decode(&aps) err = json.Unmarshal(elem, &aps) if err != nil { + // err = gob.NewDecoder(&rs.net).Decode(&fallbackKey) err = json.Unmarshal(elem, &fallbackKey) } return @@ -61,11 +68,15 @@ func (rs *RedisStorage) GetActivationPeriodsOrFallback(key string) (aps []*Activ func (rs *RedisStorage) SetActivationPeriodsOrFallback(key string, aps []*ActivationPeriod, fallbackKey string) (err error) { //.db.Select(rs.dbNb) var result []byte + //rs.net.Reset() if len(aps) > 0 { + //gob.NewEncoder(&rs.net).Encode(aps) result, err = json.Marshal(aps) } else { + //gob.NewEncoder(&rs.net).Encode(fallbackKey) result, err = json.Marshal(fallbackKey) } + //result = rs.net.Bytes() return rs.db.Set(key, result) } diff --git a/timespans/storage_redix.go b/timespans/storage_redix.go new file mode 100644 index 000000000..a4144afeb --- /dev/null +++ b/timespans/storage_redix.go @@ -0,0 +1,145 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2012 Radu Ioan Fericean + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package timespans + +import ( + "github.com/fzzbt/radix/redis" + "encoding/json" + // "encoding/gob" + // "bytes" + "log" +) + +type RedixStorage struct { + db *redis.Client + //net bytes.Buffer +} + +func NewRedixStorage(address string, db int) (*RedixStorage, error) { + ndb, err := redis.NewClient(redis.Configuration{Address: address, Database: db}) + if err != nil { + log.Fatalf("Could not connect to redis server: %v", err) + } + return &RedixStorage{db: ndb}, nil +} + +func (rs *RedixStorage) Close() { + rs.db.Close() +} + +func (rs *RedixStorage) Flush() error { + rs.db.Flushdb() + return nil +} + +func (rs *RedixStorage) GetActivationPeriodsOrFallback(key string) (aps []*ActivationPeriod, fallbackKey string, err error) { + elem, err := rs.db.Get(key).Bytes() + if err != nil { + return + } + //rs.net.Reset() + //rs.net.Write(elem) + //err = gob.NewDecoder(&rs.net).Decode(&aps) + err = json.Unmarshal(elem, &aps) + if err != nil { + //err = gob.NewDecoder(&rs.net).Decode(&fallbackKey) + err = json.Unmarshal(elem, &fallbackKey) + } + return +} + +func (rs *RedixStorage) SetActivationPeriodsOrFallback(key string, aps []*ActivationPeriod, fallbackKey string) (err error) { + var result []byte + //rs.net.Reset() + if len(aps) > 0 { + //gob.NewEncoder(&rs.net).Encode(aps) + result, err = json.Marshal(aps) + } else { + //gob.NewEncoder(&rs.net).Encode(fallbackKey) + result, err = json.Marshal(fallbackKey) + } + //result = rs.net.Bytes() + return rs.db.Set(key, result).Err +} + +func (rs *RedixStorage) GetDestination(key string) (dest *Destination, err error) { + if values, err := rs.db.Get(key).Bytes(); err == nil { + dest = &Destination{Id: key} + err = json.Unmarshal(values, dest) + } + return +} +func (rs *RedixStorage) SetDestination(dest *Destination) (err error) { + result, err := json.Marshal(dest) + return rs.db.Set(dest.Id, result).Err +} + +func (rs *RedixStorage) GetActions(key string) (as []*Action, err error) { + if values, err := rs.db.Get(key).Bytes(); err == nil { + err = json.Unmarshal(values, as) + } + return +} + +func (rs *RedixStorage) SetActions(key string, as []*Action) (err error) { + result, err := json.Marshal(as) + return rs.db.Set(key, result).Err +} + +func (rs *RedixStorage) GetUserBalance(key string) (ub *UserBalance, err error) { + if values, err := rs.db.Get(key).Bytes(); err == nil { + ub = &UserBalance{Id: key} + err = json.Unmarshal(values, ub) + } + return +} + +func (rs *RedixStorage) SetUserBalance(ub *UserBalance) (err error) { + result, err := json.Marshal(ub) + return rs.db.Set(ub.Id, result).Err +} + +func (rs *RedixStorage) GetActionTimings(key string) (ats []*ActionTiming, err error) { + if values, err := rs.db.Get(key).Bytes(); err == nil { + err = json.Unmarshal(values, ats) + } + return +} + +func (rs *RedixStorage) SetActionTimings(key string, ats []*ActionTiming) (err error) { + result, err := json.Marshal(ats) + return rs.db.Set(key, result).Err +} + +func (rs *RedixStorage) GetAllActionTimings() (ats []*ActionTiming, err error) { + keys, err := rs.db.Keys(ACTION_TIMING_PREFIX + "*").List() + if err != nil { + return + } + values, err := rs.db.Mget(keys).List() + if err != nil { + return + } + for _, v := range values { + var tempAts []*ActionTiming + err = json.Unmarshal([]byte(v), &tempAts) + ats = append(ats, tempAts...) + } + return +}