mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 16:57:51 +08:00
NET-507 (#2506)
* NET-507 * Fixed server restart changing the node expiration date to the defaults. * Removed expired nodes removal from zombie cleanup routine. * Added a new expired nodes deletion routine which removes expired nodes every hour. * NET-507 suggested changes * Possible fix for zombie nodes upon node deletion from the UI. * Suggested changes implemented for expired nodes deletion go routine. * NET-507 typo fix * typo fix for DeleteNode purge parameter
This commit is contained in:
@@ -328,13 +328,13 @@ func deleteHostFromNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
// unset all the relayed nodes
|
// unset all the relayed nodes
|
||||||
logic.SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
|
logic.SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
|
||||||
}
|
}
|
||||||
node.Action = models.NODE_DELETE
|
logger.Log(1, "deleting node", node.ID.String(), "from host", currHost.Name)
|
||||||
node.PendingDelete = true
|
|
||||||
logger.Log(1, "deleting node", node.ID.String(), "from host", currHost.Name)
|
|
||||||
if err := logic.DeleteNode(node, forceDelete); err != nil {
|
if err := logic.DeleteNode(node, forceDelete); err != nil {
|
||||||
logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete node"), "internal"))
|
logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete node"), "internal"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
node.Action = models.NODE_DELETE
|
||||||
|
node.PendingDelete = true
|
||||||
// notify node change
|
// notify node change
|
||||||
runUpdates(node, false)
|
runUpdates(node, false)
|
||||||
go func() { // notify of peer change
|
go func() { // notify of peer change
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package logic
|
package logic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -20,6 +21,7 @@ import (
|
|||||||
"github.com/gravitl/netmaker/models"
|
"github.com/gravitl/netmaker/models"
|
||||||
"github.com/gravitl/netmaker/servercfg"
|
"github.com/gravitl/netmaker/servercfg"
|
||||||
"github.com/gravitl/netmaker/validation"
|
"github.com/gravitl/netmaker/validation"
|
||||||
|
"golang.org/x/exp/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -444,6 +446,35 @@ func GetAllNodesAPI(nodes []models.Node) []models.ApiNode {
|
|||||||
return apiNodes[:]
|
return apiNodes[:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteExpiredNodes - goroutine which deletes nodes which are expired
|
||||||
|
func DeleteExpiredNodes(ctx context.Context, peerUpdate chan *models.Node) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
case <-time.After(time.Hour):
|
||||||
|
// Delete Expired Nodes Every Hour
|
||||||
|
allnodes, err := GetAllNodes()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("failed to retrieve all nodes", "error", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, node := range allnodes {
|
||||||
|
if time.Now().After(node.ExpirationDateTime) {
|
||||||
|
if err := DeleteNode(&node, false); err != nil {
|
||||||
|
slog.Error("error deleting expired node", "nodeid", node.ID.String(), "error", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
node.Action = models.NODE_DELETE
|
||||||
|
node.PendingDelete = true
|
||||||
|
peerUpdate <- &node
|
||||||
|
slog.Info("deleting expired node", "nodeid", node.ID.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// == PRO ==
|
// == PRO ==
|
||||||
|
|
||||||
func updateProNodeACLS(node *models.Node) error {
|
func updateProNodeACLS(node *models.Node) error {
|
||||||
|
@@ -37,7 +37,7 @@ func CheckZombies(newnode *models.Node) {
|
|||||||
//skip self
|
//skip self
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if node.HostID == newnode.HostID || time.Now().After(node.ExpirationDateTime) {
|
if node.HostID == newnode.HostID {
|
||||||
logger.Log(0, "adding ", node.ID.String(), " to zombie list")
|
logger.Log(0, "adding ", node.ID.String(), " to zombie list")
|
||||||
newZombie <- node.ID
|
newZombie <- node.ID
|
||||||
}
|
}
|
||||||
@@ -97,7 +97,7 @@ func ManageZombies(ctx context.Context, peerUpdate chan *models.Node) {
|
|||||||
zombies = append(zombies[:i], zombies[i+1:]...)
|
zombies = append(zombies[:i], zombies[i+1:]...)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if time.Since(node.LastCheckIn) > time.Minute*ZOMBIE_DELETE_TIME || time.Now().After(node.ExpirationDateTime) {
|
if time.Since(node.LastCheckIn) > time.Minute*ZOMBIE_DELETE_TIME {
|
||||||
if err := DeleteNode(&node, true); err != nil {
|
if err := DeleteNode(&node, true); err != nil {
|
||||||
logger.Log(1, "error deleting zombie node", zombies[i].String(), err.Error())
|
logger.Log(1, "error deleting zombie node", zombies[i].String(), err.Error())
|
||||||
continue
|
continue
|
||||||
|
1
main.go
1
main.go
@@ -168,6 +168,7 @@ func runMessageQueue(wg *sync.WaitGroup, ctx context.Context) {
|
|||||||
go func() {
|
go func() {
|
||||||
peerUpdate := make(chan *models.Node)
|
peerUpdate := make(chan *models.Node)
|
||||||
go logic.ManageZombies(ctx, peerUpdate)
|
go logic.ManageZombies(ctx, peerUpdate)
|
||||||
|
go logic.DeleteExpiredNodes(ctx, peerUpdate)
|
||||||
for nodeUpdate := range peerUpdate {
|
for nodeUpdate := range peerUpdate {
|
||||||
if err := mq.NodeUpdate(nodeUpdate); err != nil {
|
if err := mq.NodeUpdate(nodeUpdate); err != nil {
|
||||||
logger.Log(0, "failed to send peer update for deleted node: ", nodeUpdate.ID.String(), err.Error())
|
logger.Log(0, "failed to send peer update for deleted node: ", nodeUpdate.ID.String(), err.Error())
|
||||||
|
@@ -341,7 +341,9 @@ func (node *Node) SetLastPeerUpdate() {
|
|||||||
|
|
||||||
// Node.SetExpirationDateTime - sets node expiry time
|
// Node.SetExpirationDateTime - sets node expiry time
|
||||||
func (node *Node) SetExpirationDateTime() {
|
func (node *Node) SetExpirationDateTime() {
|
||||||
node.ExpirationDateTime = time.Now().Add(TEN_YEARS_IN_SECONDS)
|
if node.ExpirationDateTime.IsZero() {
|
||||||
|
node.ExpirationDateTime = time.Now().Add(TEN_YEARS_IN_SECONDS)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Node.SetDefaultName - sets a random name to node
|
// Node.SetDefaultName - sets a random name to node
|
||||||
|
Reference in New Issue
Block a user