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

  1. Correct SourceUuid to the MySQL server's SID (SELECT @@server_uuid format).
  2. Pre-validate with replication.ParseSID before conversion.
  3. 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

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


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