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:
asaf-erlich
2019-03-07 11:23:35 -05:00
committed by Asaf Erlich
parent ce3f43e876
commit 4041044a93
2 changed files with 15 additions and 7 deletions
+1
View File
@@ -0,0 +1 @@
Update velero restore to not open every single file open during extraction of the data
+14 -7
View File
@@ -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
}