From 09be35dee01374a626fb4d5328129fb9fafe35e7 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 9 Sep 2018 20:40:53 +0000 Subject: [PATCH] Fetch stored peer list every time round the retry loop This ensures we take account of other peers' updates and closes a race condition whereby another peer's changes can be overwritten. --- prog/kube-utils/main.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/prog/kube-utils/main.go b/prog/kube-utils/main.go index 1726005a..1e70899d 100644 --- a/prog/kube-utils/main.go +++ b/prog/kube-utils/main.go @@ -104,7 +104,7 @@ func reclaimRemovedPeers(kube kubernetes.Interface, weave weaveClient, cml *conf common.Log.Warnln("[kube-peers] not removing myself", peer) continue } - changed, err := reclaimPeer(weave, cml, storedPeerList, peer.PeerName, myPeerName) + changed, err := reclaimPeer(weave, cml, peer.PeerName, myPeerName) if err != nil { return err } @@ -119,7 +119,7 @@ func reclaimRemovedPeers(kube kubernetes.Interface, weave weaveClient, cml *conf return nil } -func reclaimPeer(weave weaveClient, cml *configMapAnnotations, storedPeerList *peerList, peerName string, myPeerName string) (bool, error) { +func reclaimPeer(weave weaveClient, cml *configMapAnnotations, peerName string, myPeerName string) (bool, error) { common.Log.Debugln("[kube-peers] Preparing to remove disappeared peer", peerName) okToRemove := false // 3. Check if there is an existing annotation with key X @@ -153,6 +153,10 @@ func reclaimPeer(weave weaveClient, cml *configMapAnnotations, storedPeerList *p return err } // 7a. Remove X from peerList + storedPeerList, err := cml.GetPeerList() + if err != nil { + return err + } storedPeerList.remove(peerName) if err := cml.UpdatePeerList(*storedPeerList); err != nil { return err