79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"go-common/app/infra/canal/conf"
|
|
"go-common/library/log"
|
|
)
|
|
|
|
func (ins *tidbInstance) proc(ch chan *msg) {
|
|
defer ins.waitTable.Done()
|
|
for {
|
|
msg, ok := <-ch
|
|
if !ok {
|
|
return
|
|
}
|
|
data, err := tidbMakeData(msg)
|
|
if err != nil {
|
|
log.Error("tidb MakeData(%+v) err: %+v", msg, err)
|
|
continue
|
|
}
|
|
if data == nil {
|
|
continue
|
|
}
|
|
for _, target := range ins.targets[msg.db] {
|
|
for {
|
|
if err = target.Send(context.TODO(), data.Key, data); err == nil {
|
|
stats.Incr("send_counter", target.Name(), msg.db, msg.tableRegexp, data.Action)
|
|
break
|
|
}
|
|
stats.Incr("retry_counter", target.Name(), msg.db, msg.tableRegexp, data.Action)
|
|
log.Error("tidb %s scheme(%s) pub fail,add to retry", target.Name(), msg.db)
|
|
time.Sleep(time.Second)
|
|
}
|
|
log.Info("tidb %s pub(key:%s, value:%+v) succeed", target.Name(), data.Key, data)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (ins *tidbInstance) syncproc() {
|
|
defer ins.waitConsume.Done()
|
|
for {
|
|
if ins.closed {
|
|
return
|
|
}
|
|
time.Sleep(time.Second * 5)
|
|
ins.sync()
|
|
}
|
|
}
|
|
|
|
func (c *Canal) tidbEventproc() {
|
|
ech := conf.TiDBEvent()
|
|
for {
|
|
insc := <-ech
|
|
if insc == nil {
|
|
continue
|
|
}
|
|
c.tidbInsl.Lock()
|
|
if old, ok := c.tidbInstances[insc.Name]; ok {
|
|
old.close()
|
|
}
|
|
c.tidbInsl.Unlock()
|
|
ins, err := newTiDBInstance(c, insc)
|
|
if err != nil {
|
|
log.Error("new instance error(%v)", err)
|
|
c.sendWx(fmt.Sprintf("reload tidb canal instance(%s) failed error(%v)", ins.String(), err))
|
|
continue
|
|
}
|
|
c.tidbInsl.Lock()
|
|
c.tidbInstances[insc.Name] = ins
|
|
c.tidbInsl.Unlock()
|
|
go ins.start()
|
|
log.Info("reload tidb canal instance(%s) success", ins.String())
|
|
c.sendWx(fmt.Sprintf("reload tidb canal instance(%s) success", ins.String()))
|
|
}
|
|
}
|