{"record":{"id":"f4b382df42a6f83a","repo":"vitessio/vitess","slug":"error-creating-vtsql-proxy-w","errorCode":null,"errorMessage":"error creating vtsql proxy: %w","messagePattern":"error creating vtsql proxy: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"go/vt/vtadmin/cluster/cluster.go","lineNumber":142,"sourceCode":"\n\tfor _, opt := range cfg.vtsqlConfigOpts {\n\t\tvtsqlCfg = opt(vtsqlCfg)\n\t}\n\n\tvtctldargs := buildPFlagSlice(cfg.VtctldFlags)\n\n\tvtctldCfg, err := vtctldclient.Parse(protocluster, disco, vtctldargs)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating vtctldclient proxy config: %w\", err)\n\t}\n\n\tfor _, opt := range cfg.vtctldConfigOpts {\n\t\tvtctldCfg = opt(vtctldCfg)\n\t}\n\n\tcluster.DB, err = vtsql.New(ctx, vtsqlCfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating vtsql proxy: %w\", err)\n\t}\n\n\tcluster.Vtctld, err = vtctldclient.New(ctx, vtctldCfg)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating vtctldclient: %w\", err)\n\t}\n\n\tif cfg.TabletFQDNTmplStr != \"\" {\n\t\tcluster.TabletFQDNTmpl, err = template.New(cluster.ID + \"-tablet-fqdn\").Parse(cfg.TabletFQDNTmplStr)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to parse tablet fqdn template %s: %w\", cfg.TabletFQDNTmplStr, err)\n\t\t}\n\t}\n\n\tcluster.backupReadPool = cfg.BackupReadPoolConfig.NewReadPool()\n\tcluster.schemaReadPool = cfg.SchemaReadPoolConfig.NewReadPool()\n\tcluster.topoRWPool = cfg.TopoRWPoolConfig.NewRWPool()\n\tcluster.topoReadPool = cfg.TopoReadPoolConfig.NewReadPool()","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtadmin/cluster/cluster.go#L124-L160","documentation":"cluster.New fails when vtsql.New cannot create the vtgate SQL proxy (DB) for the cluster. This happens after config parsing succeeds and usually means the connection/pool could not be established or initialized (e.g. vtgate unreachable at init, TLS failure). The wrapped error carries the vtsql.New cause.","triggerScenarios":"vtsql.New(ctx, vtsqlCfg) returns an error while building cluster.DB during vtadmin startup — e.g. vtgate address unresolvable/unreachable, TLS handshake failure with configured certs.","commonSituations":"vtgate down or wrong port; DNS failure; mTLS certs missing/expired; firewall blocking vtadmin->vtgate.","solutions":["Confirm vtgate is running and reachable at the configured host:port (nc/curl the port)","Check TLS/credentials configuration for the vtsql connection","Fix addresses, then restart vtadmin"],"exampleFix":"// before\nvt: \"-vtgate-host localhost -vtgate-port 15999\"\n// after\nvt: \"-vtgate-host vtgate.internal -vtgate-port 15999\"","handlingStrategy":"validation","validationCode":"// before starting vtadmin, verify vtgate reachability\nhost, port := vtgateAddrFromFlags(cfg.VtSQLFlags)\nconn, err := net.DialTimeout(\"tcp\", net.JoinHostPort(host, port), 3*time.Second)\nif err != nil {\n    return fmt.Errorf(\"vtgate %s:%s unreachable: %w\", host, port, err)\n}\nconn.Close()","typeGuard":null,"tryCatchPattern":"c, err := cluster.BuildCluster(ctx, cfg)\nif err != nil {\n    if strings.Contains(err.Error(), \"error creating vtsql proxy\") {\n        return fmt.Errorf(\"cannot reach vtgate for cluster %q: %w\", cfg.ID, err)\n    }\n    return err\n}","preventionTips":["Health-check vtgate ports from the vtadmin host in readiness probes","Keep mTLS certs renewed and mounted correctly","Pin vtgate addresses via service discovery, not hardcoded IPs"],"tags":["startup","vtsql","connection","vtgate"],"backgroundTag":"connection-refused","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}