vitessio/vitess · error
source shard has no primary: %v
Error message
source shard has no primary: %v
What it means
CreateLookupVindex needs to fetch the source table's schema from a source shard's primary tablet. If the first serving shard's shard record has no PrimaryAlias, there is no primary tablet to query and preparation fails.
Source
Thrown at go/vt/wrangler/materializer.go:656
continue
}
colName := colVindex.Column
if len(colVindex.Columns) != 0 {
colName = colVindex.Columns[0]
}
if colName == sourceVindexColumns[0] {
return nil, nil, nil, fmt.Errorf("ColumnVindex for table %v already exists: %v, please remove it and try again", sourceTableName, colName)
}
}
// Validate against source schema
sourceShards, err := wr.ts.GetServingShards(ctx, keyspace)
if err != nil {
return nil, nil, nil, err
}
onesource := sourceShards[0]
if onesource.PrimaryAlias == nil {
return nil, nil, nil, fmt.Errorf("source shard has no primary: %v", onesource.ShardName())
}
req := &tabletmanagerdatapb.GetSchemaRequest{Tables: []string{sourceTableName}}
tableSchema, err := schematools.GetSchema(ctx, wr.ts, wr.tmc, onesource.PrimaryAlias, req)
if err != nil {
return nil, nil, nil, err
}
if len(tableSchema.TableDefinitions) != 1 {
return nil, nil, nil, fmt.Errorf("unexpected number of tables returned from schema: %v", tableSchema.TableDefinitions)
}
// Generate "create table" statement
lines := strings.Split(tableSchema.TableDefinitions[0].Schema, "\n")
if len(lines) < 3 {
// Unreachable
return nil, nil, nil, fmt.Errorf("schema looks incorrect: %s, expecting at least four lines", tableSchema.TableDefinitions[0].Schema)
}
var modified []string
modified = append(modified, strings.Replace(lines[0], sourceTableName, targetTableName, 1))View on GitHub (pinned to 01a25a7d17)
Solutions
- Ensure every source shard has a healthy primary (`vtctldclient Placements`/`GetTablets`, run PRS if needed) and retry
- Wait for any in-flight reshard to finish or use a fully-serving source keyspace
- Inspect the shard record (`vtctldclient GetShard ks/shard`) and repair missing PrimaryAlias via PlannedReparentShard
Example fix
null
Defensive patterns
Strategy: validation
Validate before calling
shards, err := ts.GetServingShards(ctx, keyspace)
if err != nil { return err }
for _, sh := range shards {
if sh.PrimaryAlias == nil {
return fmt.Errorf("shard %s has no primary; fix replication first", sh.ShardName())
}
} Type guard
func shardHasPrimary(sh *topodata.Shard) bool { return sh.PrimaryAlias != nil } Try / catch
if err := createLookupVindex(...); err != nil {
if strings.Contains(err.Error(), "has no primary") {
return repairShardPrimary(shardName) // run PRS, then retry
}
return err
} Prevention
- Run `vtctldclient GetTablets` pre-flight to confirm every shard has a serving primary
- Avoid running vindex materialization during reshard or failover windows
- Monitor replication status alerts before topology-changing operations
When it happens
Trigger: The first serving shard of the source keyspace has no elected primary — e.g. during a reshard while the old shard's primary was removed, after ERS/PRS failure, or a shard record left with PrimaryAlias nil following manual topo edits.
Common situations: Running CreateLookupVindex mid-reshard when a source shard is orphaned; a primary tablet down and not yet promoted; corrupt/legacy topo data lacking primary info.
Related errors
- no primary tablet found
- shard: %s does not have a primary
- tablet %v type change %v -> %v is not an allowed transition
- cannot lookup primary tablet %v for shard %v/%v: %w
- SaveVSchema(%v) = %w
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/3f2acc464efbf5bf.
Report an issue: GitHub.