mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
archive: add buffers to operations with tarballs
Docker-DCO-1.1-Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com> (github: unclejack)
This commit is contained in:
parent
ed92c3f964
commit
a377844998
4 changed files with 28 additions and 8 deletions
|
@ -131,7 +131,7 @@ func (compression *Compression) Extension() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func addTarFile(path, name string, tw *tar.Writer) error {
|
func addTarFile(path, name string, tw *tar.Writer, twBuf *bufio.Writer) error {
|
||||||
fi, err := os.Lstat(path)
|
fi, err := os.Lstat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -181,11 +181,18 @@ func addTarFile(path, name string, tw *tar.Writer) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := io.Copy(tw, file); err != nil {
|
|
||||||
file.Close()
|
twBuf.Reset(tw)
|
||||||
|
_, err = io.Copy(twBuf, file)
|
||||||
|
file.Close()
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
file.Close()
|
err = twBuf.Flush()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
twBuf.Reset(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -328,6 +335,8 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error)
|
||||||
options.Includes = []string{"."}
|
options.Includes = []string{"."}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
twBuf := bufio.NewWriterSize(nil, twBufSize)
|
||||||
|
|
||||||
for _, include := range options.Includes {
|
for _, include := range options.Includes {
|
||||||
filepath.Walk(filepath.Join(srcPath, include), func(filePath string, f os.FileInfo, err error) error {
|
filepath.Walk(filepath.Join(srcPath, include), func(filePath string, f os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -355,7 +364,7 @@ func TarWithOptions(srcPath string, options *TarOptions) (io.ReadCloser, error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := addTarFile(filePath, relFilePath, tw); err != nil {
|
if err := addTarFile(filePath, relFilePath, tw, twBuf); err != nil {
|
||||||
utils.Debugf("Can't add file %s to tar: %s\n", srcPath, err)
|
utils.Debugf("Can't add file %s to tar: %s\n", srcPath, err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -394,6 +403,7 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
|
||||||
defer decompressedArchive.Close()
|
defer decompressedArchive.Close()
|
||||||
|
|
||||||
tr := tar.NewReader(decompressedArchive)
|
tr := tar.NewReader(decompressedArchive)
|
||||||
|
trBuf := bufio.NewReaderSize(nil, trBufSize)
|
||||||
|
|
||||||
var dirs []*tar.Header
|
var dirs []*tar.Header
|
||||||
|
|
||||||
|
@ -439,7 +449,8 @@ func Untar(archive io.Reader, dest string, options *TarOptions) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := createTarFile(path, dest, hdr, tr, options == nil || !options.NoLchown); err != nil {
|
trBuf.Reset(tr)
|
||||||
|
if err := createTarFile(path, dest, hdr, trBuf, options == nil || !options.NoLchown); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package archive
|
package archive
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
@ -343,6 +344,7 @@ func ExportChanges(dir string, changes []Change) (Archive, error) {
|
||||||
tw := tar.NewWriter(writer)
|
tw := tar.NewWriter(writer)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
twBuf := bufio.NewWriterSize(nil, twBufSize)
|
||||||
// In general we log errors here but ignore them because
|
// In general we log errors here but ignore them because
|
||||||
// during e.g. a diff operation the container can continue
|
// during e.g. a diff operation the container can continue
|
||||||
// mutating the filesystem and we can see transient errors
|
// mutating the filesystem and we can see transient errors
|
||||||
|
@ -365,7 +367,7 @@ func ExportChanges(dir string, changes []Change) (Archive, error) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
path := filepath.Join(dir, change.Path)
|
path := filepath.Join(dir, change.Path)
|
||||||
if err := addTarFile(path, change.Path[1:], tw); err != nil {
|
if err := addTarFile(path, change.Path[1:], tw, twBuf); err != nil {
|
||||||
utils.Debugf("Can't add file %s to tar: %s\n", path, err)
|
utils.Debugf("Can't add file %s to tar: %s\n", path, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
archive/common.go
Normal file
4
archive/common.go
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
package archive
|
||||||
|
|
||||||
|
const twBufSize = 32 * 1024
|
||||||
|
const trBufSize = 32 * 1024
|
|
@ -1,6 +1,7 @@
|
||||||
package archive
|
package archive
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -32,6 +33,7 @@ func ApplyLayer(dest string, layer ArchiveReader) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
tr := tar.NewReader(layer)
|
tr := tar.NewReader(layer)
|
||||||
|
trBuf := bufio.NewReaderSize(nil, trBufSize)
|
||||||
|
|
||||||
var dirs []*tar.Header
|
var dirs []*tar.Header
|
||||||
|
|
||||||
|
@ -108,7 +110,8 @@ func ApplyLayer(dest string, layer ArchiveReader) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
srcData := io.Reader(tr)
|
trBuf.Reset(tr)
|
||||||
|
srcData := io.Reader(trBuf)
|
||||||
srcHdr := hdr
|
srcHdr := hdr
|
||||||
|
|
||||||
// Hard links into /.wh..wh.plnk don't work, as we don't extract that directory, so
|
// Hard links into /.wh..wh.plnk don't work, as we don't extract that directory, so
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue