From 6c03b4995f302ba106f0bb1c521474f6d6a4f872 Mon Sep 17 00:00:00 2001 From: xhyl <1329172872@qq.com> Date: Fri, 23 Apr 2021 15:48:01 +0800 Subject: [PATCH 1/2] fix add new g2cache return error --- example/main.go | 6 +++++- g2cache.go | 30 ++++++++++++++++++++++-------- out_redis.go | 10 +++++++--- redis_helper.go | 25 +++++++++++++++++++++---- redis_helper_test.go | 8 ++++++-- 5 files changed, 61 insertions(+), 18 deletions(-) diff --git a/example/main.go b/example/main.go index 05b2f22..8af746a 100644 --- a/example/main.go +++ b/example/main.go @@ -29,7 +29,11 @@ func main() { g2cache.DefaultRedisConf.DB = 1 g2cache.DefaultRedisConf.Pwd = "" g2cache.DefaultRedisConf.MaxConn = 30 - g2 := g2cache.New(nil, nil) + g2,err := g2cache.New(nil, nil) + if err != nil { + log.Println("g2cache new error:",err) + return + } go func() { http.HandleFunc("/statics", func(writer http.ResponseWriter, request *http.Request) { m := g2cache.HitStatisticsOut.String() diff --git a/g2cache.go b/g2cache.go index af29e27..2caeebc 100644 --- a/g2cache.go +++ b/g2cache.go @@ -41,7 +41,7 @@ type G2Cache struct { gPool *Pool } -func New(out OutCache, local LocalCache) *G2Cache { +func New(out OutCache, local LocalCache) (*G2Cache,error) { gid, err := NewUUID() if err != nil { panic(fmt.Sprintf("gen gid err :%v", err)) @@ -58,7 +58,11 @@ func New(out OutCache, local LocalCache) *G2Cache { local = NewFreeCache() } if out == nil { - out = NewRedisCache() + out,err = NewRedisCache() + if err != nil { + g.Close() + return nil,err + } } g.local = local g.out = out @@ -74,7 +78,7 @@ func New(out OutCache, local LocalCache) *G2Cache { g.gPool.SendJob(g.monitor) } - return g + return g, nil } func (g *G2Cache) monitor() { @@ -421,11 +425,21 @@ func (g *G2Cache) subscribeInternal() error { } func (g *G2Cache) close() { - close(g.stop) - g.out.Close() - g.local.Close() - close(g.channel) - g.gPool.Release() + if g.stop != nil { + close(g.stop) + } + if g.out != nil { + g.out.Close() + } + if g.out != nil { + g.local.Close() + } + if g.channel != nil { + close(g.channel) + } + if g.gPool != nil { + g.gPool.Release() + } } func (g *G2Cache) Close() { diff --git a/out_redis.go b/out_redis.go index f0fd293..2dd09a3 100644 --- a/out_redis.go +++ b/out_redis.go @@ -27,12 +27,16 @@ type RedisConf struct { MaxConn int } -func NewRedisCache() *RedisCache { +func NewRedisCache() (*RedisCache,error) { + pool,err := GetRedisPool(&DefaultRedisConf) + if err != nil { + return nil,err + } c := &RedisCache{ - pool: GetRedisPool(&DefaultRedisConf), + pool: pool, stop: make(chan struct{}, 1), } - return c + return c, nil } func (r *RedisCache) Del(key string) error { diff --git a/redis_helper.go b/redis_helper.go index c3b545f..8e38197 100644 --- a/redis_helper.go +++ b/redis_helper.go @@ -57,7 +57,7 @@ func getRedisConn(pool *redis.Pool) (redis.Conn, error) { return conn, nil } -func GetRedisPool(conf *RedisConf) *redis.Pool { +func GetRedisPool(conf *RedisConf) (*redis.Pool,error) { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { c, err := redis.Dial("tcp", conf.DSN) @@ -66,13 +66,19 @@ func GetRedisPool(conf *RedisConf) *redis.Pool { } if conf.Pwd != "" { if _, err := c.Do("AUTH", conf.Pwd); err != nil { - err = c.Close() + errC := c.Close() + if errC != nil { + return nil, errC + } return nil, err } } if conf.DB > 0 { if _, err := c.Do("SELECT", conf.DB); err != nil { - err = c.Close() + errC := c.Close() + if errC != nil { + return nil, errC + } return nil, err } } @@ -88,5 +94,16 @@ func GetRedisPool(conf *RedisConf) *redis.Pool { Wait: true, MaxConnLifetime: 30 * time.Minute, } - return pool + + //ping + conn, err := pool.Dial() + if err != nil { + return nil, err + } + err = pool.TestOnBorrow(conn, time.Now()) + if err != nil { + return nil, err + } + + return pool, nil } diff --git a/redis_helper_test.go b/redis_helper_test.go index c241c5a..415364a 100644 --- a/redis_helper_test.go +++ b/redis_helper_test.go @@ -10,8 +10,12 @@ func TestGetRedisPool(t *testing.T) { DefaultRedisConf.DB = 0 DefaultRedisConf.Pwd = "07030501310" DefaultRedisConf.MaxConn = 2 - pool := GetRedisPool(&DefaultRedisConf) - _, err := pool.Get().Do("SET", "xxx", "yangq") + pool,err := GetRedisPool(&DefaultRedisConf) + if err != nil { + t.Fatal(err) + return + } + _, err = pool.Get().Do("SET", "xxx", "yangq") if err != nil { t.Fatal(err) return -- Gitee From 6023a3e8786ec4aaf8cfe4f47c1163c3b8deab85 Mon Sep 17 00:00:00 2001 From: kelvins-io Date: Fri, 23 Apr 2021 22:50:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=B0=86=E5=BC=82=E5=B8=B8=E4=BB=A5err?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/main.go | 2 +- g2cache.go | 26 +++++++++++++------------- redis_helper_test.go | 6 +++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/example/main.go b/example/main.go index 8af746a..382a30e 100644 --- a/example/main.go +++ b/example/main.go @@ -31,7 +31,7 @@ func main() { g2cache.DefaultRedisConf.MaxConn = 30 g2,err := g2cache.New(nil, nil) if err != nil { - log.Println("g2cache new error:",err) + log.Println("g2cache New",err) return } go func() { diff --git a/g2cache.go b/g2cache.go index 2caeebc..f2a09f9 100644 --- a/g2cache.go +++ b/g2cache.go @@ -41,29 +41,29 @@ type G2Cache struct { gPool *Pool } -func New(out OutCache, local LocalCache) (*G2Cache,error) { +func New(out OutCache, local LocalCache) (g *G2Cache, err error) { + if local == nil { + local = NewFreeCache() + } + if out == nil { + out, err = NewRedisCache() + if err != nil { + return nil, fmt.Errorf("NewRedisCache err: %v", err) + } + } + gid, err := NewUUID() if err != nil { - panic(fmt.Sprintf("gen gid err :%v", err)) + return nil, fmt.Errorf("gen G2Cache.gid err :%v", err) } LogInfo("[g2cache.gid] = ", gid) - g := &G2Cache{ + g = &G2Cache{ GID: gid, hash: new(fnv64a), stop: make(chan struct{}, 1), channel: make(chan *ChannelMeta, defaultShards), gPool: NewPool(DefaultGPoolWorkerNum, DefaultGPoolJobQueueChanLen), } - if local == nil { - local = NewFreeCache() - } - if out == nil { - out,err = NewRedisCache() - if err != nil { - g.Close() - return nil,err - } - } g.local = local g.out = out diff --git a/redis_helper_test.go b/redis_helper_test.go index 415364a..b076fbb 100644 --- a/redis_helper_test.go +++ b/redis_helper_test.go @@ -8,19 +8,19 @@ import ( func TestGetRedisPool(t *testing.T) { DefaultRedisConf.DSN = "127.0.0.1:6379" DefaultRedisConf.DB = 0 - DefaultRedisConf.Pwd = "07030501310" + DefaultRedisConf.Pwd = "" DefaultRedisConf.MaxConn = 2 pool,err := GetRedisPool(&DefaultRedisConf) if err != nil { t.Fatal(err) return } - _, err = pool.Get().Do("SET", "xxx", "yangq") + _, err = pool.Get().Do("SET", "surprise", "g2cache") if err != nil { t.Fatal(err) return } - v, err := redis.String(pool.Get().Do("GET", "xxx")) + v, err := redis.String(pool.Get().Do("GET", "surprise")) if err != nil { t.Fatal(err) return -- Gitee