leaderless gossip-based service discovery w/ consul compatibility
5

Configure Feed

Select the types of activity you want to include in your feed.

fix runaway cpu bug, simplify setupAgent

Jes Olson (Feb 17, 2023, 9:48 PM -0800) 5d051cf6 c816221a

+35 -29
+1
.gitignore
··· 1 1 cascade 2 + *.prof
+6
README
··· 4 4 cascade is a cli-based fully 5 5 masterless distributed computing 6 6 thing 7 + 8 + development 9 + ----------------------- 10 + 11 + CASCADE_NAME=hewo CASCADE_BIND='127.0.0.1' go run . 12 + CASCADE_NAME=hai CASCADE_BIND='127.0.0.2' CASCADE_JOIN='127.0.0.1' go run .
+2 -9
agent.go
··· 8 8 "github.com/hashicorp/serf/serf" 9 9 ) 10 10 11 - // Agent starts and manages a Serf & adds 12 - // service discovery 11 + // Agent starts and manages a Serf & adds service discovery (TODO) 13 12 type Agent struct { 14 - // conf *Config 15 13 serfConf *serf.Config 16 14 eventCh chan serf.Event 17 - 18 - // i doubt we care about handling events, 19 - // but i'm leaving this here just in case 20 - // eventHandlerList []EventHandler 21 - // eventHandlersLock sync.Mutex 22 15 23 16 // This is the underlying Serf we are wrapping 24 17 serf *serf.Serf ··· 53 46 log.Printf("[INFO] cascade: Received event: %s", e.String()) 54 47 55 48 case <-serfShutdownCh: 56 - log.Printf("[WARN] cascade: Serf shutdown detected, quitting") 49 + log.Printf("[INFO] cascade: serf shutdown detected, quitting eventloop") 57 50 a.Shutdown() 58 51 return 59 52
+7
config.go
··· 3 3 import ( 4 4 "fmt" 5 5 "net" 6 + "os" 6 7 ) 7 8 8 9 const DefaultBindPort int = 4449 9 10 10 11 func DefaultConfig() *Config { 12 + hostname, err := os.Hostname() 13 + if err != nil { 14 + panic(err) 15 + } 16 + 11 17 return &Config{ 12 18 BindAddr: "0.0.0.0", 19 + NodeName: hostname, 13 20 } 14 21 } 15 22
+19 -20
main.go
··· 66 66 67 67 // Bail fast if not doing a graceful leave 68 68 if !graceful { 69 - log.Printf("[WARN] cascade: non-graceful leave detected") 70 - return nil 69 + log.Fatal("[WARN] cascade: non-graceful leave detected") 71 70 } 72 71 73 72 // Attempt a graceful leave ··· 129 128 if err != nil { 130 129 log.Panic(err) 131 130 } 131 + 132 132 serfConfig := serf.DefaultConfig() 133 133 serfConfig.NodeName = config.NodeName 134 134 serfConfig.ProtocolVersion = uint8(serf.ProtocolVersionMax) 135 - serfConfig.CoalescePeriod = 3 * time.Second 136 - serfConfig.QuiescentPeriod = time.Second 137 - serfConfig.QueryResponseSizeLimit = 1024 138 - serfConfig.QuerySizeLimit = 1024 139 - serfConfig.UserEventSizeLimit = 512 140 - serfConfig.UserCoalescePeriod = 3 * time.Second 141 - serfConfig.UserQuiescentPeriod = time.Second 142 - // TODO: look at reconnect/tombstone settings w more scrutiny 143 - serfConfig.ReconnectInterval = 0 144 - serfConfig.ReconnectTimeout = 0 145 - serfConfig.TombstoneTimeout = 0 146 - serfConfig.BroadcastTimeout = 0 147 - // TODO: what are the implications of true here o_O 148 - serfConfig.EnableNameConflictResolution = true 149 - // hardcode DefaultWANConfig because cascade is designed to be 150 - // used as a single global system. 135 + // TODO: how should cascade handle name conflicts? 136 + // defaulting to just blowing up for now, but 137 + // we _could_ take the tailscale route & append 138 + // -1 or whatever to the node. that would be more user friendly. 139 + // TODO: some of these serf settings were pulled 140 + // from consul[1]. re-examine them eventually. 141 + serfConfig.EnableNameConflictResolution = false 142 + serfConfig.ReconnectTimeout = 3 * 24 * time.Hour 143 + serfConfig.QueueDepthWarning = 1000000 144 + serfConfig.MinQueueDepth = 4096 145 + serfConfig.LeavePropagateDelay = 3 * time.Second 146 + 151 147 serfConfig.MemberlistConfig = memberlist.DefaultWANConfig() 148 + serfConfig.MemberlistConfig.DeadNodeReclaimTime = 30 * time.Second 152 149 serfConfig.MemberlistConfig.BindAddr = bindIP 153 150 serfConfig.MemberlistConfig.BindPort = bindPort 154 - serfConfig.MemberlistConfig.AdvertiseAddr = "" 155 - serfConfig.MemberlistConfig.AdvertisePort = 0 156 151 157 152 agent := Create(serfConfig) 158 153 return agent 159 154 } 155 + 156 + // [1]: sources for consul serf tweaks 157 + // https://github.com/hashicorp/consul/blob/v1.14.4/agent/consul/config.go 158 + // https://github.com/hashicorp/consul/blob/v1.14.4/lib/serf/serf.go