// WaitBlpPosition will wait for the filtered replication to reach at least // the provided position. func WaitBlpPosition(mysqld MysqlDaemon, bp *blproto.BlpPosition, waitTimeout time.Duration) error { timeOut := time.Now().Add(waitTimeout) for { if time.Now().After(timeOut) { break } cmd := binlogplayer.QueryBlpCheckpoint(bp.Uid) qr, err := mysqld.FetchSuperQuery(cmd) if err != nil { return err } if len(qr.Rows) != 1 { return fmt.Errorf("QueryBlpCheckpoint(%v) returned unexpected row count: %v", bp.Uid, len(qr.Rows)) } var pos proto.ReplicationPosition if !qr.Rows[0][0].IsNull() { pos, err = proto.DecodeReplicationPosition(qr.Rows[0][0].String()) if err != nil { return err } } if pos.AtLeast(bp.Position) { return nil } log.Infof("Sleeping 1 second waiting for binlog replication(%v) to catch up: %v != %v", bp.Uid, pos, bp.Position) time.Sleep(1 * time.Second) } return fmt.Errorf("WaitBlpPosition(%v) timed out", bp.Uid) }
// WaitBlpPos will wait for the filtered replication to reach at least // the provided position. func (mysqld *Mysqld) WaitBlpPos(bp *blproto.BlpPosition, waitTimeout time.Duration) error { timeOut := time.Now().Add(waitTimeout) for { if time.Now().After(timeOut) { break } cmd := binlogplayer.QueryBlpCheckpoint(bp.Uid) qr, err := mysqld.fetchSuperQuery(cmd) if err != nil { return err } if len(qr.Rows) != 1 { return fmt.Errorf("WaitBlpPos(%v) returned unexpected row count: %v", bp.Uid, len(qr.Rows)) } var gtid proto.GTID if !qr.Rows[0][0].IsNull() { gtid, err = proto.DecodeGTID(qr.Rows[0][0].String()) if err != nil { return err } } if gtid == bp.GTIDField.Value { return nil } log.Infof("Sleeping 1 second waiting for binlog replication(%v) to catch up: %v != %v", bp.Uid, gtid, bp.GTIDField) time.Sleep(1 * time.Second) } return fmt.Errorf("WaitBlpPos(%v) timed out", bp.Uid) }
// WaitBlpPosition waits until a specific filtered replication position is // reached. func (agent *ActionAgent) WaitBlpPosition(ctx context.Context, blpPosition *tabletmanagerdatapb.BlpPosition, waitTime time.Duration) error { if err := agent.lock(ctx); err != nil { return err } defer agent.unlock() waitCtx, cancel := context.WithTimeout(ctx, waitTime) defer cancel() return mysqlctl.WaitBlpPosition(waitCtx, agent.MysqlDaemon, binlogplayer.QueryBlpCheckpoint(blpPosition.Uid), blpPosition.Position) }
// WaitBlpPosition waits until a specific filtered replication position is // reached. // Should be called under RPCWrapLock. func (agent *ActionAgent) WaitBlpPosition(ctx context.Context, blpPosition *tabletmanagerdatapb.BlpPosition, waitTime time.Duration) error { return mysqlctl.WaitBlpPosition(agent.MysqlDaemon, binlogplayer.QueryBlpCheckpoint(blpPosition.Uid), blpPosition.Position, waitTime) }