package main import ( "database/sql" "fmt" "os" "sync" "testing" "time" ) func TestConcurrentLedger(t *testing.T) { dsn := os.Getenv("LAB_MYSQL_TEST_DSN") if dsn == "" { t.Skip("requires empty test schema initialized from schema.sql") } db, e := sql.Open("mysql", dsn) if e != nil { t.Fatal(e) } defer db.Close() for i := range 20 { if e := submit(db, fmt.Sprintf("job-%d", i), "team-a", 1, i); e != nil { t.Fatal(e) } } var wg sync.WaitGroup for range 8 { wg.Add(1) go func() { defer wg.Done() for range 4 { if e := admit(db); e != nil { time.Sleep(20 * time.Millisecond) } } }() } wg.Wait() var used, rows, msgs int db.QueryRow("SELECT used FROM tenant_quota WHERE tenant='team-a'").Scan(&used) db.QueryRow("SELECT count(*) FROM reservation WHERE state='reserved'").Scan(&rows) db.QueryRow("SELECT count(*) FROM outbox").Scan(&msgs) if used != 2 || rows != used || msgs != used { t.Fatalf("used=%d reserved=%d outbox=%d", used, rows, msgs) } if e := submit(db, "job-0", "team-a", 2, 0); e == nil { t.Fatal("changed payload accepted") } // Inject a collision at the LAST insert, after both counters were updated. if err := submit(db, "rollback-probe", "team-b", 1, 100); err != nil { t.Fatal(err) } if _, err := db.Exec("INSERT INTO outbox(id) VALUES('rollback-probe')"); err != nil { t.Fatal(err) } if err := admit(db); err == nil { t.Fatal("expected duplicate outbox error") } var state string var tenantUsed, poolUsed int if err := db.QueryRow("SELECT state FROM reservation WHERE id='rollback-probe'").Scan(&state); err != nil { t.Fatal(err) } if err := db.QueryRow("SELECT used FROM tenant_quota WHERE tenant='team-b'").Scan(&tenantUsed); err != nil { t.Fatal(err) } if err := db.QueryRow("SELECT SUM(used) FROM gpu_pool").Scan(&poolUsed); err != nil { t.Fatal(err) } if state != "waiting" || tenantUsed != 0 || poolUsed != used { t.Fatalf("partial commit: state=%s tenant=%d pool=%d", state, tenantUsed, poolUsed) } if _, err := db.Exec("DELETE FROM outbox WHERE id='rollback-probe'"); err != nil { t.Fatal(err) } if err := admit(db); err != nil { t.Fatal(err) } if err := db.QueryRow("SELECT state FROM reservation WHERE id='rollback-probe'").Scan(&state); err != nil || state != "reserved" { t.Fatalf("retry: %s %v", state, err) } }