From 2643523787c947a7a4a25aa7ff1d202e2d2fcb27 Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 16 Nov 2015 13:36:41 +0100 Subject: [PATCH] Modified redis to handle auth and select per connection in the pool, added maxConns parameter in constructor --- engine/calldesc.go | 4 ++-- engine/storage_redis.go | 38 +++++++++++++++++------------- engine/storage_redis_local_test.go | 2 +- engine/storage_utils.go | 4 ++-- utils/consts.go | 1 + 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/engine/calldesc.go b/engine/calldesc.go index c37da1bf1..31290a67f 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -56,11 +56,11 @@ func init() { log.Fatal(err) } case "redis": - ratingStorage, _ = NewRedisStorage("127.0.0.1:6379", 12, "", utils.MSGPACK) + ratingStorage, _ = NewRedisStorage("127.0.0.1:6379", 12, "", utils.MSGPACK, utils.REDIS_MAX_CONNS) if err != nil { log.Fatal(err) } - accountingStorage, _ = NewRedisStorage("127.0.0.1:6379", 13, "", utils.MSGPACK) + accountingStorage, _ = NewRedisStorage("127.0.0.1:6379", 13, "", utils.MSGPACK, utils.REDIS_MAX_CONNS) if err != nil { log.Fatal(err) } diff --git a/engine/storage_redis.go b/engine/storage_redis.go index 2395ae7d9..9c85221d5 100644 --- a/engine/storage_redis.go +++ b/engine/storage_redis.go @@ -28,6 +28,7 @@ import ( "github.com/cgrates/cgrates/cache2go" "github.com/cgrates/cgrates/utils" "github.com/mediocregopher/radix.v2/pool" + "github.com/mediocregopher/radix.v2/redis" "io/ioutil" "time" @@ -38,24 +39,29 @@ type RedisStorage struct { ms Marshaler } -func NewRedisStorage(address string, db int, pass, mrshlerStr string) (*RedisStorage, error) { - p, err := pool.New("tcp", address, 10) - //p, err := redis.Dial("tcp", address) - if err != nil { - return nil, err - } - conn, err := p.Get() - if err != nil { - return nil, err - } - defer p.Put(conn) - if err := conn.Cmd("SELECT", db).Err; err != nil { - return nil, err - } - if pass != "" { - if err := conn.Cmd("AUTH", pass).Err; err != nil { +func NewRedisStorage(address string, db int, pass, mrshlerStr string, maxConns int) (*RedisStorage, error) { + df := func(network, addr string) (*redis.Client, error) { + client, err := redis.Dial(network, addr) + if err != nil { return nil, err } + if len(pass) != 0 { + if err = client.Cmd("AUTH", pass).Err; err != nil { + client.Close() + return nil, err + } + } + if db != 0 { + if err = client.Cmd("SELECT", db).Err; err != nil { + client.Close() + return nil, err + } + } + return client, nil + } + p, err := pool.NewCustom("tcp", address, maxConns, df) + if err != nil { + return nil, err } var mrshler Marshaler if mrshlerStr == utils.MSGPACK { diff --git a/engine/storage_redis_local_test.go b/engine/storage_redis_local_test.go index 5a977bf6d..b4c43b05e 100644 --- a/engine/storage_redis_local_test.go +++ b/engine/storage_redis_local_test.go @@ -35,7 +35,7 @@ func TestConnectRedis(t *testing.T) { return } cfg, _ := config.NewDefaultCGRConfig() - rds, err = NewRedisStorage(fmt.Sprintf("%s:%s", cfg.TpDbHost, cfg.TpDbPort), 4, cfg.TpDbPass, cfg.DBDataEncoding) + rds, err = NewRedisStorage(fmt.Sprintf("%s:%s", cfg.TpDbHost, cfg.TpDbPort), 4, cfg.TpDbPass, cfg.DBDataEncoding, utils.REDIS_MAX_CONNS) if err != nil { t.Fatal("Could not connect to Redis", err.Error()) } diff --git a/engine/storage_utils.go b/engine/storage_utils.go index ee2293d7a..da1292c3e 100644 --- a/engine/storage_utils.go +++ b/engine/storage_utils.go @@ -40,7 +40,7 @@ func ConfigureRatingStorage(db_type, host, port, name, user, pass, marshaler str if port != "" { host += ":" + port } - d, err = NewRedisStorage(host, db_nb, pass, marshaler) + d, err = NewRedisStorage(host, db_nb, pass, marshaler, utils.REDIS_MAX_CONNS) default: err = errors.New("unknown db") } @@ -63,7 +63,7 @@ func ConfigureAccountingStorage(db_type, host, port, name, user, pass, marshaler if port != "" { host += ":" + port } - d, err = NewRedisStorage(host, db_nb, pass, marshaler) + d, err = NewRedisStorage(host, db_nb, pass, marshaler, utils.REDIS_MAX_CONNS) case utils.MONGO: d, err = NewMongoStorage(host, port, name, user, pass) db = d.(AccountingStorage) diff --git a/utils/consts.go b/utils/consts.go index 204589e43..53f1446a8 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -31,6 +31,7 @@ var ( const ( VERSION = "0.9.1~rc8" DIAMETER_FIRMWARE_REVISION = 918 + REDIS_MAX_CONNS = 10 POSTGRES = "postgres" MYSQL = "mysql" MONGO = "mongo"