valkey tester improvements
This commit is contained in:
@@ -162,6 +162,46 @@ func optionsFromConn(host string, port int, password string, db int, useTLS bool
|
||||
return opts
|
||||
}
|
||||
|
||||
// buildConnOptions resolves the Valkey connection for the --seed/--verify/
|
||||
// --flush/--inspect modes from either a --conn string or the override flags.
|
||||
// A conn string carries host/port/password/db/TLS, so it stands in for the
|
||||
// override flags; redis.ParseURL maps rediss:// to a TLS config. --tls-ca is
|
||||
// honoured in both paths so a local run can trust a non-system CA.
|
||||
func buildConnOptions(conn, host string, port int, password string, tlsEnable bool, tlsCAPath string) (*redis.Options, error) {
|
||||
if conn != "" {
|
||||
parsed, err := redis.ParseURL(conn)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("--conn parse error: %w", err)
|
||||
}
|
||||
if tlsCAPath != "" {
|
||||
pem, err := os.ReadFile(tlsCAPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read tls-ca: %w", err)
|
||||
}
|
||||
pool := x509.NewCertPool()
|
||||
if !pool.AppendCertsFromPEM(pem) {
|
||||
return nil, fmt.Errorf("tls-ca: no certificates parsed from %s", tlsCAPath)
|
||||
}
|
||||
if parsed.TLSConfig == nil {
|
||||
parsed.TLSConfig = &tls.Config{MinVersion: tls.VersionTLS12}
|
||||
}
|
||||
parsed.TLSConfig.RootCAs = pool
|
||||
}
|
||||
return parsed, nil
|
||||
}
|
||||
cfg := &Config{}
|
||||
if err := applyFlagOverrides(cfg, host, port, password, tlsEnable, tlsCAPath); err != nil {
|
||||
return nil, fmt.Errorf("flag override error: %w", err)
|
||||
}
|
||||
if cfg.Host == "" {
|
||||
return nil, fmt.Errorf("requires --host (e.g. --host valkey.zerops over the zcli VPN) or --conn")
|
||||
}
|
||||
if cfg.Port == 0 {
|
||||
cfg.Port = 6379
|
||||
}
|
||||
return optionsFromConn(cfg.Host, cfg.Port, cfg.Password, cfg.DB, cfg.TLS), nil
|
||||
}
|
||||
|
||||
func redactPassword(pw string) string {
|
||||
if pw == "" {
|
||||
return "(none)"
|
||||
@@ -192,11 +232,51 @@ func main() {
|
||||
passwordOverride := flag.String("password", "", "override password for all workers (local testing)")
|
||||
tlsEnable := flag.Bool("tls", false, "enable TLS for all workers using system root CAs (local testing)")
|
||||
tlsCAPath := flag.String("tls-ca", "", "path to TLS CA cert PEM; enables TLS for all workers (local testing)")
|
||||
seedConn := flag.String("conn", "", "Valkey connection string for --seed/--verify/--flush/--inspect (e.g. redis://default:pw@valkey1:6379 or rediss://...:6380 for TLS); overrides --host/--port/--password/--tls")
|
||||
seedMode := flag.Bool("seed", false, "bulk-load one Valkey with deterministic data (local; use --host valkey.zerops over zcli VPN)")
|
||||
verifyMode := flag.Bool("verify", false, "re-read seed:* keys and check they're 1:1 with the seed (same --seed-* flags)")
|
||||
flushMode := flag.Bool("flush", false, "FLUSHDB the selected --db (clears the whole database)")
|
||||
inspectMode := flag.Bool("inspect", false, "print every database and its key count")
|
||||
seedMB := flag.Int("seed-mb", 500, "total payload in --seed/--verify mode, in MiB")
|
||||
seedValueBytes := flag.Int("seed-value-bytes", 10*1024, "size of each value in --seed/--verify mode, in bytes")
|
||||
seedBatch := flag.Int("seed-batch", 1000, "keys per pipeline batch in --seed/--verify mode")
|
||||
seedSeed := flag.Uint64("seed-seed", 1, "PRNG seed for value generation; must match between --seed and --verify")
|
||||
seedThrottleMB := flag.Float64("throttle-mb", 0, "throttle --seed write rate in MiB/s (0 = unlimited)")
|
||||
dbOverride := flag.Int("db", -1, "Valkey DB number for --seed/--verify/--flush/--inspect (-1 = use --conn/config default)")
|
||||
seedTimeout := flag.Duration("timeout", 5*time.Second, "dial/read/write timeout in --seed/--verify/--flush/--inspect mode (raise for slow VPN links)")
|
||||
flag.Parse()
|
||||
|
||||
switch {
|
||||
case *collectorMode:
|
||||
os.Exit(runCollector(*port))
|
||||
case *seedMode, *verifyMode, *flushMode, *inspectMode:
|
||||
opts, err := buildConnOptions(*seedConn, *hostOverride, *portOverride, *passwordOverride, *tlsEnable, *tlsCAPath)
|
||||
if err != nil {
|
||||
log.Fatalf("connection error: %v", err)
|
||||
}
|
||||
// --db overrides whatever the conn string / flags resolved to, so the
|
||||
// same target can be pointed at any logical database without editing
|
||||
// the conn URL. -1 means "leave as-is".
|
||||
if *dbOverride >= 0 {
|
||||
opts.DB = *dbOverride
|
||||
}
|
||||
// Generous timeouts: the zcli VPN adds latency and can stall a dial
|
||||
// well past go-redis's 5s default mid-run. PoolTimeout > DialTimeout
|
||||
// so a slow dial doesn't surface as pool exhaustion first.
|
||||
opts.DialTimeout = *seedTimeout
|
||||
opts.ReadTimeout = *seedTimeout
|
||||
opts.WriteTimeout = *seedTimeout
|
||||
opts.PoolTimeout = *seedTimeout + 5*time.Second
|
||||
switch {
|
||||
case *inspectMode:
|
||||
os.Exit(runInspect(opts))
|
||||
case *flushMode:
|
||||
os.Exit(runFlush(opts))
|
||||
case *verifyMode:
|
||||
os.Exit(runVerify(opts, *seedSeed, *seedMB*1024*1024, *seedValueBytes, *seedBatch))
|
||||
default:
|
||||
os.Exit(runSeed(opts, *seedSeed, *seedMB*1024*1024, *seedValueBytes, *seedBatch, *seedThrottleMB*1024*1024))
|
||||
}
|
||||
}
|
||||
|
||||
cfg, err := loadConfig(*configPath)
|
||||
|
||||
Reference in New Issue
Block a user