From cd9e6a1d4f8b2a083d2947fee3f986e5ee55e0ee Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Wed, 4 May 2016 10:46:16 -0700 Subject: [PATCH] wal: lock WAL file while repairing --- wal/repair.go | 6 +++--- wal/repair_test.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wal/repair.go b/wal/repair.go index 6674c8a1d..f6391e31f 100644 --- a/wal/repair.go +++ b/wal/repair.go @@ -76,7 +76,7 @@ func Repair(dirpath string) bool { plog.Errorf("could not repair %v, failed to truncate file", f.Name()) return false } - if err = fileutil.Fsync(f); err != nil { + if err = fileutil.Fsync(f.File); err != nil { plog.Errorf("could not repair %v, failed to sync file", f.Name()) return false } @@ -89,7 +89,7 @@ func Repair(dirpath string) bool { } // openLast opens the last wal file for read and write. -func openLast(dirpath string) (*os.File, error) { +func openLast(dirpath string) (*fileutil.LockedFile, error) { names, err := fileutil.ReadDir(dirpath) if err != nil { return nil, err @@ -99,5 +99,5 @@ func openLast(dirpath string) (*os.File, error) { return nil, ErrFileNotFound } last := path.Join(dirpath, names[len(names)-1]) - return os.OpenFile(last, os.O_RDWR, 0) + return fileutil.LockFile(last, os.O_RDWR, 0600) } diff --git a/wal/repair_test.go b/wal/repair_test.go index 3d38d4406..07627833a 100644 --- a/wal/repair_test.go +++ b/wal/repair_test.go @@ -34,10 +34,8 @@ func TestRepairTruncate(t *testing.T) { if err != nil { return err } - if terr := f.Truncate(offset - 4); terr != nil { - return terr - } - return nil + defer f.Close() + return f.Truncate(offset - 4) } testRepair(t, makeEnts(10), corruptf, 9) @@ -140,6 +138,7 @@ func TestRepairWriteTearLast(t *testing.T) { if err != nil { return err } + defer f.Close() // 512 bytes perfectly aligns the last record, so use 1024 if offset < 1024 { return fmt.Errorf("got offset %d, expected >1024", offset) @@ -163,6 +162,7 @@ func TestRepairWriteTearMiddle(t *testing.T) { if err != nil { return err } + defer f.Close() // corrupt middle of 2nd record _, werr := f.WriteAt(make([]byte, 512), 4096+512) return werr