From 849edb1768ff9c42fd8f37e89e4f97cd302f2a28 Mon Sep 17 00:00:00 2001 From: Martynas Pumputis Date: Fri, 22 Apr 2016 17:29:27 +0100 Subject: [PATCH] Add allocator.PeerGone The function is registered within the mesh gc and it is responsible for removing gone nicknames (#2057). --- ipam/allocator.go | 18 ++++++++++++++++++ prog/weaver/main.go | 1 + 2 files changed, 19 insertions(+) diff --git a/ipam/allocator.go b/ipam/allocator.go index 741390fa..ebee8b6b 100644 --- a/ipam/allocator.go +++ b/ipam/allocator.go @@ -90,11 +90,13 @@ type Config struct { // NewAllocator creates and initialises a new Allocator func NewAllocator(config Config) *Allocator { var participant paxos.Participant + if config.IsObserver { participant = paxos.NewObserver() } else { participant = paxos.NewNode(config.OurName, config.OurUID, 0) } + return &Allocator{ ourName: config.OurName, seed: config.Seed, @@ -485,6 +487,22 @@ func (alloc *Allocator) annotatePeernames(names []mesh.PeerName) []string { return res } +// PeerGone removes nicknames of peers which are no longer mentioned +// in the ring. Async. +// +// NB: the function is invoked by the gossip library routines and should be +// registered manually. +func (alloc *Allocator) PeerGone(peerName mesh.PeerName) { + alloc.debugln("PeerGone: peer %s", peerName) + + alloc.actionChan <- func() { + ringPeers := alloc.ring.PeerNames() + if _, ok := ringPeers[peerName]; !ok { + delete(alloc.nicknames, peerName) + } + } +} + func decodeRange(msg []byte) (r address.Range, err error) { decoder := gob.NewDecoder(bytes.NewReader(msg)) return r, decoder.Decode(&r) diff --git a/prog/weaver/main.go b/prog/weaver/main.go index adb3ec54..836a7bb3 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -452,6 +452,7 @@ func createAllocator(router *weave.NetworkRouter, config ipamConfig, db db.DB, i allocator.SetInterfaces(router.NewGossip("IPallocation", allocator)) allocator.Start() + router.Peers.OnGC(func(peer *mesh.Peer) { allocator.PeerGone(peer.Name) }) return allocator, defaultSubnet }