checks to Add new app

This commit is contained in:
Mayuresh Gaitonde
2021-12-15 16:44:13 -08:00
parent 62db2e5af7
commit c860f3c50e

View File

@@ -58,7 +58,7 @@ type appMon struct {
app *App app *App
done chan bool done chan bool
announced bool announced bool
checkOn bool runLoopOn bool
} }
// MonitorMgr manages the lifecycle of registered apps // MonitorMgr manages the lifecycle of registered apps
@@ -154,11 +154,12 @@ func (m *MonitorMgr) consulMon() {
func (m *MonitorMgr) Add(app *App) { func (m *MonitorMgr) Add(app *App) {
// check if already running // check if already running
m.monMu.Lock() m.monMu.Lock()
var existing *appMon
for _, appMon := range m.monitors { for _, appMon := range m.monitors {
if appMon.app.Equal(app) && appMon.checkOn { if appMon.app.Equal(app) {
glog.V(2).Infof("App %s already exists", app.Name) glog.Infof("App %s already exists", app.Name)
m.monMu.Unlock() existing = appMon
return break
} }
if appMon.app.Vip.Net.String() == app.Vip.Net.String() && appMon.app.Name != app.Name { if appMon.app.Vip.Net.String() == app.Vip.Net.String() && appMon.app.Name != app.Name {
glog.Errorf("Error: Vip %s is already being announced by app: %s", app.Vip.Net.String(), appMon.app.Name) glog.Errorf("Error: Vip %s is already being announced by app: %s", app.Vip.Net.String(), appMon.app.Name)
@@ -167,11 +168,19 @@ func (m *MonitorMgr) Add(app *App) {
} }
} }
m.monMu.Unlock() m.monMu.Unlock()
m.Remove(app.Name) // if the same app already exists but its run loop is not running,
appMon := &appMon{app: app, done: make(chan bool)} // then just restart the run loop
m.monitors[app.Name] = appMon if existing != nil {
go m.runLoop(appMon) if !existing.runLoopOn {
glog.Infof("Registered a new app: %v", app.String()) go m.runLoop(existing)
}
} else {
// else add a new app and start its run loop
appMon := &appMon{app: app, done: make(chan bool)}
m.monitors[app.Name] = appMon
go m.runLoop(appMon)
glog.Infof("Registered a new app: %v", app.String())
}
} }
// Remove removes an app from monitor manager, stops BGP // Remove removes an app from monitor manager, stops BGP
@@ -180,7 +189,7 @@ func (m *MonitorMgr) Remove(appName string) {
m.monMu.Lock() m.monMu.Lock()
defer m.monMu.Unlock() defer m.monMu.Unlock()
if a, ok := m.monitors[appName]; ok { if a, ok := m.monitors[appName]; ok {
if a.checkOn { if a.runLoopOn {
close(a.done) close(a.done)
} }
if a.announced { if a.announced {
@@ -272,7 +281,8 @@ func (m *MonitorMgr) checkCond(am *appMon) error {
// runLoop periodically checks if an app passes healthchecks // runLoop periodically checks if an app passes healthchecks
// and needs VIP announcement // and needs VIP announcement
func (m *MonitorMgr) runLoop(am *appMon) { func (m *MonitorMgr) runLoop(am *appMon) {
am.checkOn = true glog.Infof("Starting run-loop for app %s", am.app.Name)
am.runLoopOn = true
if err := m.checkCond(am); err != nil { if err := m.checkCond(am); err != nil {
glog.Errorln(err) glog.Errorln(err)
} }
@@ -285,8 +295,8 @@ func (m *MonitorMgr) runLoop(am *appMon) {
glog.Errorln(err) glog.Errorln(err)
} }
case <-am.done: case <-am.done:
glog.V(2).Infof("Exit run-loop for app: %s", am.app.Name) glog.Infof("Exit run-loop for app: %s", am.app.Name)
am.checkOn = false am.runLoopOn = false
return return
} }
} }
@@ -299,7 +309,7 @@ func (m *MonitorMgr) CloseAll() {
glog.Errorf("Failed to shut-down BGP: %v", err) glog.Errorf("Failed to shut-down BGP: %v", err)
} }
for _, am := range m.monitors { for _, am := range m.monitors {
if am.checkOn { if am.runLoopOn {
close(am.done) close(am.done)
} }
deleteLoopback(am.app.Vip.Net) deleteLoopback(am.app.Vip.Net)