Skip to content

Commit

Permalink
redis: support sentinel (#31)
Browse files Browse the repository at this point in the history
* let redis support sentinel

let redis support sentinel

* Update .travis.yml

Co-authored-by: ᴜɴᴋɴᴡᴏɴ <u@gogs.io>
  • Loading branch information
xmh19936688 and unknwon committed Feb 24, 2020
1 parent c5d57a3 commit 469e6b9
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go:
# - 1.6.x: bad for Redis
# - 1.7.x: bad for MySQL
# - 1.8.x: bad for MySQL
- 1.9.x
# - 1.9.x: bad for MySQL
- 1.10.x
- 1.11.x
- 1.12.x
Expand Down
48 changes: 48 additions & 0 deletions redis/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,11 @@ func (p *RedisProvider) Init(maxlifetime int64, configs string) (err error) {
return err
}

section, err := cfg.GetSection("")
if err == nil && section != nil && section.Key("ha_mode").Value() == "sentinel" {
return p.initSentinel(cfg)
}

opt := &redis.Options{
Network: "tcp",
}
Expand Down Expand Up @@ -154,6 +159,49 @@ func (p *RedisProvider) Init(maxlifetime int64, configs string) (err error) {
return p.c.Ping().Err()
}

func (p *RedisProvider) initSentinel(cfg *ini.File) (err error) {
opt := &redis.FailoverOptions{}

for k, v := range cfg.Section("").KeysHash() {
switch k {
case "master_name":
opt.MasterName = v
case "sentinel_Addrs":
opt.SentinelAddrs = strings.Split(v, "|")
case "password":
opt.Password = v
case "db":
opt.DB = com.StrTo(v).MustInt64()
case "pool_size":
opt.PoolSize = com.StrTo(v).MustInt()
case "dial_timeout":
opt.DialTimeout, err = time.ParseDuration(v + "s")
if err != nil {
return fmt.Errorf("error parsing dial timeout: %v", err)
}
case "read_timeout":
opt.ReadTimeout, err = time.ParseDuration(v + "s")
if err != nil {
return fmt.Errorf("error parsing read timeout: %v", err)
}
case "write_timeout":
opt.WriteTimeout, err = time.ParseDuration(v + "s")
if err != nil {
return fmt.Errorf("error parsing write timeout: %v", err)
}
case "idle_timeout":
opt.IdleTimeout, err = time.ParseDuration(v + "s")
if err != nil {
return fmt.Errorf("error parsing idle timeout: %v", err)
}
case "prefix":
p.prefix = v
}
}
p.c = redis.NewFailoverClient(opt)
return p.c.Ping().Err()
}

// Read returns raw session store by session ID.
func (p *RedisProvider) Read(sid string) (session.RawStore, error) {
psid := p.prefix + sid
Expand Down

0 comments on commit 469e6b9

Please sign in to comment.