Browse Source

wal: recover writting seq

Xiang Li 11 years ago
parent
commit
1164c4b83d
2 changed files with 19 additions and 4 deletions
  1. 8 2
      wal/wal.go
  2. 11 2
      wal/wal_test.go

+ 8 - 2
wal/wal.go

@@ -60,7 +60,7 @@ type WAL struct {
 	decoder *decoder // decoder to decode records
 
 	f       *os.File // underlay file opened for appending, sync
-	seq     int64    // current sequence of the wal file
+	seq     int64    // current sequence of the wal file to be written
 	enti    int64    // index of the last entry that has been saved to wal
 	encoder *encoder // encoder to encode records
 }
@@ -127,6 +127,11 @@ func OpenAtIndex(dirpath string, index int64) (*WAL, error) {
 	rc := MultiReadCloser(rcs...)
 
 	// open the lastest wal file for appending
+	seq, _, err := parseWalName(names[len(names)-1])
+	if err != nil {
+		rc.Close()
+		return nil, err
+	}
 	last := path.Join(dirpath, names[len(names)-1])
 	f, err := os.OpenFile(last, os.O_WRONLY|os.O_APPEND, 0)
 	if err != nil {
@@ -139,7 +144,8 @@ func OpenAtIndex(dirpath string, index int64) (*WAL, error) {
 		ri:      index,
 		decoder: newDecoder(rc),
 
-		f: f,
+		f:   f,
+		seq: seq,
 	}
 	return w, nil
 }

+ 11 - 2
wal/wal_test.go

@@ -77,13 +77,22 @@ func TestOpenAtIndex(t *testing.T) {
 		t.Fatal(err)
 	}
 	f.Close()
+	writef := fmt.Sprintf("%016x-%016x.wal", 1, 4)
+	f, err = os.Create(path.Join(dir, writef))
+	if err != nil {
+		t.Fatal(err)
+	}
+	f.Close()
 
 	w, err := OpenAtIndex(dir, 0)
 	if err != nil {
 		t.Fatalf("err = %v, want nil", err)
 	}
-	if g := path.Base(w.f.Name()); g != firstWalName {
-		t.Errorf("name = %+v, want %+v", g, firstWalName)
+	if g := path.Base(w.f.Name()); g != writef {
+		t.Errorf("name = %+v, want %+v", g, writef)
+	}
+	if w.seq != 1 {
+		t.Errorf("seq = %d, want %d", w.seq, 1)
 	}
 	w.Close()