Browse code

archive: tests and benchmarks for hardlinks

Adding moar information, so benchmark comparisons can be moar
comparative.

Signed-off-by: Vincent Batts <vbatts@redhat.com>

Vincent Batts authored on 2014/09/27 00:55:23
Showing 1 changed files
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"os"
9 9
 	"os/exec"
10 10
 	"path"
11
+	"syscall"
11 12
 	"testing"
12 13
 	"time"
13 14
 
... ...
@@ -63,6 +64,50 @@ func TestCmdStreamGood(t *testing.T) {
63 63
 	}
64 64
 }
65 65
 
66
+func TestTarFiles(t *testing.T) {
67
+	// try without hardlinks
68
+	if err := checkNoChanges(1000, false); err != nil {
69
+		t.Fatal(err)
70
+	}
71
+	// try with hardlinks
72
+	if err := checkNoChanges(1000, true); err != nil {
73
+		t.Fatal(err)
74
+	}
75
+}
76
+
77
+func checkNoChanges(fileNum int, hardlinks bool) error {
78
+	srcDir, err := ioutil.TempDir("", "docker-test-srcDir")
79
+	if err != nil {
80
+		return err
81
+	}
82
+	defer os.RemoveAll(srcDir)
83
+
84
+	destDir, err := ioutil.TempDir("", "docker-test-destDir")
85
+	if err != nil {
86
+		return err
87
+	}
88
+	defer os.RemoveAll(destDir)
89
+
90
+	_, err = prepareUntarSourceDirectory(fileNum, srcDir, hardlinks)
91
+	if err != nil {
92
+		return err
93
+	}
94
+
95
+	err = TarUntar(srcDir, destDir)
96
+	if err != nil {
97
+		return err
98
+	}
99
+
100
+	changes, err := ChangesDirs(destDir, srcDir)
101
+	if err != nil {
102
+		return err
103
+	}
104
+	if len(changes) > 0 {
105
+		return fmt.Errorf("with %d files and %v hardlinks: expected 0 changes, got %d", fileNum, hardlinks, len(changes))
106
+	}
107
+	return nil
108
+}
109
+
66 110
 func tarUntar(t *testing.T, origin string, options *TarOptions) ([]Change, error) {
67 111
 	archive, err := TarWithOptions(origin, options)
68 112
 	if err != nil {
... ...
@@ -204,13 +249,42 @@ func TestUntarUstarGnuConflict(t *testing.T) {
204 204
 	}
205 205
 }
206 206
 
207
-func prepareUntarSourceDirectory(numberOfFiles int, targetPath string) (int, error) {
207
+func getNlink(path string) (uint64, error) {
208
+	stat, err := os.Stat(path)
209
+	if err != nil {
210
+		return 0, err
211
+	}
212
+	statT, ok := stat.Sys().(*syscall.Stat_t)
213
+	if !ok {
214
+		return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
215
+	}
216
+	return statT.Nlink, nil
217
+}
218
+
219
+func getInode(path string) (uint64, error) {
220
+	stat, err := os.Stat(path)
221
+	if err != nil {
222
+		return 0, err
223
+	}
224
+	statT, ok := stat.Sys().(*syscall.Stat_t)
225
+	if !ok {
226
+		return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
227
+	}
228
+	return statT.Ino, nil
229
+}
230
+
231
+func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) {
208 232
 	fileData := []byte("fooo")
209 233
 	for n := 0; n < numberOfFiles; n++ {
210 234
 		fileName := fmt.Sprintf("file-%d", n)
211 235
 		if err := ioutil.WriteFile(path.Join(targetPath, fileName), fileData, 0700); err != nil {
212 236
 			return 0, err
213 237
 		}
238
+		if makeLinks {
239
+			if err := os.Link(path.Join(targetPath, fileName), path.Join(targetPath, fileName+"-link")); err != nil {
240
+				return 0, err
241
+			}
242
+		}
214 243
 	}
215 244
 	totalSize := numberOfFiles * len(fileData)
216 245
 	return totalSize, nil
... ...
@@ -226,14 +300,43 @@ func BenchmarkTarUntar(b *testing.B) {
226 226
 		b.Fatal(err)
227 227
 	}
228 228
 	target := path.Join(tempDir, "dest")
229
-	n, err := prepareUntarSourceDirectory(100, origin)
229
+	n, err := prepareUntarSourceDirectory(100, origin, false)
230 230
 	if err != nil {
231 231
 		b.Fatal(err)
232 232
 	}
233
+	defer os.RemoveAll(origin)
234
+	defer os.RemoveAll(tempDir)
235
+
233 236
 	b.ResetTimer()
234 237
 	b.SetBytes(int64(n))
238
+	for n := 0; n < b.N; n++ {
239
+		err := TarUntar(origin, target)
240
+		if err != nil {
241
+			b.Fatal(err)
242
+		}
243
+		os.RemoveAll(target)
244
+	}
245
+}
246
+
247
+func BenchmarkTarUntarWithLinks(b *testing.B) {
248
+	origin, err := ioutil.TempDir("", "docker-test-untar-origin")
249
+	if err != nil {
250
+		b.Fatal(err)
251
+	}
252
+	tempDir, err := ioutil.TempDir("", "docker-test-untar-destination")
253
+	if err != nil {
254
+		b.Fatal(err)
255
+	}
256
+	target := path.Join(tempDir, "dest")
257
+	n, err := prepareUntarSourceDirectory(100, origin, true)
258
+	if err != nil {
259
+		b.Fatal(err)
260
+	}
235 261
 	defer os.RemoveAll(origin)
236 262
 	defer os.RemoveAll(tempDir)
263
+
264
+	b.ResetTimer()
265
+	b.SetBytes(int64(n))
237 266
 	for n := 0; n < b.N; n++ {
238 267
 		err := TarUntar(origin, target)
239 268
 		if err != nil {