Skip to content
Snippets Groups Projects
Unverified Commit 1d66c92d authored by Maximilian Wilhelm's avatar Maximilian Wilhelm Committed by GitHub
Browse files

Merge pull request #274 from bio-routing/fix/bmp_reconnect

Check if router was removed before trying to reconnect
parents 52c65919 8aeb693b
Branches
Tags v0.0.2-pre3
No related merge requests found
...@@ -103,7 +103,7 @@ func (r *Router) Address() net.IP { ...@@ -103,7 +103,7 @@ func (r *Router) Address() net.IP {
return r.address return r.address
} }
func (r *Router) serve(con net.Conn) { func (r *Router) serve(con net.Conn) error {
r.con = con r.con = con
r.runMu.Lock() r.runMu.Lock()
defer r.con.Close() defer r.con.Close()
...@@ -112,14 +112,13 @@ func (r *Router) serve(con net.Conn) { ...@@ -112,14 +112,13 @@ func (r *Router) serve(con net.Conn) {
for { for {
select { select {
case <-r.stop: case <-r.stop:
return return nil
default: default:
} }
msg, err := recvBMPMsg(r.con) msg, err := recvBMPMsg(r.con)
if err != nil { if err != nil {
r.logger.Errorf("Unable to get message: %v", err) return errors.Wrap(err, "Unable to get message")
return
} }
r.processMsg(msg) r.processMsg(msg)
......
...@@ -46,6 +46,10 @@ func NewServer() *BMPServer { ...@@ -46,6 +46,10 @@ func NewServer() *BMPServer {
return b return b
} }
func conString(host string, port uint16) string {
return fmt.Sprintf("%s:%d", host, port)
}
// AddRouter adds a router to which we connect with BMP // AddRouter adds a router to which we connect with BMP
func (b *BMPServer) AddRouter(addr net.IP, port uint16) { func (b *BMPServer) AddRouter(addr net.IP, port uint16) {
b.gloablMu.Lock() b.gloablMu.Lock()
...@@ -56,10 +60,26 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) { ...@@ -56,10 +60,26 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) {
go func(r *Router) { go func(r *Router) {
for { for {
<-r.reconnectTimer.C select {
case <-r.stop:
log.WithFields(log.Fields{
"component": "bmp_server",
"address": conString(r.address.String(), r.port),
}).Info("Stop event: Stopping reconnect routine")
return
case <-r.reconnectTimer.C:
log.WithFields(log.Fields{
"component": "bmp_server",
"address": conString(r.address.String(), r.port),
}).Info("Reconnect timer expired: Establishing connection")
}
c, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", r.address.String(), r.port), r.dialTimeout) c, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", r.address.String(), r.port), r.dialTimeout)
if err != nil { if err != nil {
log.Infof("Unable to connect to BMP router: %v", err) log.WithError(err).WithFields(log.Fields{
"component": "bmp_server",
"address": conString(r.address.String(), r.port),
}).Info("Unable to connect to BMP router")
if r.reconnectTime == 0 { if r.reconnectTime == 0 {
r.reconnectTime = r.reconnectTimeMin r.reconnectTime = r.reconnectTimeMin
} else if r.reconnectTime < r.reconnectTimeMax { } else if r.reconnectTime < r.reconnectTimeMax {
...@@ -72,9 +92,22 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) { ...@@ -72,9 +92,22 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) {
atomic.StoreUint32(&r.established, 1) atomic.StoreUint32(&r.established, 1)
r.reconnectTime = r.reconnectTimeMin r.reconnectTime = r.reconnectTimeMin
r.reconnectTimer = time.NewTimer(time.Second * time.Duration(r.reconnectTime)) r.reconnectTimer = time.NewTimer(time.Second * time.Duration(r.reconnectTime))
log.Infof("Connected to %s", r.address.String()) log.WithFields(log.Fields{
r.serve(c) "component": "bmp_server",
"address": conString(r.address.String(), r.port),
}).Info("Connected")
err = r.serve(c)
atomic.StoreUint32(&r.established, 0) atomic.StoreUint32(&r.established, 0)
if err != nil {
r.logger.WithError(err).Error("r.serve() failed")
} else {
log.WithFields(log.Fields{
"component": "bmp_server",
"address": conString(r.address.String(), r.port),
}).Info("r.Serve returned without error. Stopping reconnect routine")
return
}
} }
}(r) }(r)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment