{"record":{"id":"c65341ce20cd5dc7","repo":"vitessio/vitess","slug":"cannot-decode-relaylogposition","errorCode":null,"errorMessage":"cannot decode RelayLogPosition","messagePattern":"cannot decode RelayLogPosition","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/mysql/replication/replication_status.go","lineNumber":141,"sourceCode":"\t\tAutoPosition:                           s.AutoPosition,\n\t\tUsingGtid:                              s.UsingGTID,\n\t\tSemiSyncPrimaryEnabled:                 s.SemiSyncPrimaryEnabled,\n\t\tSemiSyncReplicaEnabled:                 s.SemiSyncReplicaEnabled,\n\t\tSemiSyncPrimaryStatus:                  s.SemiSyncPrimaryStatus,\n\t\tSemiSyncReplicaStatus:                  s.SemiSyncReplicaStatus,\n\t}\n\treturn replstatuspb\n}\n\n// ProtoToReplicationStatus translates a proto Status, or panics.\nfunc ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus {\n\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\"))","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/mysql/replication/replication_status.go#L123-L159","documentation":"Same family as the Position panic: ProtoToReplicationStatus also decodes the RelayLogPosition field with DecodePosition and panics with a vterrors-wrapped error if it is invalid. The relay log position string in the incoming Status proto is empty or malformed.","triggerScenarios":"Calling ProtoToReplicationStatus on a Status proto whose RelayLogPosition is empty/corrupt — common when a tablet has no relay log yet but the field was left as an invalid non-empty string, or a zero proto is converted.","commonSituations":"Replica status gathering during reparenting where the replica never connected to a primary (no relay log), or peers running mismatched Vitess versions.","solutions":["Validate/decode s.RelayLogPosition before calling ProtoToReplicationStatus and treat empty as a valid \"no relay log\" state if appropriate","Fix the producer (tablet) so it emits a valid or empty RelayLogPosition","Check for version skew between components writing the status proto"],"exampleFix":"// before\nstatus := replication.ProtoToReplicationStatus(s)\n// after\nif _, err := replication.DecodePosition(s.RelayLogPosition); err != nil {\n\treturn vterrors.Wrapf(err, \"invalid RelayLogPosition %q\", s.RelayLogPosition)\n}\nstatus := replication.ProtoToReplicationStatus(s)","handlingStrategy":"validation","validationCode":"if _, err := replication.DecodePosition(s.RelayLogPosition); err != nil {\n\treturn vterrors.Wrapf(err, \"invalid RelayLogPosition %q\", s.RelayLogPosition)\n}","typeGuard":null,"tryCatchPattern":"defer func() {\n\tif r := recover(); r != nil {\n\t\tlog.Warn(\"RelayLogPosition decode panic\", slog.Any(\"panic\", r), slog.String(\"raw\", s.RelayLogPosition))\n\t}\n}()","preventionTips":["Treat empty relay-log positions explicitly for replicas that never connected","Validate RelayLogPosition before ProtoToReplicationStatus in failover paths","Keep all tablets on compatible Vitess versions"],"tags":["panic","replication","proto","relay-log"],"backgroundTag":"invalid-position-in-proto","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}