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  }