Skip to content

Instantly share code, notes, and snippets.

@coffeegoddd
Created March 11, 2026 18:25
Show Gist options
  • Select an option

  • Save coffeegoddd/06d353f67cd78f36d2fef82ce40ff469 to your computer and use it in GitHub Desktop.

Select an option

Save coffeegoddd/06d353f67cd78f36d2fef82ce40ff469 to your computer and use it in GitHub Desktop.
repro for non-atomic create database if not exists
package main
import (
"database/sql"
"flag"
"fmt"
"log"
"os"
"sync"
"github.com/go-sql-driver/mysql"
)
func envOr(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func main() {
var (
addr = flag.String("addr", envOr("DOLT_ADDR", "127.0.0.1:3306"), "host:port of MySQL/Dolt server")
user = flag.String("user", envOr("DOLT_USER", "root"), "username")
pass = flag.String("pass", os.Getenv("DOLT_PASS"), "password")
dsn = flag.String("dsn", os.Getenv("DOLT_DSN"), "full MySQL DSN (overrides other connection flags)")
)
flag.Parse()
var cfg *mysql.Config
if *dsn != "" {
var err error
cfg, err = mysql.ParseDSN(*dsn)
if err != nil {
log.Fatalf("parse dsn: %v", err)
}
} else {
cfg = mysql.NewConfig()
cfg.User = *user
cfg.Passwd = *pass
cfg.Net = "tcp"
cfg.Addr = *addr
}
concurrency := 10
dbName := "testconcurrentdb"
// Clean up from any previous run.
db, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
log.Fatalf("open: %v", err)
}
defer db.Close()
_, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS %s", dbName))
if err != nil {
log.Fatalf("cleanup: %v", err)
}
var wg sync.WaitGroup
wg.Add(concurrency)
errs := make([]error, concurrency)
for i := 0; i < concurrency; i++ {
go func(id int) {
defer wg.Done()
conn, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
errs[id] = fmt.Errorf("goroutine %d open: %w", id, err)
return
}
defer conn.Close()
_, err = conn.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName))
if err != nil {
errs[id] = fmt.Errorf("goroutine %d: %w", id, err)
}
}(i)
}
wg.Wait()
failed := 0
for _, err := range errs {
if err != nil {
log.Printf("ERROR: %v", err)
failed++
}
}
if failed > 0 {
log.Printf("%d/%d goroutines failed", failed, concurrency)
os.Exit(1)
}
log.Printf("all %d goroutines succeeded", concurrency)
// Clean up.
_, _ = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS %s", dbName))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment