Adding moar information, so benchmark comparisons can be moar
comparative.
Signed-off-by: Vincent Batts <vbatts@redhat.com>
| ... | ... |
@@ -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 {
|