From 5991209c2dce3816db8663e24d69485b5e0874ad Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Sat, 2 Jul 2016 12:14:37 -0700 Subject: [PATCH] wal: release wal locks before renaming directory on init Fixes #5852 --- wal/wal.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/wal/wal.go b/wal/wal.go index d924a458f..e9ca81e2a 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -129,15 +129,22 @@ func Create(dirpath string, metadata []byte) (*WAL, error) { return nil, err } - if err := os.RemoveAll(dirpath); err != nil { - return nil, err - } + // rename of directory with locked files doesn't work on windows; close + // the WAL to release the locks so the directory can be renamed + w.Close() if err := os.Rename(tmpdirpath, dirpath); err != nil { return nil, err } - - w.fp = newFilePipeline(w.dir, segmentSizeBytes) - return w, nil + // reopen and relock + newWAL, oerr := Open(dirpath, walpb.Snapshot{}) + if oerr != nil { + return nil, oerr + } + if _, _, _, err := newWAL.ReadAll(); err != nil { + newWAL.Close() + return nil, err + } + return newWAL, nil } // Open opens the WAL at the given snap.