{"record":{"id":"3b62f28419e57352","repo":"vitessio/vitess","slug":"cannot-decode-relaylogfileposition","errorCode":null,"errorMessage":"cannot decode RelayLogFilePosition","messagePattern":"cannot decode RelayLogFilePosition","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"go/mysql/replication/replication_status.go","lineNumber":153,"sourceCode":"\tpos, err := DecodePosition(s.Position)\n\tif err != nil {\n\t\tpanic(vterrors.Wrapf(err, \"cannot decode Position\"))\n\t}\n\trelayPos, err := DecodePosition(s.RelayLogPosition)\n\tif err != nil {\n\t\tpanic(vterrors.Wrapf(err, \"cannot decode RelayLogPosition\"))\n\t}\n\tfilePos, err := DecodePosition(s.FilePosition)\n\tif err != nil {\n\t\tpanic(vterrors.Wrapf(err, \"cannot decode FilePosition\"))\n\t}\n\tfileRelayPos, err := DecodePosition(s.RelayLogSourceBinlogEquivalentPosition)\n\tif err != nil {\n\t\tpanic(vterrors.Wrapf(err, \"cannot decode RelayLogSourceBinlogEquivalentPosition\"))\n\t}\n\trelayFilePos, err := DecodePosition(s.RelayLogFilePosition)\n\tif err != nil {\n\t\tpanic(vterrors.Wrapf(err, \"cannot decode RelayLogFilePosition\"))\n\t}\n\tvar sid SID\n\tif s.SourceUuid != \"\" {\n\t\tsid, err = ParseSID(s.SourceUuid)\n\t\tif err != nil {\n\t\t\tpanic(vterrors.Wrapf(err, \"cannot decode SourceUUID\"))\n\t\t}\n\t}\n\treplstatus := ReplicationStatus{\n\t\tPosition:                               pos,\n\t\tRelayLogPosition:                       relayPos,\n\t\tFilePosition:                           filePos,\n\t\tRelayLogSourceBinlogEquivalentPosition: fileRelayPos,\n\t\tRelayLogFilePosition:                   relayFilePos,\n\t\tSourceServerID:                         s.SourceServerId,\n\t\tReplicationLagSeconds:                  s.ReplicationLagSeconds,\n\t\tReplicationLagUnknown:                  s.ReplicationLagUnknown,\n\t\tSQLDelay:                               s.SqlDelay,","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/mysql/replication/replication_status.go#L135-L171","documentation":"Same panic family as error 1630 but for the RelayLogFilePosition field: ProtoToReplicationStatus calls DecodePosition on s.RelayLogFilePosition and panics if it cannot parse the 'file:pos' string. The panic name explicitly identifies the field so the bad value can be located. It guards against invalid relay-log position data entering ReplicationStatus.","triggerScenarios":"ProtoToReplicationStatus (or callers findErrantGTIDs, FindPositionsOfAllCandidates, ReplicaWasRunning, replicaIOThreadWasRunning) receives a proto where RelayLogFilePosition is malformed — e.g. missing ':offset' suffix, non-numeric offset, or partially written data.","commonSituations":"Hand-built protos in tests/tooling, data corruption from external serialization round-trips, or copy-paste errors putting a GTID or UUID into the position field.","solutions":["Inspect s.RelayLogFilePosition and correct it to 'file:position' format.","Pre-validate with mysql.DecodePosition before conversion.","Regenerate the status from the tablet via a fresh status RPC instead of reusing stale/mutated protos."],"exampleFix":"// before\nstatus := mysql.ProtoToReplicationStatus(pb) // panics on bad RelayLogFilePosition\n// after\nif _, err := mysql.DecodePosition(pb.RelayLogFilePosition); err != nil {\n    return fmt.Errorf(\"bad RelayLogFilePosition %q: %w\", pb.RelayLogFilePosition, err)\n}\nstatus := mysql.ProtoToReplicationStatus(pb)","handlingStrategy":"validation","validationCode":"if _, err := mysql.DecodePosition(pb.RelayLogFilePosition); err != nil {\n    return fmt.Errorf(\"invalid RelayLogFilePosition %q\", pb.RelayLogFilePosition)\n}","typeGuard":null,"tryCatchPattern":"defer func() { if r := recover(); r != nil { err = fmt.Errorf(\"conversion failed: %v\", r) } }()","preventionTips":["Only build status protos through ReplicationStatusToProto.","Validate position strings match 'file:offset' before passing them on.","Regenerate stale protos from the source tablet instead of reusing serialized data."],"tags":["mysql","replication","protobuf-decoding","panic"],"backgroundTag":"invalid-binlog-position-format","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}