Skip to content

Instantly share code, notes, and snippets.

@lawrencejones
Created March 28, 2019 20:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lawrencejones/1079b115ea50621644b81520e2268019 to your computer and use it in GitHub Desktop.
Save lawrencejones/1079b115ea50621644b81520e2268019 to your computer and use it in GitHub Desktop.
Script to verify no data loss with a HA PG cluster
package main
import (
"context"
"fmt"
"os"
"os/signal"
"sync"
"sync/atomic"
"syscall"
kitlog "github.com/go-kit/kit/log"
"github.com/jackc/pgx"
)
func connect(user string) *pgx.Conn {
conn, err := pgx.Connect(
pgx.ConnConfig{
Host: "/tmp", Port: 5432, Database: "failover-testing", User: user,
},
)
if err != nil {
panic(err)
}
return conn
}
func main() {
var wg sync.WaitGroup
var count uint64
var logger = kitlog.NewLogfmtLogger(os.Stderr)
ctx, cancel := context.WithCancel(context.Background())
sigc := make(chan os.Signal, 1)
signal.Notify(sigc, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
go func() { <-sigc; cancel() }()
logger.Log("event", "benchmark.start")
connect("postgres").Exec(`drop table if exists logs`)
connect("postgres").Exec(`create table logs (id bigserial primary key);`)
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
var max uint64
conn := connect("postgres")
for {
token := atomic.AddUint64(&count, 1)
if _, err := conn.ExecEx(ctx, fmt.Sprintf(`insert into logs values (%d);`, token), &pgx.QueryExOptions{}); err != nil {
logger.Log("idx", i, "max", max, "error", err)
return
}
max = token
}
}()
}
wg.Wait()
logger.Log("event", "benchmark.done")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment