mirror of
https://github.com/juanfont/headscale.git
synced 2025-05-14 01:17:07 +02:00
Rework to ensure transactional consistency in PeerChangedResponse again
This commit is contained in:
parent
af04eb5ffd
commit
67bdd19560
@ -77,6 +77,25 @@ func ListNodes(tx *gorm.DB) (types.Nodes, error) {
|
|||||||
return nodes, nil
|
return nodes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hsdb *HSDatabase) ListNodesSubset(nodeIDs types.NodeIDs) (types.Nodes, error) {
|
||||||
|
return Read(hsdb.DB, func(rx *gorm.DB) (types.Nodes, error) {
|
||||||
|
return ListNodesSubset(rx, nodeIDs)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func ListNodesSubset(tx *gorm.DB, nodeIDs types.NodeIDs) (types.Nodes, error) {
|
||||||
|
nodes := types.Nodes{}
|
||||||
|
if err := tx.
|
||||||
|
Preload("AuthKey").
|
||||||
|
Preload("AuthKey.User").
|
||||||
|
Preload("User").
|
||||||
|
Where(nodeIDs).Find(&nodes).Error; err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (hsdb *HSDatabase) ListEphemeralNodes() (types.Nodes, error) {
|
func (hsdb *HSDatabase) ListEphemeralNodes() (types.Nodes, error) {
|
||||||
return Read(hsdb.DB, func(rx *gorm.DB) (types.Nodes, error) {
|
return Read(hsdb.DB, func(rx *gorm.DB) (types.Nodes, error) {
|
||||||
nodes := types.Nodes{}
|
nodes := types.Nodes{}
|
||||||
|
@ -3,9 +3,7 @@ package mapper
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"gorm.io/gorm"
|
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@ -263,28 +261,20 @@ func (m *Mapper) PeerChangedResponse(
|
|||||||
var changedIDs []types.NodeID
|
var changedIDs []types.NodeID
|
||||||
for nodeID, nodeChanged := range changed {
|
for nodeID, nodeChanged := range changed {
|
||||||
if nodeChanged {
|
if nodeChanged {
|
||||||
changedIDs = append(changedIDs, nodeID)
|
if nodeID != node.ID {
|
||||||
|
changedIDs = append(changedIDs, nodeID)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
removedIDs = append(removedIDs, nodeID.NodeID())
|
removedIDs = append(removedIDs, nodeID.NodeID())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
changedNodes := make(types.Nodes, 0, len(changedIDs))
|
changedNodes, err := m.ListNodesSubset(changedIDs)
|
||||||
for _, changedID := range changedIDs {
|
if err != nil {
|
||||||
if changedID != node.ID {
|
return nil, err
|
||||||
changedNode, err := m.GetNode(changedID)
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
changedNodes = append(changedNodes, changedNode)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := appendPeerChanges(
|
err = appendPeerChanges(
|
||||||
&resp,
|
&resp,
|
||||||
false, // partial change
|
false, // partial change
|
||||||
m.polMan,
|
m.polMan,
|
||||||
@ -501,15 +491,18 @@ func (m *Mapper) ListPeers(nodeID types.NodeID) (types.Nodes, error) {
|
|||||||
return peers, nil
|
return peers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mapper) GetNode(nodeID types.NodeID) (*types.Node, error) {
|
func (m *Mapper) ListNodesSubset(nodeIDs []types.NodeID) (types.Nodes, error) {
|
||||||
node, err := m.db.GetNodeByID(nodeID)
|
nodes, err := m.db.ListNodesSubset(nodeIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
online := m.notif.IsLikelyConnected(node.ID)
|
|
||||||
node.IsOnline = &online
|
|
||||||
|
|
||||||
return node, nil
|
for _, node := range nodes {
|
||||||
|
online := m.notif.IsLikelyConnected(node.ID)
|
||||||
|
node.IsOnline = &online
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func nodeMapToList(nodes map[uint64]*types.Node) types.Nodes {
|
func nodeMapToList(nodes map[uint64]*types.Node) types.Nodes {
|
||||||
|
Loading…
Reference in New Issue
Block a user