Browse Source

wal: release wal locks before renaming directory on init

Fixes #5852
Anthony Romano 9 years ago
parent
commit
5991209c2d
1 changed files with 12 additions and 5 deletions
  1. 12 5
      wal/wal.go

+ 12 - 5
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 {
+	// 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
 	}
-	if err := os.Rename(tmpdirpath, dirpath); err != 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
 	}
-
-	w.fp = newFilePipeline(w.dir, segmentSizeBytes)
-	return w, nil
+	return newWAL, nil
 }
 
 // Open opens the WAL at the given snap.