func (p *Postgres) checkReplStatus(name string) (sent, flushed xlog.Position, err error) { log := p.log.New("fn", "checkReplStatus", "name", name) log.Debug("checking replication status") var s, f pgx.NullString err = p.db.QueryRow(` SELECT sent_location, flush_location FROM pg_stat_replication WHERE application_name = $1`, name).Scan(&s, &f) if err != nil && err != pgx.ErrNoRows { log.Error("error checking replication status", "err", err) return } sent, flushed = xlog.Position(s.String), xlog.Position(f.String) if err == pgx.ErrNoRows || sent == "" || flushed == "" { err = ErrNoReplicationStatus log.Debug("no replication status") return } log.Debug("got replication status", "sent_location", sent, "flush_location", flushed) return }
func (p *Postgres) XLogPosition() (xlog.Position, error) { p.dbMtx.RLock() defer p.dbMtx.RUnlock() if !p.running() || p.db == nil { return "", errors.New("postgres is not running") } fn := "pg_last_xlog_replay_location()" if p.config().Role == state.RolePrimary { fn = "pg_current_xlog_location()" } var res string err := p.db.QueryRow("SELECT " + fn).Scan(&res) return xlog.Position(res), err }