mirror of
https://github.com/vmware-tanzu/velero.git
synced 2026-09-30 03:36:12 +00:00
Update ark restore to not open every single file open during extraction of the data
Original error was: ``` ark -n <redacted> restore logs <redacted> time="2019-03-06T18:31:06Z" level=info msg="Not including resource" groupResource=nodes logSource="pkg/restore/restore.go:124" time="2019-03-06T18:31:06Z" level=info msg="Not including resource" groupResource=events logSource="pkg/restore/restore.go:124" time="2019-03-06T18:31:06Z" level=info msg="Not including resource" groupResource=events.events.k8s.io logSource="pkg/restore/restore.go:124" time="2019-03-06T18:31:06Z" level=info msg="Not including resource" groupResource=backups.ark.heptio.com logSource="pkg/restore/restore.go:124" time="2019-03-06T18:31:06Z" level=info msg="Not including resource" groupResource=restores.ark.heptio.com logSource="pkg/restore/restore.go:124" time="2019-03-06T18:31:06Z" level=info msg="Starting restore of backup backup/<redacted>" logSource="pkg/restore/restore.go:342" time="2019-03-06T18:31:06Z" level=info msg="error unzipping and extracting: open /tmp/604421455/resources/rolebindings.rbac.authorization.k8s.io/namespaces/<redacted>/<redacted>: too many open files" logSource="pkg/restore/restore.go:346" ``` Downloading the directory from s3 and untarring it I found 1036 files. The ulimit -n output says 1024. This is our team's best guess at a root cause. But the code fixed in the PR definitely is holding all the files open until the method closes: https://blog.learngoprogramming.com/gotchas-of-defer-in-go-1-8d070894cb01 Please note my go code abilities are not great and I did not test this. I just edited the file in github. All I did was remove the defer and put fileClose after the copy is done. Theoretically this should only hold one file open at a time now. Let me know if you want me to do any further steps. Thank you, -Asaf Signed-off-by: Asaf Erlich <aerlich@groupon.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
Update velero restore to not open every single file open during extraction of the data
|
||||
@@ -46,6 +46,19 @@ func (e *backupExtractor) unzipAndExtractBackup(src io.Reader) (string, error) {
|
||||
return e.readBackup(tar.NewReader(gzr))
|
||||
}
|
||||
|
||||
func (e *backupExtractor) writeFile(target string, tarRdr *tar.Reader) error {
|
||||
file, err := e.fileSystem.Create(target)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if _, err := io.Copy(file, tarRdr); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *backupExtractor) readBackup(tarRdr *tar.Reader) (string, error) {
|
||||
dir, err := e.fileSystem.TempDir("", "")
|
||||
if err != nil {
|
||||
@@ -83,13 +96,7 @@ func (e *backupExtractor) readBackup(tarRdr *tar.Reader) (string, error) {
|
||||
}
|
||||
|
||||
// create the file
|
||||
file, err := e.fileSystem.Create(target)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if _, err := io.Copy(file, tarRdr); err != nil {
|
||||
if err := e.writeFile(target, tarRdr); err != nil {
|
||||
e.log.Infof("error copying: %v", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user