mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-11-04 01:51:04 +01:00 
			
		
		
		
	Remove unstable update channel, replace with state updates
This commit is contained in:
		
							parent
							
								
									8abc7575cd
								
							
						
					
					
						commit
						a01a0d1039
					
				
							
								
								
									
										6
									
								
								app.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								app.go
									
									
									
									
									
								
							@ -65,9 +65,6 @@ type Headscale struct {
 | 
			
		||||
	aclPolicy *ACLPolicy
 | 
			
		||||
	aclRules  *[]tailcfg.FilterRule
 | 
			
		||||
 | 
			
		||||
	clientsUpdateChannels     sync.Map
 | 
			
		||||
	clientsUpdateChannelMutex sync.Mutex
 | 
			
		||||
 | 
			
		||||
	lastStateChange sync.Map
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -145,10 +142,9 @@ func (h *Headscale) expireEphemeralNodesWorker() {
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.Error().Err(err).Str("machine", m.Name).Msg("🤮 Cannot delete ephemeral machine from the database")
 | 
			
		||||
				}
 | 
			
		||||
				updateRequestsFromNode.WithLabelValues("ephemeral-node-update").Inc()
 | 
			
		||||
				h.notifyChangesToPeers(&m)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		h.setLastStateChangeToNow(ns.Name)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										106
									
								
								machine.go
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								machine.go
									
									
									
									
									
								
							@ -2,7 +2,6 @@ package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
@ -214,111 +213,6 @@ func (m *Machine) GetHostInfo() (*tailcfg.Hostinfo, error) {
 | 
			
		||||
	return &hostinfo, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) notifyChangesToPeers(m *Machine) {
 | 
			
		||||
	peers, err := h.getPeers(m)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error().
 | 
			
		||||
			Str("func", "notifyChangesToPeers").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Msgf("Error getting peers: %s", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, peer := range peers {
 | 
			
		||||
		log.Info().
 | 
			
		||||
			Str("func", "notifyChangesToPeers").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Str("peer", peer.Name).
 | 
			
		||||
			Str("address", peer.IPAddress).
 | 
			
		||||
			Msgf("Notifying peer %s (%s)", peer.Name, peer.IPAddress)
 | 
			
		||||
		err := h.sendRequestOnUpdateChannel(&peer)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Info().
 | 
			
		||||
				Str("func", "notifyChangesToPeers").
 | 
			
		||||
				Str("machine", m.Name).
 | 
			
		||||
				Str("peer", peer.Name).
 | 
			
		||||
				Msgf("Peer %s does not have an open update client, skipping.", peer.Name)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		log.Trace().
 | 
			
		||||
			Str("func", "notifyChangesToPeers").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Str("peer", peer.Name).
 | 
			
		||||
			Str("address", peer.IPAddress).
 | 
			
		||||
			Msgf("Notified peer %s (%s)", peer.Name, peer.IPAddress)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) getOrOpenUpdateChannel(m *Machine) <-chan struct{} {
 | 
			
		||||
	var updateChan chan struct{}
 | 
			
		||||
	if storedChan, ok := h.clientsUpdateChannels.Load(m.ID); ok {
 | 
			
		||||
		if unwrapped, ok := storedChan.(chan struct{}); ok {
 | 
			
		||||
			updateChan = unwrapped
 | 
			
		||||
		} else {
 | 
			
		||||
			log.Error().
 | 
			
		||||
				Str("handler", "openUpdateChannel").
 | 
			
		||||
				Str("machine", m.Name).
 | 
			
		||||
				Msg("Failed to convert update channel to struct{}")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		log.Debug().
 | 
			
		||||
			Str("handler", "openUpdateChannel").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Msg("Update channel not found, creating")
 | 
			
		||||
 | 
			
		||||
		updateChan = make(chan struct{})
 | 
			
		||||
		h.clientsUpdateChannels.Store(m.ID, updateChan)
 | 
			
		||||
	}
 | 
			
		||||
	return updateChan
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) closeUpdateChannel(m *Machine) {
 | 
			
		||||
	h.clientsUpdateChannelMutex.Lock()
 | 
			
		||||
	defer h.clientsUpdateChannelMutex.Unlock()
 | 
			
		||||
 | 
			
		||||
	if storedChan, ok := h.clientsUpdateChannels.Load(m.ID); ok {
 | 
			
		||||
		if unwrapped, ok := storedChan.(chan struct{}); ok {
 | 
			
		||||
			close(unwrapped)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	h.clientsUpdateChannels.Delete(m.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) sendRequestOnUpdateChannel(m *Machine) error {
 | 
			
		||||
	h.clientsUpdateChannelMutex.Lock()
 | 
			
		||||
	defer h.clientsUpdateChannelMutex.Unlock()
 | 
			
		||||
 | 
			
		||||
	pUp, ok := h.clientsUpdateChannels.Load(uint64(m.ID))
 | 
			
		||||
	if ok {
 | 
			
		||||
		log.Info().
 | 
			
		||||
			Str("func", "requestUpdate").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Msgf("Notifying peer %s", m.Name)
 | 
			
		||||
 | 
			
		||||
		if update, ok := pUp.(chan struct{}); ok {
 | 
			
		||||
			log.Trace().
 | 
			
		||||
				Str("func", "requestUpdate").
 | 
			
		||||
				Str("machine", m.Name).
 | 
			
		||||
				Msgf("Update channel is %#v", update)
 | 
			
		||||
 | 
			
		||||
			updateRequestsToNode.Inc()
 | 
			
		||||
			update <- struct{}{}
 | 
			
		||||
 | 
			
		||||
			log.Trace().
 | 
			
		||||
				Str("func", "requestUpdate").
 | 
			
		||||
				Str("machine", m.Name).
 | 
			
		||||
				Msgf("Notified machine %s", m.Name)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		err := errors.New("machine does not have an open update channel")
 | 
			
		||||
		log.Info().
 | 
			
		||||
			Str("func", "requestUpdate").
 | 
			
		||||
			Str("machine", m.Name).
 | 
			
		||||
			Msgf("Machine %s does not have an open update channel", m.Name)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *Headscale) isOutdated(m *Machine) bool {
 | 
			
		||||
	err := h.UpdateMachine(m)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
@ -176,24 +176,17 @@ func (h *Headscale) checkForNamespacesPendingUpdates() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	names := []string{}
 | 
			
		||||
	err = json.Unmarshal([]byte(v), &names)
 | 
			
		||||
	namespaces := []string{}
 | 
			
		||||
	err = json.Unmarshal([]byte(v), &namespaces)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, name := range names {
 | 
			
		||||
	for _, namespace := range namespaces {
 | 
			
		||||
		log.Trace().
 | 
			
		||||
			Str("func", "RequestMapUpdates").
 | 
			
		||||
			Str("machine", name).
 | 
			
		||||
			Msg("Sending updates to nodes in namespace")
 | 
			
		||||
		machines, err := h.ListMachinesInNamespace(name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		for _, m := range *machines {
 | 
			
		||||
			updateRequestsFromNode.WithLabelValues("namespace-update").Inc()
 | 
			
		||||
			h.notifyChangesToPeers(&m)
 | 
			
		||||
		}
 | 
			
		||||
			Str("machine", namespace).
 | 
			
		||||
			Msg("Sending updates to nodes in namespacespace")
 | 
			
		||||
		h.setLastStateChangeToNow(namespace)
 | 
			
		||||
	}
 | 
			
		||||
	newV, err := h.getValue("namespaces_pending_updates")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user