{"record":{"id":"63cc554dec7b991d","repo":"vitessio/vitess","slug":"no-binlog-player-client-factory-named-v","errorCode":null,"errorMessage":"no binlog player client factory named %v","messagePattern":"no binlog player client factory named (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/binlog/binlogplayer/binlog_player.go","lineNumber":339,"sourceCode":"\t\t\t\tlog.Error(fmt.Sprintf(\"Error writing stop state: %v\", err))\n\t\t\t}\n\t\t\treturn nil\n\t\tcase blp.position.AtLeast(blp.stopPosition):\n\t\t\tmsg := fmt.Sprintf(\"starting point %v greater than stopping point %v\", blp.position, blp.stopPosition)\n\t\t\tlog.Error(msg)\n\t\t\tif err := blp.setVReplicationState(binlogdatapb.VReplicationWorkflowState_Stopped, msg); err != nil {\n\t\t\t\tlog.Error(fmt.Sprintf(\"Error writing stop state: %v\", err))\n\t\t\t}\n\t\t\t// Don't return an error. Otherwise, it will keep retrying.\n\t\t\treturn nil\n\t\tdefault:\n\t\t\tlog.Info(fmt.Sprintf(\"Will stop player when reaching %v\", blp.stopPosition))\n\t\t}\n\t}\n\n\tclientFactory, ok := clientFactories[binlogPlayerProtocol]\n\tif !ok {\n\t\treturn fmt.Errorf(\"no binlog player client factory named %v\", binlogPlayerProtocol)\n\t}\n\tblplClient := clientFactory()\n\terr = blplClient.Dial(ctx, blp.tablet)\n\tif err != nil {\n\t\terr := fmt.Errorf(\"error dialing binlog server: %v\", err)\n\t\tlog.Error(fmt.Sprint(err))\n\t\treturn err\n\t}\n\tdefer blplClient.Close()\n\n\t// Get the current charset of our connection, so we can ask the stream server\n\t// to check that they match. The streamer will also only send per-statement\n\t// charset data if that statement's charset is different from what we specify.\n\tif dbClient, ok := blp.dbClient.(*dbClientImpl); ok {\n\t\tblp.defaultCharset, err = mysql.GetCharset(dbClient.dbConn)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"can't get charset to request binlog stream: %v\", err)\n\t\t}","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/binlog/binlogplayer/binlog_player.go#L321-L357","documentation":"applyEvents looks up a binlog player client factory by protocol (binlogPlayerProtocol, e.g. 'grpc'). The factories are registered at init time via RegisterClientFactory; an unknown protocol name means no factory was registered, so the player returns this error before dialing.","triggerScenarios":"ApplyBinlogEvents -> applyEvents with a protocol string not present in clientFactories — typically a typo or an unsupported/misspelled protocol in the binlog player settings.","commonSituations":"VReplication/filtered replication configured with a wrong protocol name; using a build where the grpc client factory file wasn't linked in; custom deployments overriding the default protocol.","solutions":["Set the binlog player protocol to a registered value, typically 'grpc'","Check for typos in the protocol field of the VReplication workflow / BinlogSource settings","Ensure the package that registers factories (grpc binlog player client) is imported/linked into your binary","List registered factories via clientFactories (or grep RegisterClientFactory) to see valid names"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if _, ok := binlogplayer.RegisteredClientFactory(protocol); !ok {\n    return fmt.Errorf(\"protocol %q is not a registered binlog player client factory\", protocol)\n}","typeGuard":null,"tryCatchPattern":"err := blp.ApplyBinlogEvents(ctx)\nif err != nil && strings.Contains(err.Error(), \"no binlog player client factory named\") {\n    // fix protocol name to \"grpc\" and retry\n}","preventionTips":["Always use the standard protocol name (grpc)","Check spelling of protocol fields in workflow configs","Ensure factory registration packages are linked into the binary","Grep RegisterClientFactory to discover valid protocol names"],"tags":["vreplication","configuration","binlog-player"],"backgroundTag":"unregistered-client-factory","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}