github.com/sl1pm4t/consul@v1.4.5-0.20190325224627-74c31c540f9c/agent/router/serf_adapter.go (about) 1 package router 2 3 import ( 4 "log" 5 6 "github.com/hashicorp/consul/agent/metadata" 7 "github.com/hashicorp/consul/types" 8 "github.com/hashicorp/serf/serf" 9 ) 10 11 // routerFn selects one of the router operations to map to incoming Serf events. 12 type routerFn func(types.AreaID, *metadata.Server) error 13 14 // handleMemberEvents attempts to apply the given Serf member event to the given 15 // router function. 16 func handleMemberEvent(logger *log.Logger, fn routerFn, areaID types.AreaID, e serf.Event) { 17 me, ok := e.(serf.MemberEvent) 18 if !ok { 19 logger.Printf("[ERR] consul: Bad event type %#v", e) 20 return 21 } 22 23 for _, m := range me.Members { 24 ok, parts := metadata.IsConsulServer(m) 25 if !ok { 26 logger.Printf("[WARN]: consul: Non-server %q in server-only area %q", 27 m.Name, areaID) 28 continue 29 } 30 31 if err := fn(areaID, parts); err != nil { 32 logger.Printf("[ERR] consul: Failed to process %s event for server %q in area %q: %v", 33 me.Type.String(), m.Name, areaID, err) 34 continue 35 } 36 37 logger.Printf("[INFO] consul: Handled %s event for server %q in area %q", 38 me.Type.String(), m.Name, areaID) 39 } 40 } 41 42 // HandleSerfEvents is a long-running goroutine that pushes incoming events from 43 // a Serf manager's channel into the given router. This will return when the 44 // shutdown channel is closed. 45 func HandleSerfEvents(logger *log.Logger, router *Router, areaID types.AreaID, shutdownCh <-chan struct{}, eventCh <-chan serf.Event) { 46 for { 47 select { 48 case <-shutdownCh: 49 return 50 51 case e := <-eventCh: 52 switch e.EventType() { 53 case serf.EventMemberJoin: 54 handleMemberEvent(logger, router.AddServer, areaID, e) 55 56 case serf.EventMemberLeave, serf.EventMemberReap: 57 handleMemberEvent(logger, router.RemoveServer, areaID, e) 58 59 case serf.EventMemberFailed: 60 handleMemberEvent(logger, router.FailServer, areaID, e) 61 62 // All of these event types are ignored. 63 case serf.EventMemberUpdate: 64 case serf.EventUser: 65 case serf.EventQuery: 66 67 default: 68 logger.Printf("[WARN] consul: Unhandled Serf Event: %#v", e) 69 } 70 } 71 } 72 }