From ff1f5a9d575eae9e1e92ed8e985729fef8259c9a Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 3 Nov 2014 14:28:59 -0800 Subject: [PATCH 1/3] wal: sync before returning from create --- wal/wal.go | 1 + wal/wal_test.go | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/wal/wal.go b/wal/wal.go index 2655823ee..6719e8055 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) { From dbdeceda7b75dfe5714c12b5bef51e1b4a503072 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 3 Nov 2014 15:16:41 -0800 Subject: [PATCH 2/3] raft: do not load empty state and ents --- raft/node.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 } From dd09042632be6ffea90bf4971faa7988823df507 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 3 Nov 2014 15:17:21 -0800 Subject: [PATCH 3/3] etcdserver: try to listen on ports before initializing etcd server --- etcdmain/etcd.go | 76 +++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 1421d4b4a..fa4939b67 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -20,6 +20,7 @@ import ( "flag" "fmt" "log" + "net" "net/http" "os" "strings" @@ -172,6 +173,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, @@ -190,43 +226,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) } }