refactor server pings

This commit is contained in:
Matthew R Kasun 2022-01-27 09:48:32 -05:00
parent 76ae673363
commit 513f85ede7
5 changed files with 39 additions and 14 deletions

View file

@ -71,6 +71,7 @@ func (s *NodeServiceServer) CreateNode(ctx context.Context, req *nodepb.Object)
var serverAddrs = make([]models.ServerAddr, len(serverNodes))
for i, server := range serverNodes {
serverAddrs[i] = models.ServerAddr{
ID: server.ID,
IsLeader: logic.IsLeader(&server),
Address: server.Address,
}

View file

@ -57,7 +57,7 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
}
peers = append(peers, peerData)
if peer.IsServer == "yes" {
serverNodeAddresses = append(serverNodeAddresses, models.ServerAddr{IsLeader: IsLeader(&peer), Address: peer.Address})
serverNodeAddresses = append(serverNodeAddresses, models.ServerAddr{ID: peer.ID, IsLeader: IsLeader(&peer), Address: peer.Address})
}
}
peerUpdate.Network = node.Network

View file

@ -172,6 +172,7 @@ type Telemetry struct {
// ServerAddr - to pass to clients to tell server addresses and if it's the leader or not
type ServerAddr struct {
ID string `json:"id" bson:"id" yaml:"id"`
IsLeader bool `json:"isleader" bson:"isleader" yaml:"isleader"`
Address string `json:"address" bson:"address" yaml:"address"`
}

View file

@ -160,6 +160,7 @@ func SetupMQTT() mqtt.Client {
if token := client.Connect(); token.Wait() && token.Error() != nil {
log.Fatal(token.Error())
}
logger.Log(2, "connected to message queue", broker)
return client
}
@ -170,18 +171,29 @@ func Keepalive(ctx context.Context) {
case <-ctx.Done():
return
case <-time.After(time.Second * KEEPALIVE_TIMEOUT):
nodes, err := logic.GetAllNodes()
if err != nil {
logger.Log(1, "error retrieving nodes for keepalive", err.Error())
}
client := SetupMQTT()
for _, node := range nodes {
if token := client.Publish("serverkeepalive/"+node.ID, 0, false, servercfg.GetVersion()); token.Wait() && token.Error() != nil {
logger.Log(1, "error publishing server keepalive", token.Error().Error())
networks, err := logic.GetNetworks()
if err != nil {
logger.Log(1, "error retrieving networks for keepalive", err.Error())
}
for _, network := range networks {
var id string
for _, servAddr := range network.DefaultServerAddrs {
if servAddr.IsLeader {
id = servAddr.ID
}
}
if id != "" {
logger.Log(0, "leader not defined for network", network.NetID)
continue
}
if token := client.Publish("serverkeepalive/"+id, 0, false, servercfg.GetVersion()); token.Wait() && token.Error() != nil {
logger.Log(1, "error publishing server keepalive for network", network.NetID, token.Error().Error())
} else {
logger.Log(2, "keepalive sent for network", network.NetID)
}
client.Disconnect(MQ_DISCONNECT)
}
logger.Log(2, "keepalive sent to all nodes")
}
}
}

View file

@ -102,11 +102,21 @@ func MessageQueue(ctx context.Context, network string) {
if cfg.DebugOn {
ncutils.Log("subscribed to node updates for node " + cfg.Node.Name + " update/peers/" + cfg.Node.ID)
}
if token := client.Subscribe("serverkeepalive/"+cfg.Node.ID, 0, mqtt.MessageHandler(ServerKeepAlive)); token.Wait() && token.Error() != nil {
log.Fatal(token.Error())
}
if cfg.DebugOn {
ncutils.Log("subscribed to server keepalives")
var id string
for _, server := range cfg.NetworkSettings.DefaultServerAddrs {
if server.IsLeader {
id = server.ID
}
if server.Address != "" {
if token := client.Subscribe("serverkeepalive/"+id, 0, mqtt.MessageHandler(ServerKeepAlive)); token.Wait() && token.Error() != nil {
log.Fatal(token.Error())
}
if cfg.DebugOn {
ncutils.Log("subscribed to server keepalives")
}
} else {
ncutils.Log("leader not defined for network" + cfg.Network)
}
}
defer client.Disconnect(250)
go MonitorKeepalive(ctx, client, &cfg)
@ -270,6 +280,7 @@ func MonitorKeepalive(ctx context.Context, client mqtt.Client, cfg *config.Clien
func ServerKeepAlive(client mqtt.Client, msg mqtt.Message) {
serverid := string(msg.Payload())
keepalive <- serverid
ncutils.Log("keepalive from server")
}
// Resubscribe --- handles resubscribing if needed