// startEtcd launches the etcd server and HTTP handlers for client/server communication. func startEtcd() { id, err := strconv.ParseInt(*fid, 0, 64) if err != nil { log.Fatal(err) } if id == raft.None { log.Fatalf("etcd: cannot use None(%d) as etcdserver id", raft.None) } if peers.Pick(id) == "" { log.Fatalf("%#x=<addr> must be specified in peers", id) } if *dir == "" { *dir = fmt.Sprintf("%v_etcd_data", *fid) log.Printf("main: no data-dir is given, using default data-dir ./%s", *dir) } if err := os.MkdirAll(*dir, privateDirMode); err != nil { log.Fatalf("main: cannot create data directory: %v", err) } n, w := startRaft(id, peers.IDs(), path.Join(*dir, "wal")) s := &etcdserver.EtcdServer{ Store: store.New(), Node: n, Save: w.Save, Send: etcdhttp.Sender(*peers), Ticker: time.Tick(100 * time.Millisecond), SyncTicker: time.Tick(500 * time.Millisecond), } s.Start() ch := etcdhttp.NewClientHandler(s, *peers, *timeout) ph := etcdhttp.NewPeerHandler(s) // Start the peer server in a goroutine go func() { log.Print("Listening for peers on ", *paddr) log.Fatal(http.ListenAndServe(*paddr, ph)) }() // Start a client server goroutine for each listen address for _, addr := range *addrs { addr := addr go func() { log.Print("Listening for client requests on ", addr) log.Fatal(http.ListenAndServe(addr, ch)) }() } }
func startEtcd() http.Handler { id, err := strconv.ParseInt(*fid, 0, 64) if err != nil { log.Fatal(err) } if id == raft.None { log.Fatalf("etcd: cannot use None(%d) as etcdserver id", raft.None) } if peers.Pick(id) == "" { log.Fatalf("%#x=<addr> must be specified in peers", id) } if *dir == "" { *dir = fmt.Sprintf("%v_etcd_data", *fid) log.Printf("main: no data-dir is given, using default data-dir ./%s", *dir) } if err := os.MkdirAll(*dir, privateDirMode); err != nil { log.Fatalf("main: cannot create data directory: %v", err) } n, w := startRaft(id, peers.IDs(), path.Join(*dir, "wal")) tk := time.NewTicker(100 * time.Millisecond) s := &etcdserver.Server{ Store: store.New(), Node: n, Save: w.Save, Send: etcdhttp.Sender(*peers), Ticker: tk.C, } etcdserver.Start(s) h := etcdhttp.Handler{ Timeout: *timeout, Server: s, Peers: *peers, } return &h }
func main() { flag.Parse() id, err := strconv.ParseInt(*fid, 0, 64) if err != nil { log.Fatal(err) } if peers.Pick(id) == "" { log.Fatalf("%#x=<addr> must be specified in peers", id) } if *dir == "" { *dir = fmt.Sprintf("%v_etcd_data", *fid) log.Printf("main: no data-dir is given, using default data-dir ./%s", *dir) } if err := os.MkdirAll(*dir, privateDirMode); err != nil { log.Fatalf("main: cannot create data directory: %v", err) } n, w := startRaft(id, peers.Ids(), path.Join(*dir, "wal")) tk := time.NewTicker(100 * time.Millisecond) s := &etcdserver.Server{ Store: store.New(), Node: n, Save: w.Save, Send: etcdhttp.Sender(*peers), Ticker: tk.C, } etcdserver.Start(s) h := &etcdhttp.Handler{ Timeout: *timeout, Server: s, } http.Handle("/", h) log.Fatal(http.ListenAndServe(*laddr, nil)) }