vitessio/vitess · error
no binlog player client factory named %v
Error message
no binlog player client factory named %v
What it means
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.
Source
Thrown at go/vt/binlog/binlogplayer/binlog_player.go:339
log.Error(fmt.Sprintf("Error writing stop state: %v", err))
}
return nil
case blp.position.AtLeast(blp.stopPosition):
msg := fmt.Sprintf("starting point %v greater than stopping point %v", blp.position, blp.stopPosition)
log.Error(msg)
if err := blp.setVReplicationState(binlogdatapb.VReplicationWorkflowState_Stopped, msg); err != nil {
log.Error(fmt.Sprintf("Error writing stop state: %v", err))
}
// Don't return an error. Otherwise, it will keep retrying.
return nil
default:
log.Info(fmt.Sprintf("Will stop player when reaching %v", blp.stopPosition))
}
}
clientFactory, ok := clientFactories[binlogPlayerProtocol]
if !ok {
return fmt.Errorf("no binlog player client factory named %v", binlogPlayerProtocol)
}
blplClient := clientFactory()
err = blplClient.Dial(ctx, blp.tablet)
if err != nil {
err := fmt.Errorf("error dialing binlog server: %v", err)
log.Error(fmt.Sprint(err))
return err
}
defer blplClient.Close()
// Get the current charset of our connection, so we can ask the stream server
// to check that they match. The streamer will also only send per-statement
// charset data if that statement's charset is different from what we specify.
if dbClient, ok := blp.dbClient.(*dbClientImpl); ok {
blp.defaultCharset, err = mysql.GetCharset(dbClient.dbConn)
if err != nil {
return fmt.Errorf("can't get charset to request binlog stream: %v", err)
}View on GitHub (pinned to 01a25a7d17)
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
Defensive patterns
Strategy: validation
Validate before calling
if _, ok := binlogplayer.RegisteredClientFactory(protocol); !ok {
return fmt.Errorf("protocol %q is not a registered binlog player client factory", protocol)
} Try / catch
err := blp.ApplyBinlogEvents(ctx)
if err != nil && strings.Contains(err.Error(), "no binlog player client factory named") {
// fix protocol name to "grpc" and retry
} Prevention
- 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
When it happens
Trigger: ApplyBinlogEvents -> applyEvents with a protocol string not present in clientFactories — typically a typo or an unsupported/misspelled protocol in the binlog player settings.
Common situations: 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.
Related errors
- stream needs a position or a table to copy
- partial row image encountered: ensure binlog_row_image is se
- failed to instantiate throttler: %v
- can't get charset to request binlog stream: %v
- error received from Stream %v
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/63cc554dec7b991d.
Report an issue: GitHub.