-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: for Windows, copy snapshot files being backed up (#22551)
On Windows, make copies of files for snapshots, because Go does not support the FILE_SHARE_DELETE flag which allows files (and links) to be deleted while open. This causes temporary directories to be left behind after backups. closes #16289 (cherry picked from commit 3702fe8) closes #22557
- Loading branch information
1 parent
e06e34a
commit 1b34613
Showing
4 changed files
with
101 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
//go:build !windows | ||
// +build !windows | ||
|
||
package tsm1 | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
) | ||
|
||
// copyOrLink - allow substitution of a file copy for a hard link when running on Windows systems. | ||
func copyOrLink(oldPath, newPath string) error { | ||
if err := os.Link(oldPath, newPath); err != nil { | ||
return fmt.Errorf("error creating hard link for backup from %s to %s: %q", oldPath, newPath, err) | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
//go:build windows | ||
// +build windows | ||
|
||
package tsm1 | ||
|
||
import ( | ||
"fmt" | ||
"io" | ||
"os" | ||
) | ||
|
||
// copyOrLink - Windows does not permit deleting a file with open file handles, so | ||
// instead of hard links, make temporary copies of files that can then be deleted. | ||
func copyOrLink(oldPath, newPath string) (returnErr error) { | ||
rfd, err := os.Open(oldPath) | ||
if err != nil { | ||
return fmt.Errorf("error opening file for backup %s: %q", oldPath, err) | ||
} else { | ||
defer func() { | ||
if e := rfd.Close(); returnErr == nil && e != nil { | ||
returnErr = fmt.Errorf("error closing source file for backup %s: %q", oldPath, e) | ||
} | ||
}() | ||
} | ||
fi, err := rfd.Stat() | ||
if err != nil { | ||
fmt.Errorf("error collecting statistics from file for backup %s: %q", oldPath, err) | ||
} | ||
wfd, err := os.OpenFile(newPath, os.O_RDWR|os.O_CREATE, fi.Mode()) | ||
if err != nil { | ||
return fmt.Errorf("error creating temporary file for backup %s: %q", newPath, err) | ||
} else { | ||
defer func() { | ||
if e := wfd.Close(); returnErr == nil && e != nil { | ||
returnErr = fmt.Errorf("error closing temporary file for backup %s: %q", newPath, e) | ||
} | ||
}() | ||
} | ||
if _, err := io.Copy(wfd, rfd); err != nil { | ||
return fmt.Errorf("unable to copy file for backup from %s to %s: %q", oldPath, newPath, err) | ||
} | ||
if err := os.Chtimes(newPath, fi.ModTime(), fi.ModTime()); err != nil { | ||
return fmt.Errorf("unable to set modification time on temporary backup file %s: %q", newPath, err) | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters