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

  1. Set the binlog player protocol to a registered value, typically 'grpc'
  2. Check for typos in the protocol field of the VReplication workflow / BinlogSource settings
  3. Ensure the package that registers factories (grpc binlog player client) is imported/linked into your binary
  4. 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

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


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