func New()

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
}