// Stream implements BinlogStreamer.Stream().
func (bls *binlogConnStreamer) Stream(ctx *sync2.ServiceContext) (err error) {
	var stopPos myproto.ReplicationPosition
	defer func() {
		if err != nil {
			binlogStreamerErrors.Add("Stream", 1)
			err = fmt.Errorf("stream error @ %v, error: %v", stopPos, err)
			log.Error(err.Error())
		}
		log.Infof("Stream ended @ %v", stopPos)
	}()

	if bls.conn, err = mysqlctl.NewSlaveConnection(bls.mysqld); err != nil {
		return
	}
	defer bls.conn.Close()

	var events <-chan proto.BinlogEvent
	events, err = bls.conn.StartBinlogDump(bls.startPos)
	if err != nil {
		return
	}
	// parseEvents will loop until the events channel is closed, the
	// service enters the SHUTTING_DOWN state, or an error occurs.
	stopPos, err = bls.parseEvents(ctx, events)
	return
}
Example #2
0
// Stream starts streaming binlog events using the settings from NewBinlogStreamer().
func (bls *BinlogStreamer) Stream(ctx *sync2.ServiceContext) (err error) {
	stopPos := bls.startPos
	defer func() {
		if err != nil {
			err = fmt.Errorf("stream error @ %v: %v", stopPos, err)
		}
		log.Infof("stream ended @ %v, err = %v", stopPos, err)
	}()

	if bls.conn, err = mysqlctl.NewSlaveConnection(bls.mysqld); err != nil {
		return err
	}
	defer bls.conn.Close()

	// Check that the default charsets match, if the client specified one.
	// Note that BinlogStreamer uses the settings for the 'dba' user, while
	// BinlogPlayer uses the 'filtered' user, so those are the ones whose charset
	// must match. Filtered replication should still succeed even with a default
	// mismatch, since we pass per-statement charset info. However, Vitess in
	// general doesn't support servers with different default charsets, so we
	// treat it as a configuration error.
	if bls.clientCharset != nil {
		cs, err := bls.conn.GetCharset()
		if err != nil {
			return fmt.Errorf("can't get charset to check binlog stream: %v", err)
		}
		log.Infof("binlog stream client charset = %v, server charset = %v", *bls.clientCharset, cs)
		if cs != *bls.clientCharset {
			return fmt.Errorf("binlog stream client charset (%v) doesn't match server (%v)", *bls.clientCharset, cs)
		}
	}

	var events <-chan proto.BinlogEvent
	events, err = bls.conn.StartBinlogDump(bls.startPos)
	if err != nil {
		return err
	}
	// parseEvents will loop until the events channel is closed, the
	// service enters the SHUTTING_DOWN state, or an error occurs.
	stopPos, err = bls.parseEvents(ctx, events)
	return err
}