Skip to content

Commit b972e7a

Browse files
authored
add mutex on failover ops (#3590)
1 parent d5cc14c commit b972e7a

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

logic/peers.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,13 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N
242242
if peer.EgressDetails.IsEgressGateway {
243243
AddEgressInfoToPeerByAccess(&node, &peer, eli, acls, defaultDevicePolicy.Enabled)
244244
}
245+
if node.Mutex != nil {
246+
node.Mutex.Lock()
247+
}
245248
_, isFailOverPeer := node.FailOverPeers[peer.ID.String()]
249+
if node.Mutex != nil {
250+
node.Mutex.Unlock()
251+
}
246252
if peer.EgressDetails.IsEgressGateway {
247253
peerKey := peerHost.PublicKey.String()
248254
if isFailOverPeer && peer.FailedOverBy.String() != node.ID.String() {

pro/controllers/failover.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,13 @@ func resetFailOver(w http.ResponseWriter, r *http.Request) {
110110
for _, node := range nodes {
111111
if node.FailedOverBy != uuid.Nil {
112112
node.FailedOverBy = uuid.Nil
113+
if node.Mutex != nil {
114+
node.Mutex.Lock()
115+
}
113116
node.FailOverPeers = make(map[string]struct{})
117+
if node.Mutex != nil {
118+
node.Mutex.Unlock()
119+
}
114120
logic.UpsertNode(&node)
115121
}
116122
}

pro/logic/failover.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,20 @@ func CheckFailOverCtx(failOverNode, victimNode, peerNode models.Node) error {
5151
if victimNode.FailOverPeers == nil {
5252
return nil
5353
}
54+
if peerNode.Mutex != nil {
55+
peerNode.Mutex.Lock()
56+
}
5457
_, peerHasFailovered := peerNode.FailOverPeers[victimNode.ID.String()]
58+
if peerNode.Mutex != nil {
59+
peerNode.Mutex.Unlock()
60+
}
61+
if victimNode.Mutex != nil {
62+
victimNode.Mutex.Lock()
63+
}
5564
_, victimHasFailovered := victimNode.FailOverPeers[peerNode.ID.String()]
65+
if victimNode.Mutex != nil {
66+
victimNode.Mutex.Unlock()
67+
}
5668
if peerHasFailovered && victimHasFailovered &&
5769
victimNode.FailedOverBy == failOverNode.ID && peerNode.FailedOverBy == failOverNode.ID {
5870
return errors.New("failover ctx is already set")
@@ -68,14 +80,38 @@ func SetFailOverCtx(failOverNode, victimNode, peerNode models.Node) error {
6880
if victimNode.FailOverPeers == nil {
6981
victimNode.FailOverPeers = make(map[string]struct{})
7082
}
83+
if peerNode.Mutex != nil {
84+
peerNode.Mutex.Lock()
85+
}
7186
_, peerHasFailovered := peerNode.FailOverPeers[victimNode.ID.String()]
87+
if peerNode.Mutex != nil {
88+
peerNode.Mutex.Unlock()
89+
}
90+
if victimNode.Mutex != nil {
91+
victimNode.Mutex.Lock()
92+
}
7293
_, victimHasFailovered := victimNode.FailOverPeers[peerNode.ID.String()]
94+
if victimNode.Mutex != nil {
95+
victimNode.Mutex.Unlock()
96+
}
7397
if peerHasFailovered && victimHasFailovered &&
7498
victimNode.FailedOverBy == failOverNode.ID && peerNode.FailedOverBy == failOverNode.ID {
7599
return errors.New("failover ctx is already set")
76100
}
101+
if peerNode.Mutex != nil {
102+
peerNode.Mutex.Lock()
103+
}
77104
peerNode.FailOverPeers[victimNode.ID.String()] = struct{}{}
105+
if peerNode.Mutex != nil {
106+
peerNode.Mutex.Unlock()
107+
}
108+
if victimNode.Mutex != nil {
109+
victimNode.Mutex.Lock()
110+
}
78111
victimNode.FailOverPeers[peerNode.ID.String()] = struct{}{}
112+
if victimNode.Mutex != nil {
113+
victimNode.Mutex.Unlock()
114+
}
79115
victimNode.FailedOverBy = failOverNode.ID
80116
peerNode.FailedOverBy = failOverNode.ID
81117
if err := logic.UpsertNode(&victimNode); err != nil {

0 commit comments

Comments
 (0)