From 1509a6b681950ff4ee215c83b3207ce281b8e978 Mon Sep 17 00:00:00 2001 From: Pengfei Xue Date: Tue, 21 Jan 2014 18:48:16 +0800 Subject: [PATCH 1/3] fix bug, redis session doesnt work --- session/sess_redis.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/session/sess_redis.go b/session/sess_redis.go index 51685844..d19f316f 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -16,7 +16,7 @@ var MAX_POOL_SIZE = 100 var redisPool chan redis.Conn type RedisSessionStore struct { - c redis.Conn + p *redis.Pool sid string lock sync.RWMutex values map[interface{}]interface{} @@ -60,13 +60,15 @@ func (rs *RedisSessionStore) SessionID() string { } func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { - defer rs.c.Close() + c := rs.p.Get() + defer c.Close() + b, err := encodeGob(rs.values) if err != nil { return } - rs.c.Do("SET", rs.sid, string(b)) - rs.c.Do("EXPIRE", rs.sid, rs.maxlifetime) + + c.Do("SET", rs.sid, string(b), "EX", rs.maxlifetime) } type RedisProvider struct { @@ -116,10 +118,8 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { c := rp.poollist.Get() - if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { - c.Do("SET", sid) - } - c.Do("EXPIRE", sid, rp.maxlifetime) + defer c.Close() + kvs, err := redis.String(c.Do("GET", sid)) var kv map[interface{}]interface{} if len(kvs) == 0 { @@ -130,13 +130,15 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { return nil, err } } - rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} + + rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime} return rs, nil } func (rp *RedisProvider) SessionExist(sid string) bool { c := rp.poollist.Get() defer c.Close() + if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { return false } else { @@ -146,11 +148,11 @@ func (rp *RedisProvider) SessionExist(sid string) bool { func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { c := rp.poollist.Get() - if existed, err := redis.Int(c.Do("EXISTS", oldsid)); err != nil || existed == 0 { - c.Do("SET", oldsid) - } + defer c.Close() + c.Do("RENAME", oldsid, sid) c.Do("EXPIRE", sid, rp.maxlifetime) + kvs, err := redis.String(c.Do("GET", sid)) var kv map[interface{}]interface{} if len(kvs) == 0 { @@ -161,13 +163,15 @@ func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er return nil, err } } - rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} + + rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime} return rs, nil } func (rp *RedisProvider) SessionDestroy(sid string) error { c := rp.poollist.Get() defer c.Close() + c.Do("DEL", sid) return nil } @@ -178,7 +182,6 @@ func (rp *RedisProvider) SessionGC() { //@todo func (rp *RedisProvider) SessionAll() int { - return 0 } From d014ccfb8eb45ec2da30f83c6d525d27e7963e22 Mon Sep 17 00:00:00 2001 From: Pengfei Xue Date: Thu, 23 Jan 2014 19:28:58 +0800 Subject: [PATCH 2/3] bug fix, session stored in redis cannot be deleted --- controller.go | 1 + session/sess_redis.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/controller.go b/controller.go index 034e4cb3..83aaacfc 100644 --- a/controller.go +++ b/controller.go @@ -398,6 +398,7 @@ func (c *Controller) SessionRegenerateID() { // DestroySession cleans session data and session cookie. func (c *Controller) DestroySession() { + c.Ctx.Input.CruSession.Flush() GlobalSessions.SessionDestroy(c.Ctx.ResponseWriter, c.Ctx.Request) } diff --git a/session/sess_redis.go b/session/sess_redis.go index d19f316f..0326c6c2 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -60,6 +60,11 @@ func (rs *RedisSessionStore) SessionID() string { } func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { + // if rs.values is empty, return directly + if len(rs.values) < 1 { + return + } + c := rs.p.Get() defer c.Close() From 34eff4cc1fd084c100266ed83856c2aa9731857c Mon Sep 17 00:00:00 2001 From: Pengfei Xue Date: Sat, 25 Jan 2014 10:55:49 +0800 Subject: [PATCH 3/3] bugfix, delete the sid if it's values is empty * regenerate sid, if the old key doesn't exists, set the new one directly --- session/sess_redis.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/session/sess_redis.go b/session/sess_redis.go index 0326c6c2..b05e4831 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -60,14 +60,15 @@ func (rs *RedisSessionStore) SessionID() string { } func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { - // if rs.values is empty, return directly - if len(rs.values) < 1 { - return - } - c := rs.p.Get() defer c.Close() + // if rs.values is empty, return directly + if len(rs.values) < 1 { + c.Do("DEL", rs.sid) + return + } + b, err := encodeGob(rs.values) if err != nil { return @@ -155,8 +156,15 @@ func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er c := rp.poollist.Get() defer c.Close() - c.Do("RENAME", oldsid, sid) - c.Do("EXPIRE", sid, rp.maxlifetime) + if existed, _ := redis.Int(c.Do("EXISTS", oldsid)); existed == 0 { + // oldsid doesn't exists, set the new sid directly + // ignore error here, since if it return error + // the existed value will be 0 + c.Do("SET", sid, "", "EX", rp.maxlifetime) + } else { + c.Do("RENAME", oldsid, sid) + c.Do("EXPIRE", sid, rp.maxlifetime) + } kvs, err := redis.String(c.Do("GET", sid)) var kv map[interface{}]interface{}