leaderless gossip-based service discovery w/ consul compatibility
5

Configure Feed

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

Make error logging more accurate

Jes Olson (Feb 17, 2023, 10:35 PM -0800) 0eb868d0 516210bc

+38 -9
+4 -5
agent.go
··· 98 98 99 99 // Join asks the Serf instance to join. See the Serf.Join function. 100 100 func (a *Agent) Join(addrs []string) (n int, err error) { 101 - log.Printf("[INFO] cascade: joining: %v", addrs) 101 + log.Printf("[INFO] cascade: issuing join request to '%v'", addrs) 102 102 // we always ignore old events because cascade don't 103 103 // care about the past 104 104 n, err = a.serf.Join(addrs, true) 105 - if n > 0 { 106 - log.Printf("[INFO] cascade: joined: %d nodes", n) 107 - } 108 105 if err != nil { 109 - log.Printf("[WARN] cascade: error joining: %v", err) 106 + return n, fmt.Errorf("[ERR] cascade: error joining: %v\n", err) 110 107 } 108 + // TODO: when joining fails, we don't get an error here - serf & memberlist 109 + // just print to stdout and serf.Join returns without issue. 111 110 return n, err 112 111 } 113 112
+18 -4
main.go
··· 24 24 const ( 25 25 // gracefulTimeout controls how long we wait before forcefully terminating 26 26 // note that this value interacts with serfConfig.LeavePropagateDelay 27 - gracefulTimeout = 5 * time.Second 27 + gracefulTimeout = 10 * time.Second 28 28 ) 29 29 30 30 func main() { ··· 36 36 defer agent.Shutdown() 37 37 // join any specified startup nodes 38 38 if err := startupJoin(config, agent); err != nil { 39 - log.Panic(err) 39 + log.Fatal(err) 40 + } 41 + if os.Getenv("CASCADE_DEBUG") != "" { 42 + go debugPrints(agent) 40 43 } 41 44 if err := handleSignals(config, agent); err != nil { 42 45 log.Panic(err) 46 + } 47 + } 48 + 49 + func debugPrints(agent *Agent) { 50 + for { 51 + for _, m := range agent.serf.Members() { 52 + log.Printf("[DEBUG] cascade: name '%s' addr '%s' status '%s' \n", 53 + m.Name, m.Addr, m.Status) 54 + } 55 + time.Sleep(time.Second * 5) 43 56 } 44 57 } 45 58 ··· 114 127 return nil 115 128 } 116 129 117 - log.Printf("Joining cluster...") 118 130 n, err := agent.Join(config.StartJoin) 119 131 if err != nil { 120 132 return err 121 133 } 134 + if n > 0 { 135 + log.Printf("[INFO] cascade: join request issued to %d nodes", n) 136 + } 122 137 123 - log.Printf("Join completed. Synced with %d initial agents", n) 124 138 return nil 125 139 } 126 140
+16
make-test-cluster
··· 1 + #!/bin/sh 2 + # 3 + # make a little cascade cluster for development & debugging 4 + 5 + export CASCADE_DEBUG=true 6 + 7 + trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 8 + # error case: 9 + # CASCADE_BIND='127.0.0.1' go run . & 10 + # sleep 5 11 + # CASCADE_BIND='127.0.0.2' CASCADE_JOIN='127.0.0.1' go run . & 12 + # happy case: 13 + CASCADE_NAME=foo CASCADE_BIND='127.0.0.1' go run . & 14 + sleep 5 15 + CASCADE_NAME=bar CASCADE_BIND='127.0.0.2' CASCADE_JOIN='127.0.0.1' go run . & 16 + wait