{"record":{"id":"d6514026bad470e0","repo":"vitessio/vitess","slug":"getkeyspaces-cluster-s-w-d65140","errorCode":null,"errorMessage":"GetKeyspaces(cluster = %s): %w","messagePattern":"GetKeyspaces\\(cluster = (.+?)\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/vtadmin/cluster/cluster.go","lineNumber":1270,"sourceCode":"\t}\n\n\twg.Wait()\n\tif rec.HasErrors() {\n\t\treturn nil, rec.Error()\n\t}\n\n\treturn keyspaces, nil\n}\n\n// GetSrvKeyspaces returns all SrvKeyspaces for all keyspaces in a cluster.\nfunc (c *Cluster) GetSrvKeyspaces(ctx context.Context, cells []string) (map[string]*vtctldatapb.GetSrvKeyspacesResponse, error) {\n\tspan, ctx := trace.NewSpan(ctx, \"Cluster.GetKeyspaces\")\n\tAnnotateSpan(c, span)\n\n\tdefer span.Finish()\n\tkeyspaces, err := c.Vtctld.GetKeyspaces(ctx, &vtctldatapb.GetKeyspacesRequest{})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"GetKeyspaces(cluster = %s): %w\", c.ID, err)\n\t}\n\n\tvar (\n\t\tm            sync.Mutex\n\t\twg           sync.WaitGroup\n\t\trec          concurrency.AllErrorRecorder\n\t\tsrvKeyspaces = make(map[string]*vtctldatapb.GetSrvKeyspacesResponse, len(keyspaces.Keyspaces))\n\t)\n\n\tfor _, keyspace := range keyspaces.Keyspaces {\n\t\twg.Add(1)\n\n\t\tgo func(keyspace *vtctldatapb.Keyspace) {\n\t\t\tdefer wg.Done()\n\t\t\tsrv_keyspaces, err := c.Vtctld.GetSrvKeyspaces(ctx, &vtctldatapb.GetSrvKeyspacesRequest{Keyspace: keyspace.Name, Cells: cells})\n\t\t\tif err != nil {\n\t\t\t\trec.RecordError(fmt.Errorf(\"GetSrvKeyspaces(keyspace = %s): %w\", keyspace.Name, err))\n\t\t\t\treturn","sourceCodeStart":1252,"sourceCodeEnd":1288,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtadmin/cluster/cluster.go#L1252-L1288","documentation":"Cluster.GetSrvKeyspaces first lists all keyspaces via Vtctld.GetKeyspaces; if that RPC fails it wraps the error with the cluster ID. This is a transport/topo-level failure before any per-keyspace serving-tablet lookups begin (those produce error 864 instead).","triggerScenarios":"Calling cluster.GetSrvKeyspaces(ctx, req) when the vtctld GetKeyspaces RPC fails: vtctld unreachable, topo unavailable, or request context cancelled.","commonSituations":"vtctld process down or restarting; network partition between vtadmin and vtctld; topo (etcd/zookeeper) outage; vtadmin pointed at the wrong vtctld address.","solutions":["Check the wrapped cause for the concrete RPC/topo error","Verify vtctld is running and reachable from vtadmin (address, port, TLS)","Check topo server health (etcd/zk)","Retry once infrastructure is restored"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Go: verify vtctld reachability before GetSrvKeyspaces\nif err := c.Vtctld.Ping(ctx); err != nil {\n\treturn fmt.Errorf(\"vtctld unreachable: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"srv, err := c.GetSrvKeyspaces(ctx, req)\nif err != nil {\n\tif strings.Contains(err.Error(), \"GetKeyspaces(cluster =\") {\n\t\t// vtctld/topo-level failure: check infra before retrying\n\t}\n\treturn err\n}","preventionTips":["Monitor vtctld liveness from vtadmin","Verify vtctld address/TLS config on deploy","Handle topo outages with circuit-breaker behavior","Distinguish GetKeyspace-level vs per-keyspace failures in logs"],"tags":["vtadmin","rpc","vtctld","topology"],"backgroundTag":"vtctld-rpc-failed","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}