Implement timeouts and graceful shutdown

This commit is contained in:
2018-11-15 11:34:27 +01:00
parent a06e03473b
commit 68567fad6e
4 changed files with 69 additions and 40 deletions
+3 -25
View File
@@ -59,8 +59,8 @@ func (r *EnhancedReader) WhitelistTables(database string, tables ...string) erro
}
// ReadEvent reads next event from the binary log.
func (r *EnhancedReader) ReadEvent() (*Event, error) {
evt, err := r.reader.ReadEvent()
func (r *EnhancedReader) ReadEvent(ctx context.Context) (*Event, error) {
evt, err := r.reader.ReadEvent(ctx)
if err != nil {
return nil, err
}
@@ -78,30 +78,8 @@ func (r *EnhancedReader) ReadEvent() (*Event, error) {
// NextRowsEvent returns the next rows event for a whitelisted table. It blocks
// until next event is received or context is cancelled.
func (r *EnhancedReader) NextRowsEvent(ctx context.Context) (*EnhancedRowsEvent, error) {
evtch := make(chan *EnhancedRowsEvent)
errch := make(chan error)
go func() {
evt, err := r.nextRowsEvent()
if err != nil {
errch <- err
} else {
evtch <- evt
}
}()
select {
case evt := <-evtch:
return evt, nil
case err := <-errch:
return nil, err
case <-ctx.Done():
return nil, nil
}
}
func (r *EnhancedReader) nextRowsEvent() (*EnhancedRowsEvent, error) {
for {
evt, err := r.reader.ReadEvent()
evt, err := r.reader.ReadEvent(ctx)
if err != nil {
return nil, err
}
+4 -2
View File
@@ -1,6 +1,8 @@
package reader
import (
"context"
"github.com/juju/errors"
"github.com/localhots/bocadillo/binlog"
"github.com/localhots/bocadillo/reader/slave"
@@ -61,8 +63,8 @@ func New(dsn string, sc slave.Config) (*Reader, error) {
}
// ReadEvent reads next event from the binary log.
func (r *Reader) ReadEvent() (*Event, error) {
connBuff, err := r.conn.ReadPacket()
func (r *Reader) ReadEvent(ctx context.Context) (*Event, error) {
connBuff, err := r.conn.ReadPacket(ctx)
if err != nil {
return nil, errors.Annotate(err, "read next event")
}
+3 -2
View File
@@ -1,6 +1,7 @@
package slave
import (
"context"
"database/sql/driver"
"fmt"
"io"
@@ -65,8 +66,8 @@ func Connect(dsn string, conf Config) (*Conn, error) {
// ReadPacket reads next packet from the server and processes the first status
// byte.
func (c *Conn) ReadPacket() ([]byte, error) {
data, err := c.conn.ReadPacket()
func (c *Conn) ReadPacket(ctx context.Context) ([]byte, error) {
data, err := c.conn.ReadPacket(ctx)
if err != nil {
return nil, err
}