// WaitBlpPosition will wait for the filtered replication to reach at least // the provided position. func WaitBlpPosition(ctx context.Context, mysqld MysqlDaemon, sql string, replicationPosition string) error { position, err := replication.DecodePosition(replicationPosition) if err != nil { return err } for { select { case <-ctx.Done(): return ctx.Err() default: } qr, err := mysqld.FetchSuperQuery(ctx, sql) if err != nil { return err } if len(qr.Rows) != 1 { return fmt.Errorf("QueryBlpCheckpoint(%v) returned unexpected row count: %v", sql, len(qr.Rows)) } var pos replication.Position if !qr.Rows[0][0].IsNull() { pos, err = replication.DecodePosition(qr.Rows[0][0].String()) if err != nil { return err } } if pos.AtLeast(position) { return nil } log.Infof("Sleeping 1 second waiting for binlog replication(%v) to catch up: %v != %v", sql, pos, position) time.Sleep(1 * time.Second) } }
// WaitBlpPosition will wait for the filtered replication to reach at least // the provided position. func WaitBlpPosition(mysqld MysqlDaemon, sql string, replicationPosition string, waitTimeout time.Duration) error { position, err := replication.DecodePosition(replicationPosition) if err != nil { return err } timeOut := time.Now().Add(waitTimeout) for { if time.Now().After(timeOut) { break } qr, err := mysqld.FetchSuperQuery(sql) if err != nil { return err } if len(qr.Rows) != 1 { return fmt.Errorf("QueryBlpCheckpoint(%v) returned unexpected row count: %v", sql, len(qr.Rows)) } var pos replication.Position if !qr.Rows[0][0].IsNull() { pos, err = replication.DecodePosition(qr.Rows[0][0].String()) if err != nil { return err } } if pos.AtLeast(position) { return nil } log.Infof("Sleeping 1 second waiting for binlog replication(%v) to catch up: %v != %v", sql, pos, position) time.Sleep(1 * time.Second) } return fmt.Errorf("WaitBlpPosition(%v) timed out", sql) }