vitessio/vitess · critical
cannot decode SourceUUID
Error message
cannot decode SourceUUID
What it means
ProtoToReplicationStatus parses s.SourceUuid with ParseSID (a UUID like '3E11FA47-71CA-11E1-9E33-C80AA9429562') and panics if parsing fails. SourceUuid must be a valid MySQL server SID; anything else aborts conversion. Empty string is allowed and simply means no source UUID is recorded.
Source
Thrown at go/mysql/replication/replication_status.go:159
panic(vterrors.Wrapf(err, "cannot decode RelayLogPosition"))
}
filePos, err := DecodePosition(s.FilePosition)
if err != nil {
panic(vterrors.Wrapf(err, "cannot decode FilePosition"))
}
fileRelayPos, err := DecodePosition(s.RelayLogSourceBinlogEquivalentPosition)
if err != nil {
panic(vterrors.Wrapf(err, "cannot decode RelayLogSourceBinlogEquivalentPosition"))
}
relayFilePos, err := DecodePosition(s.RelayLogFilePosition)
if err != nil {
panic(vterrors.Wrapf(err, "cannot decode RelayLogFilePosition"))
}
var sid SID
if s.SourceUuid != "" {
sid, err = ParseSID(s.SourceUuid)
if err != nil {
panic(vterrors.Wrapf(err, "cannot decode SourceUUID"))
}
}
replstatus := ReplicationStatus{
Position: pos,
RelayLogPosition: relayPos,
FilePosition: filePos,
RelayLogSourceBinlogEquivalentPosition: fileRelayPos,
RelayLogFilePosition: relayFilePos,
SourceServerID: s.SourceServerId,
ReplicationLagSeconds: s.ReplicationLagSeconds,
ReplicationLagUnknown: s.ReplicationLagUnknown,
SQLDelay: s.SqlDelay,
SourceHost: s.SourceHost,
SourceUser: s.SourceUser,
SourcePort: s.SourcePort,
ConnectRetry: s.ConnectRetry,
SourceUUID: sid,
IOState: ReplicationState(s.IoState),View on GitHub (pinned to 01a25a7d17)
Solutions
- Correct SourceUuid to the MySQL server's SID (SELECT @@server_uuid format).
- Pre-validate with replication.ParseSID before conversion.
- Clear the field to empty string if no source UUID is intended.
Example fix
// before
pb.SourceUuid = "my-db-host-1" // panics
status := mysql.ProtoToReplicationStatus(pb)
// after
sid, err := mysql.ParseSID("3e11fa47-71ca-11e1-9e33-c80aa9429562")
if err != nil { return err }
pb.SourceUuid = sid.String()
status := mysql.ProtoToReplicationStatus(pb) Defensive patterns
Strategy: validation
Validate before calling
if pb.SourceUuid != "" {
if _, err := mysql.ParseSID(pb.SourceUuid); err != nil {
return fmt.Errorf("invalid SourceUuid %q", pb.SourceUuid)
}
} Try / catch
defer func() { if r := recover(); r != nil { err = fmt.Errorf("SourceUUID decode failed: %v", r) } }() Prevention
- Copy SourceUuid from `SELECT @@server_uuid` output exactly (canonical UUID).
- Never substitute hostnames or aliases for the SID.
- Validate with ParseSID at proto-construction time.
When it happens
Trigger: Calling ProtoToReplicationStatus (or findErrantGTIDs, FindPositionsOfAllCandidates, ReplicaWasRunning, replicaIOThreadWasRunning) with a proto whose SourceUuid is non-empty but not a canonical 36-character UUID, e.g. lowercase/uppercase is fine, but truncated, hyphen-stripped, or hostname-based values fail.
Common situations: Operators hand-editing status protos, tools storing the source server hostname instead of its SID, or truncated data from custom scripts.
Related errors
- cannot decode RelayLogSourceBinlogEquivalentPosition
- cannot decode RelayLogFilePosition
- The receiver ReplicationStatus contained a Mysql56GTIDSet in
- Last_SQL_Error: ${LastSQL_Error}, Last_IO_Error: ${LastIO_Er
- GetPreviousGTIDs: previous GTIDs not found
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/2970fae6b0167036.
Report an issue: GitHub.