diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 5c74c7d00..043a0d03d 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -20,6 +20,7 @@ import ( "flag" "fmt" "log" + "net" "net/http" "os" "strings" @@ -173,6 +174,41 @@ func startEtcd() { if err != nil { log.Fatal(err.Error()) } + + lpurls, err := flags.URLsFromFlags(fs, "listen-peer-urls", "peer-bind-addr", peerTLSInfo) + if err != nil { + log.Fatal(err.Error()) + } + + plns := make([]net.Listener, 0) + for _, u := range lpurls { + l, err := transport.NewListener(u.Host, peerTLSInfo) + if err != nil { + log.Fatal(err) + } + + urlStr := u.String() + log.Print("etcd: listening for peers on ", urlStr) + plns = append(plns, l) + } + + lcurls, err := flags.URLsFromFlags(fs, "listen-client-urls", "bind-addr", clientTLSInfo) + if err != nil { + log.Fatal(err.Error()) + } + + clns := make([]net.Listener, 0) + for _, u := range lcurls { + l, err := transport.NewListener(u.Host, clientTLSInfo) + if err != nil { + log.Fatal(err) + } + + urlStr := u.String() + log.Print("etcd: listening for client requests on ", urlStr) + clns = append(clns, l) + } + cfg := &etcdserver.ServerConfig{ Name: *name, ClientURLs: acurls, @@ -191,43 +227,17 @@ func startEtcd() { Info: corsInfo, } ph := etcdhttp.NewPeerHandler(s) - - lpurls, err := flags.URLsFromFlags(fs, "listen-peer-urls", "peer-bind-addr", peerTLSInfo) - if err != nil { - log.Fatal(err.Error()) - } - - for _, u := range lpurls { - l, err := transport.NewListener(u.Host, peerTLSInfo) - if err != nil { - log.Fatal(err) - } - - // Start the peer server in a goroutine - urlStr := u.String() - go func() { - log.Print("etcd: listening for peers on ", urlStr) + // Start the peer server in a goroutine + for _, l := range plns { + go func(l net.Listener) { log.Fatal(http.Serve(l, ph)) - }() + }(l) } - - lcurls, err := flags.URLsFromFlags(fs, "listen-client-urls", "bind-addr", clientTLSInfo) - if err != nil { - log.Fatal(err.Error()) - } - // Start a client server goroutine for each listen address - for _, u := range lcurls { - l, err := transport.NewListener(u.Host, clientTLSInfo) - if err != nil { - log.Fatal(err) - } - - urlStr := u.String() - go func() { - log.Print("etcd: listening for client requests on ", urlStr) + for _, l := range clns { + go func(l net.Listener) { log.Fatal(http.Serve(l, ch)) - }() + }(l) } } diff --git a/raft/node.go b/raft/node.go index 85fce43ed..67ebb1d68 100644 --- a/raft/node.go +++ b/raft/node.go @@ -168,8 +168,12 @@ func RestartNode(id uint64, election, heartbeat int, snapshot *pb.Snapshot, st p if snapshot != nil { r.restore(*snapshot) } - r.loadState(st) - r.loadEnts(ents) + if !isHardStateEqual(st, emptyState) { + r.loadState(st) + } + if len(ents) != 0 { + r.loadEnts(ents) + } go n.run(r) return &n } diff --git a/wal/wal.go b/wal/wal.go index 0051b8b09..c2e037a89 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -97,6 +97,7 @@ func Create(dirpath string, metadata []byte) (*WAL, error) { if err := w.encoder.encode(&walpb.Record{Type: metadataType, Data: metadata}); err != nil { return nil, err } + w.Sync() return w, nil } diff --git a/wal/wal_test.go b/wal/wal_test.go index 101f77367..65b2ce811 100644 --- a/wal/wal_test.go +++ b/wal/wal_test.go @@ -25,6 +25,7 @@ import ( "testing" "github.com/coreos/etcd/raft/raftpb" + "github.com/coreos/etcd/wal/walpb" ) func TestNew(t *testing.T) { @@ -34,14 +35,33 @@ func TestNew(t *testing.T) { } defer os.RemoveAll(p) - w, err := Create(p, nil) + w, err := Create(p, []byte("somedata")) if err != nil { t.Fatalf("err = %v, want nil", err) } if g := path.Base(w.f.Name()); g != walName(0, 0) { t.Errorf("name = %+v, want %+v", g, walName(0, 0)) } - w.Close() + defer w.Close() + gd, err := ioutil.ReadFile(w.f.Name()) + if err != nil { + t.Fatalf("err = %v, want nil", err) + } + + var wb bytes.Buffer + e := newEncoder(&wb, 0) + err = e.encode(&walpb.Record{Type: crcType, Crc: 0}) + if err != nil { + t.Fatalf("err = %v, want nil", err) + } + err = e.encode(&walpb.Record{Type: metadataType, Data: []byte("somedata")}) + if err != nil { + t.Fatalf("err = %v, want nil", err) + } + e.flush() + if !reflect.DeepEqual(gd, wb.Bytes()) { + t.Errorf("data = %v, want %v", gd, wb.Bytes()) + } } func TestNewForInitedDir(t *testing.T) {