in store/engine/postgresql/postgresql.go [72:112]
func New(id string, cfg *Config) (*Postgresql, error) {
if len(id) == 0 {
return nil, errors.New("id must NOT be a empty string")
}
connStr := fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable", cfg.Username, cfg.Password, cfg.Addrs[0], cfg.DBName)
db, err := sql.Open("postgres", connStr)
if err != nil {
return nil, err
}
listener := pq.NewListener(connStr, listenerMinReconnectInterval, listenerMaxReconnectInterval, nil)
err = listener.Listen(cfg.NotifyChannel)
if err != nil {
return nil, err
}
electPath := defaultElectPath
if cfg.ElectPath != "" {
electPath = defaultElectPath
}
p := &Postgresql{
myID: id,
electPath: electPath,
db: db,
listener: listener,
quitCh: make(chan struct{}),
lockReleaseCh: make(chan bool),
leaderChangeCh: make(chan bool),
}
err = p.initLeaderId()
if err != nil {
return nil, err
}
p.isReady.Store(false)
p.wg.Add(2)
go p.electLoop()
go p.observeLeaderEvent()
return p, nil
}