mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
archive: tests and benchmarks for hardlinks
Adding moar information, so benchmark comparisons can be moar comparative. Signed-off-by: Vincent Batts <vbatts@redhat.com>
This commit is contained in:
parent
04932e38af
commit
0fdf7839a2
1 changed files with 107 additions and 4 deletions
|
@ -8,6 +8,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -63,6 +64,50 @@ func TestCmdStreamGood(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTarFiles(t *testing.T) {
|
||||||
|
// try without hardlinks
|
||||||
|
if err := checkNoChanges(1000, false); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// try with hardlinks
|
||||||
|
if err := checkNoChanges(1000, true); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkNoChanges(fileNum int, hardlinks bool) error {
|
||||||
|
srcDir, err := ioutil.TempDir("", "docker-test-srcDir")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(srcDir)
|
||||||
|
|
||||||
|
destDir, err := ioutil.TempDir("", "docker-test-destDir")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(destDir)
|
||||||
|
|
||||||
|
_, err = prepareUntarSourceDirectory(fileNum, srcDir, hardlinks)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = TarUntar(srcDir, destDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
changes, err := ChangesDirs(destDir, srcDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(changes) > 0 {
|
||||||
|
return fmt.Errorf("with %d files and %v hardlinks: expected 0 changes, got %d", fileNum, hardlinks, len(changes))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func tarUntar(t *testing.T, origin string, options *TarOptions) ([]Change, error) {
|
func tarUntar(t *testing.T, origin string, options *TarOptions) ([]Change, error) {
|
||||||
archive, err := TarWithOptions(origin, options)
|
archive, err := TarWithOptions(origin, options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -204,13 +249,42 @@ func TestUntarUstarGnuConflict(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func prepareUntarSourceDirectory(numberOfFiles int, targetPath string) (int, error) {
|
func getNlink(path string) (uint64, error) {
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
statT, ok := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if !ok {
|
||||||
|
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
||||||
|
}
|
||||||
|
return statT.Nlink, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getInode(path string) (uint64, error) {
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
statT, ok := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if !ok {
|
||||||
|
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
||||||
|
}
|
||||||
|
return statT.Ino, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) {
|
||||||
fileData := []byte("fooo")
|
fileData := []byte("fooo")
|
||||||
for n := 0; n < numberOfFiles; n++ {
|
for n := 0; n < numberOfFiles; n++ {
|
||||||
fileName := fmt.Sprintf("file-%d", n)
|
fileName := fmt.Sprintf("file-%d", n)
|
||||||
if err := ioutil.WriteFile(path.Join(targetPath, fileName), fileData, 0700); err != nil {
|
if err := ioutil.WriteFile(path.Join(targetPath, fileName), fileData, 0700); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
if makeLinks {
|
||||||
|
if err := os.Link(path.Join(targetPath, fileName), path.Join(targetPath, fileName+"-link")); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
totalSize := numberOfFiles * len(fileData)
|
totalSize := numberOfFiles * len(fileData)
|
||||||
return totalSize, nil
|
return totalSize, nil
|
||||||
|
@ -226,14 +300,43 @@ func BenchmarkTarUntar(b *testing.B) {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
target := path.Join(tempDir, "dest")
|
target := path.Join(tempDir, "dest")
|
||||||
n, err := prepareUntarSourceDirectory(100, origin)
|
n, err := prepareUntarSourceDirectory(100, origin, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
b.ResetTimer()
|
|
||||||
b.SetBytes(int64(n))
|
|
||||||
defer os.RemoveAll(origin)
|
defer os.RemoveAll(origin)
|
||||||
defer os.RemoveAll(tempDir)
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.SetBytes(int64(n))
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
err := TarUntar(origin, target)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
os.RemoveAll(target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkTarUntarWithLinks(b *testing.B) {
|
||||||
|
origin, err := ioutil.TempDir("", "docker-test-untar-origin")
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
tempDir, err := ioutil.TempDir("", "docker-test-untar-destination")
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
target := path.Join(tempDir, "dest")
|
||||||
|
n, err := prepareUntarSourceDirectory(100, origin, true)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(origin)
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
b.SetBytes(int64(n))
|
||||||
for n := 0; n < b.N; n++ {
|
for n := 0; n < b.N; n++ {
|
||||||
err := TarUntar(origin, target)
|
err := TarUntar(origin, target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue