···98989999// Join asks the Serf instance to join. See the Serf.Join function.
100100func (a *Agent) Join(addrs []string) (n int, err error) {
101101- log.Printf("[INFO] cascade: joining: %v", addrs)
101101+ log.Printf("[INFO] cascade: issuing join request to '%v'", addrs)
102102 // we always ignore old events because cascade don't
103103 // care about the past
104104 n, err = a.serf.Join(addrs, true)
105105- if n > 0 {
106106- log.Printf("[INFO] cascade: joined: %d nodes", n)
107107- }
108105 if err != nil {
109109- log.Printf("[WARN] cascade: error joining: %v", err)
106106+ return n, fmt.Errorf("[ERR] cascade: error joining: %v\n", err)
110107 }
108108+ // TODO: when joining fails, we don't get an error here - serf & memberlist
109109+ // just print to stdout and serf.Join returns without issue.
111110 return n, err
112111}
113112
+18-4
main.go
···2424const (
2525 // gracefulTimeout controls how long we wait before forcefully terminating
2626 // note that this value interacts with serfConfig.LeavePropagateDelay
2727- gracefulTimeout = 5 * time.Second
2727+ gracefulTimeout = 10 * time.Second
2828)
29293030func main() {
···3636 defer agent.Shutdown()
3737 // join any specified startup nodes
3838 if err := startupJoin(config, agent); err != nil {
3939- log.Panic(err)
3939+ log.Fatal(err)
4040+ }
4141+ if os.Getenv("CASCADE_DEBUG") != "" {
4242+ go debugPrints(agent)
4043 }
4144 if err := handleSignals(config, agent); err != nil {
4245 log.Panic(err)
4646+ }
4747+}
4848+4949+func debugPrints(agent *Agent) {
5050+ for {
5151+ for _, m := range agent.serf.Members() {
5252+ log.Printf("[DEBUG] cascade: name '%s' addr '%s' status '%s' \n",
5353+ m.Name, m.Addr, m.Status)
5454+ }
5555+ time.Sleep(time.Second * 5)
4356 }
4457}
4558···114127 return nil
115128 }
116129117117- log.Printf("Joining cluster...")
118130 n, err := agent.Join(config.StartJoin)
119131 if err != nil {
120132 return err
121133 }
134134+ if n > 0 {
135135+ log.Printf("[INFO] cascade: join request issued to %d nodes", n)
136136+ }
122137123123- log.Printf("Join completed. Synced with %d initial agents", n)
124138 return nil
125139}
126140
+16
make-test-cluster
···11+#!/bin/sh
22+#
33+# make a little cascade cluster for development & debugging
44+55+export CASCADE_DEBUG=true
66+77+trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
88+# error case:
99+# CASCADE_BIND='127.0.0.1' go run . &
1010+# sleep 5
1111+# CASCADE_BIND='127.0.0.2' CASCADE_JOIN='127.0.0.1' go run . &
1212+# happy case:
1313+CASCADE_NAME=foo CASCADE_BIND='127.0.0.1' go run . &
1414+sleep 5
1515+CASCADE_NAME=bar CASCADE_BIND='127.0.0.2' CASCADE_JOIN='127.0.0.1' go run . &
1616+wait