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

  1. Pass plain integers for size/timeout, e.g. --backup-read-pool-size=20 --backup-read-pool-timeout=3000
  2. Check the wrapped strconv error in the message to see which value failed
  3. 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

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


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/6dc05e2f89bd9dd5. Report an issue: GitHub.