mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: add clock to WAL struckt and altered some tests related to WAL records
wal test was changed due to the changes in WAL structure in TestRepairWriteTearLast i changed number of expected entries from 40 to 29 because now one wal record takes morespace and therefore after truncating a wal file less records remain Signed-off-by: Grigorii Kosov <kosov.gr@gmail.com> Signed-off-by: KosovGrigorii <72564996+KosovGrigorii@users.noreply.github.com>
This commit is contained in:
parent
bdb249c7d5
commit
3dc1e4faa8
@ -125,7 +125,7 @@ func TestRepairWriteTearLast(t *testing.T) {
|
||||
}
|
||||
return f.Truncate(offset)
|
||||
}
|
||||
testRepair(t, makeEnts(50), corruptf, 40)
|
||||
testRepair(t, makeEnts(50), corruptf, 29)
|
||||
}
|
||||
|
||||
// TestRepairWriteTearMiddle repairs the WAL when there is write tearing
|
||||
|
@ -26,6 +26,8 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/jonboulle/clockwork"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
"go.etcd.io/etcd/client/pkg/v3/fileutil"
|
||||
@ -92,12 +94,14 @@ type WAL struct {
|
||||
|
||||
locks []*fileutil.LockedFile // the locked files the WAL holds (the name is increasing)
|
||||
fp *filePipeline
|
||||
|
||||
clock clockwork.Clock
|
||||
}
|
||||
|
||||
// Create creates a WAL ready for appending records. The given metadata is
|
||||
// recorded at the head of each WAL file, and can be retrieved with ReadAll
|
||||
// after the file is Open.
|
||||
func Create(lg *zap.Logger, dirpath string, metadata []byte) (*WAL, error) {
|
||||
func Create(lg *zap.Logger, dirpath string, metadata []byte, walClock ...clockwork.Clock) (*WAL, error) {
|
||||
if Exist(dirpath) {
|
||||
return nil, os.ErrExist
|
||||
}
|
||||
@ -158,6 +162,12 @@ func Create(lg *zap.Logger, dirpath string, metadata []byte) (*WAL, error) {
|
||||
dir: dirpath,
|
||||
metadata: metadata,
|
||||
}
|
||||
if walClock != nil {
|
||||
w.clock = walClock[0]
|
||||
} else {
|
||||
w.clock = clockwork.NewRealClock()
|
||||
}
|
||||
|
||||
w.encoder, err = newFileEncoder(f.File, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -166,7 +176,7 @@ func Create(lg *zap.Logger, dirpath string, metadata []byte) (*WAL, error) {
|
||||
if err = w.saveCrc(0); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = w.encoder.encode(&walpb.Record{Type: MetadataType, Data: metadata}); err != nil {
|
||||
if err = w.encoder.encode(&walpb.Record{Type: MetadataType, Data: metadata, CreatedAt: w.clock.Now().Unix()}); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = w.SaveSnapshot(walpb.Snapshot{}); err != nil {
|
||||
@ -354,6 +364,7 @@ func openAtIndex(lg *zap.Logger, dirpath string, snap walpb.Snapshot, write bool
|
||||
decoder: NewDecoder(rs...),
|
||||
readClose: closer,
|
||||
locks: ls,
|
||||
clock: clockwork.NewRealClock(),
|
||||
}
|
||||
|
||||
if write {
|
||||
@ -748,7 +759,7 @@ func (w *WAL) cut() error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = w.encoder.encode(&walpb.Record{Type: MetadataType, Data: w.metadata}); err != nil {
|
||||
if err = w.encoder.encode(&walpb.Record{Type: MetadataType, Data: w.metadata, CreatedAt: w.clock.Now().Unix()}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -905,7 +916,7 @@ func (w *WAL) Close() error {
|
||||
func (w *WAL) saveEntry(e *raftpb.Entry) error {
|
||||
// TODO: add MustMarshalTo to reduce one allocation.
|
||||
b := pbutil.MustMarshal(e)
|
||||
rec := &walpb.Record{Type: EntryType, Data: b}
|
||||
rec := &walpb.Record{Type: EntryType, Data: b, CreatedAt: w.clock.Now().Unix()}
|
||||
if err := w.encoder.encode(rec); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -919,7 +930,7 @@ func (w *WAL) saveState(s *raftpb.HardState) error {
|
||||
}
|
||||
w.state = *s
|
||||
b := pbutil.MustMarshal(s)
|
||||
rec := &walpb.Record{Type: StateType, Data: b}
|
||||
rec := &walpb.Record{Type: StateType, Data: b, CreatedAt: w.clock.Now().Unix()}
|
||||
return w.encoder.encode(rec)
|
||||
}
|
||||
|
||||
@ -971,7 +982,7 @@ func (w *WAL) SaveSnapshot(e walpb.Snapshot) error {
|
||||
w.mu.Lock()
|
||||
defer w.mu.Unlock()
|
||||
|
||||
rec := &walpb.Record{Type: SnapshotType, Data: b}
|
||||
rec := &walpb.Record{Type: SnapshotType, Data: b, CreatedAt: w.clock.Now().Unix()}
|
||||
if err := w.encoder.encode(rec); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -983,7 +994,7 @@ func (w *WAL) SaveSnapshot(e walpb.Snapshot) error {
|
||||
}
|
||||
|
||||
func (w *WAL) saveCrc(prevCrc uint32) error {
|
||||
return w.encoder.encode(&walpb.Record{Type: CrcType, Crc: prevCrc})
|
||||
return w.encoder.encode(&walpb.Record{Type: CrcType, Crc: prevCrc, CreatedAt: w.clock.Now().Unix()})
|
||||
}
|
||||
|
||||
func (w *WAL) tail() *fileutil.LockedFile {
|
||||
|
@ -29,6 +29,8 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/jonboulle/clockwork"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/zap/zaptest"
|
||||
@ -49,7 +51,7 @@ var (
|
||||
func TestNew(t *testing.T) {
|
||||
p := t.TempDir()
|
||||
|
||||
w, err := Create(zaptest.NewLogger(t), p, []byte("somedata"))
|
||||
w, err := Create(zaptest.NewLogger(t), p, []byte("somedata"), clockwork.NewFakeClock())
|
||||
if err != nil {
|
||||
t.Fatalf("err = %v, want nil", err)
|
||||
}
|
||||
@ -75,17 +77,18 @@ func TestNew(t *testing.T) {
|
||||
|
||||
var wb bytes.Buffer
|
||||
e := newEncoder(&wb, 0, 0)
|
||||
err = e.encode(&walpb.Record{Type: CrcType, Crc: 0})
|
||||
err = e.encode(&walpb.Record{Type: CrcType, Crc: 0, CreatedAt: w.clock.Now().Unix()})
|
||||
if err != nil {
|
||||
t.Fatalf("err = %v, want nil", err)
|
||||
}
|
||||
err = e.encode(&walpb.Record{Type: MetadataType, Data: []byte("somedata")})
|
||||
err = e.encode(&walpb.Record{Type: MetadataType, Data: []byte("somedata"), CreatedAt: w.clock.Now().Unix()})
|
||||
if err != nil {
|
||||
t.Fatalf("err = %v, want nil", err)
|
||||
}
|
||||
r := &walpb.Record{
|
||||
Type: SnapshotType,
|
||||
Data: pbutil.MustMarshal(&walpb.Snapshot{}),
|
||||
CreatedAt: w.clock.Now().Unix(),
|
||||
}
|
||||
if err = e.encode(r); err != nil {
|
||||
t.Fatalf("err = %v, want nil", err)
|
||||
|
Loading…
x
Reference in New Issue
Block a user