vitessio/vitess · error
error parsing %s: %w
Error message
error parsing %s: %w
What it means
VTAdmin's cluster flag parser maps flags like backup-read-pool-* onto RPCPoolConfig.parseFlag. When that sub-parser fails to parse a value (e.g. a non-numeric "size" or a negative pool size), parseOne wraps the underlying error with the full flag name for context.
Source
Thrown at go/vt/vtadmin/cluster/flags.go:171
}
cfg.VtSQLFlags[strings.TrimPrefix(name, "vtsql-")] = val
case strings.HasPrefix(name, "vtctld-"):
if cfg.VtctldFlags == nil {
cfg.VtctldFlags = map[string]string{}
}
cfg.VtctldFlags[strings.TrimPrefix(name, "vtctld-")] = val
case strings.HasPrefix(name, "backup-read-pool-"):
if cfg.BackupReadPoolConfig == nil {
cfg.BackupReadPoolConfig = &RPCPoolConfig{
Size: -1,
WaitTimeout: -1,
}
}
if err := cfg.BackupReadPoolConfig.parseFlag(strings.TrimPrefix(name, "backup-read-pool-"), val); err != nil {
return fmt.Errorf("error parsing %s: %w", name, err)
}
case strings.HasPrefix(name, "schema-read-pool-"):
if cfg.SchemaReadPoolConfig == nil {
cfg.SchemaReadPoolConfig = &RPCPoolConfig{
Size: -1,
WaitTimeout: -1,
}
}
if err := cfg.SchemaReadPoolConfig.parseFlag(strings.TrimPrefix(name, "schema-read-pool-"), val); err != nil {
return fmt.Errorf("error parsing %s: %w", name, err)
}
case strings.HasPrefix(name, "topo-read-pool-"):
if cfg.TopoReadPoolConfig == nil {
cfg.TopoReadPoolConfig = &RPCPoolConfig{
Size: -1,
WaitTimeout: -1,
}View on GitHub (pinned to 01a25a7d17)
Solutions
- Pass plain integers for size/timeout, e.g. --backup-read-pool-size=20 --backup-read-pool-timeout=3000
- Check the wrapped strconv error in the message to see which value failed
- Ensure pool sizes are non-negative and within int range
Example fix
// before vtadmin-cluster --backup-read-pool-size=10k // after vtadmin-cluster --backup-read-pool-size=10000
Defensive patterns
Strategy: validation
Validate before calling
func validPoolValue(v string) error {
n, err := strconv.Atoi(v)
if err != nil {
return err
}
if n < 0 {
return fmt.Errorf("pool size must be non-negative; got %d", n)
}
return nil
}
// check before invoking the flag parser: validPoolValue("20") Try / catch
if err := parseFlag(cfg, value); err != nil {
var numErr *strconv.NumError
if errors.As(err, &numErr) {
log.Errorf("bad integer in flag %s: %v", value, numErr)
}
return err
} Prevention
- Pass plain integers without unit suffixes for pool size/timeout
- Never set pool sizes to negative numbers
- Verify shell/env substitution does not inject empty or partial values
- Test the full comma-separated flag string locally before rollout
When it happens
Trigger: Passing a value like "--backup-read-pool-size=ten" or "--backup-read-pool-timeout=5s" (timeout expects a numeric value) to the vtadmin cluster flag parser, which calls RPCPoolConfig.parseFlag with "size"/"timeout".
Common situations: Typos or unit suffixes in pool size values; setting size to a negative number (rejected with strconv.ErrRange); quoting issues that leave stray characters in the value.
Related errors
- missing value for 'rate'
- missing value for 'path'
- failed to unmarshal staticfile config from json: %w
- --batch-size requires 'direct' ddl_strategy
- --batch-size conflicts with --uuid-list. Batching does not s
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/6dc05e2f89bd9dd5.
Report an issue: GitHub.