| 220 | } |
| 221 | |
| 222 | func (p *Postgresql) electLoop() { |
| 223 | defer p.wg.Done() |
| 224 | for { |
| 225 | select { |
| 226 | case <-p.quitCh: |
| 227 | return |
| 228 | default: |
| 229 | } |
| 230 | |
| 231 | query := "INSERT INTO locks (name, leaderID) VALUES ($1, $2) ON CONFLICT DO NOTHING" |
| 232 | _, err := p.db.Exec(query, p.electPath, p.myID) |
| 233 | if err != nil { |
| 234 | time.Sleep(lockTTL / 3) |
| 235 | continue |
| 236 | } |
| 237 | |
| 238 | select { |
| 239 | case <-p.lockReleaseCh: |
| 240 | continue |
| 241 | case <-p.quitCh: |
| 242 | return |
| 243 | } |
| 244 | } |
| 245 | } |
| 246 | |
| 247 | func (p *Postgresql) observeLeaderEvent() { |
| 248 | defer p.wg.Done() |