Browse Source

wal: sync before returning from create

Xiang Li 11 years ago
parent
commit
ff1f5a9d57
2 changed files with 23 additions and 2 deletions
  1. 1 0
      wal/wal.go
  2. 22 2
      wal/wal_test.go

+ 1 - 0
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 {
 	if err := w.encoder.encode(&walpb.Record{Type: metadataType, Data: metadata}); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
+	w.Sync()
 	return w, nil
 	return w, nil
 }
 }
 
 

+ 22 - 2
wal/wal_test.go

@@ -25,6 +25,7 @@ import (
 	"testing"
 	"testing"
 
 
 	"github.com/coreos/etcd/raft/raftpb"
 	"github.com/coreos/etcd/raft/raftpb"
+	"github.com/coreos/etcd/wal/walpb"
 )
 )
 
 
 func TestNew(t *testing.T) {
 func TestNew(t *testing.T) {
@@ -34,14 +35,33 @@ func TestNew(t *testing.T) {
 	}
 	}
 	defer os.RemoveAll(p)
 	defer os.RemoveAll(p)
 
 
-	w, err := Create(p, nil)
+	w, err := Create(p, []byte("somedata"))
 	if err != nil {
 	if err != nil {
 		t.Fatalf("err = %v, want nil", err)
 		t.Fatalf("err = %v, want nil", err)
 	}
 	}
 	if g := path.Base(w.f.Name()); g != walName(0, 0) {
 	if g := path.Base(w.f.Name()); g != walName(0, 0) {
 		t.Errorf("name = %+v, want %+v", 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) {
 func TestNewForInitedDir(t *testing.T) {