github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/graphdriver/graphtest/graphbench_unix.go (about)

     1  // +build linux freebsd
     2  
     3  package graphtest
     4  
     5  import (
     6  	"bytes"
     7  	"io"
     8  	"io/ioutil"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/docker/docker/pkg/stringid"
    13  )
    14  
    15  // DriverBenchExists benchmarks calls to exist
    16  func DriverBenchExists(b *testing.B, drivername string, driveroptions ...string) {
    17  	driver := GetDriver(b, drivername, driveroptions...)
    18  	defer PutDriver(b)
    19  
    20  	base := stringid.GenerateRandomID()
    21  
    22  	if err := driver.Create(base, "", "", nil); err != nil {
    23  		b.Fatal(err)
    24  	}
    25  
    26  	b.ResetTimer()
    27  	for i := 0; i < b.N; i++ {
    28  		if !driver.Exists(base) {
    29  			b.Fatal("Newly created image doesn't exist")
    30  		}
    31  	}
    32  }
    33  
    34  // DriverBenchGetEmpty benchmarks calls to get on an empty layer
    35  func DriverBenchGetEmpty(b *testing.B, drivername string, driveroptions ...string) {
    36  	driver := GetDriver(b, drivername, driveroptions...)
    37  	defer PutDriver(b)
    38  
    39  	base := stringid.GenerateRandomID()
    40  
    41  	if err := driver.Create(base, "", "", nil); err != nil {
    42  		b.Fatal(err)
    43  	}
    44  
    45  	b.ResetTimer()
    46  	for i := 0; i < b.N; i++ {
    47  		_, err := driver.Get(base, "")
    48  		b.StopTimer()
    49  		if err != nil {
    50  			b.Fatalf("Error getting mount: %s", err)
    51  		}
    52  		if err := driver.Put(base); err != nil {
    53  			b.Fatalf("Error putting mount: %s", err)
    54  		}
    55  		b.StartTimer()
    56  	}
    57  }
    58  
    59  // DriverBenchDiffBase benchmarks calls to diff on a root layer
    60  func DriverBenchDiffBase(b *testing.B, drivername string, driveroptions ...string) {
    61  	driver := GetDriver(b, drivername, driveroptions...)
    62  	defer PutDriver(b)
    63  
    64  	base := stringid.GenerateRandomID()
    65  
    66  	if err := driver.Create(base, "", "", nil); err != nil {
    67  		b.Fatal(err)
    68  	}
    69  
    70  	if err := addFiles(driver, base, 3); err != nil {
    71  		b.Fatal(err)
    72  	}
    73  
    74  	b.ResetTimer()
    75  	for i := 0; i < b.N; i++ {
    76  		arch, err := driver.Diff(base, "")
    77  		if err != nil {
    78  			b.Fatal(err)
    79  		}
    80  		_, err = io.Copy(ioutil.Discard, arch)
    81  		if err != nil {
    82  			b.Fatalf("Error copying archive: %s", err)
    83  		}
    84  		arch.Close()
    85  	}
    86  }
    87  
    88  // DriverBenchDiffN benchmarks calls to diff on two layers with
    89  // a provided number of files on the lower and upper layers.
    90  func DriverBenchDiffN(b *testing.B, bottom, top int, drivername string, driveroptions ...string) {
    91  	driver := GetDriver(b, drivername, driveroptions...)
    92  	defer PutDriver(b)
    93  	base := stringid.GenerateRandomID()
    94  	upper := stringid.GenerateRandomID()
    95  
    96  	if err := driver.Create(base, "", "", nil); err != nil {
    97  		b.Fatal(err)
    98  	}
    99  
   100  	if err := addManyFiles(driver, base, bottom, 3); err != nil {
   101  		b.Fatal(err)
   102  	}
   103  
   104  	if err := driver.Create(upper, base, "", nil); err != nil {
   105  		b.Fatal(err)
   106  	}
   107  
   108  	if err := addManyFiles(driver, upper, top, 6); err != nil {
   109  		b.Fatal(err)
   110  	}
   111  	b.ResetTimer()
   112  	for i := 0; i < b.N; i++ {
   113  		arch, err := driver.Diff(upper, "")
   114  		if err != nil {
   115  			b.Fatal(err)
   116  		}
   117  		_, err = io.Copy(ioutil.Discard, arch)
   118  		if err != nil {
   119  			b.Fatalf("Error copying archive: %s", err)
   120  		}
   121  		arch.Close()
   122  	}
   123  }
   124  
   125  // DriverBenchDiffApplyN benchmarks calls to diff and apply together
   126  func DriverBenchDiffApplyN(b *testing.B, fileCount int, drivername string, driveroptions ...string) {
   127  	driver := GetDriver(b, drivername, driveroptions...)
   128  	defer PutDriver(b)
   129  	base := stringid.GenerateRandomID()
   130  	upper := stringid.GenerateRandomID()
   131  
   132  	if err := driver.Create(base, "", "", nil); err != nil {
   133  		b.Fatal(err)
   134  	}
   135  
   136  	if err := addManyFiles(driver, base, fileCount, 3); err != nil {
   137  		b.Fatal(err)
   138  	}
   139  
   140  	if err := driver.Create(upper, base, "", nil); err != nil {
   141  		b.Fatal(err)
   142  	}
   143  
   144  	if err := addManyFiles(driver, upper, fileCount, 6); err != nil {
   145  		b.Fatal(err)
   146  	}
   147  	diffSize, err := driver.DiffSize(upper, "")
   148  	if err != nil {
   149  		b.Fatal(err)
   150  	}
   151  	b.ResetTimer()
   152  	b.StopTimer()
   153  	for i := 0; i < b.N; i++ {
   154  		diff := stringid.GenerateRandomID()
   155  		if err := driver.Create(diff, base, "", nil); err != nil {
   156  			b.Fatal(err)
   157  		}
   158  
   159  		if err := checkManyFiles(driver, diff, fileCount, 3); err != nil {
   160  			b.Fatal(err)
   161  		}
   162  
   163  		b.StartTimer()
   164  
   165  		arch, err := driver.Diff(upper, "")
   166  		if err != nil {
   167  			b.Fatal(err)
   168  		}
   169  
   170  		applyDiffSize, err := driver.ApplyDiff(diff, "", arch)
   171  		if err != nil {
   172  			b.Fatal(err)
   173  		}
   174  
   175  		b.StopTimer()
   176  		arch.Close()
   177  
   178  		if applyDiffSize != diffSize {
   179  			// TODO: enforce this
   180  			//b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize)
   181  		}
   182  		if err := checkManyFiles(driver, diff, fileCount, 6); err != nil {
   183  			b.Fatal(err)
   184  		}
   185  	}
   186  }
   187  
   188  // DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers.
   189  func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
   190  	driver := GetDriver(b, drivername, driveroptions...)
   191  	defer PutDriver(b)
   192  
   193  	base := stringid.GenerateRandomID()
   194  
   195  	if err := driver.Create(base, "", "", nil); err != nil {
   196  		b.Fatal(err)
   197  	}
   198  
   199  	if err := addFiles(driver, base, 50); err != nil {
   200  		b.Fatal(err)
   201  	}
   202  
   203  	topLayer, err := addManyLayers(driver, base, layerCount)
   204  	if err != nil {
   205  		b.Fatal(err)
   206  	}
   207  
   208  	b.ResetTimer()
   209  	for i := 0; i < b.N; i++ {
   210  		arch, err := driver.Diff(topLayer, "")
   211  		if err != nil {
   212  			b.Fatal(err)
   213  		}
   214  		_, err = io.Copy(ioutil.Discard, arch)
   215  		if err != nil {
   216  			b.Fatalf("Error copying archive: %s", err)
   217  		}
   218  		arch.Close()
   219  	}
   220  }
   221  
   222  // DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers.
   223  func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
   224  	driver := GetDriver(b, drivername, driveroptions...)
   225  	defer PutDriver(b)
   226  
   227  	base := stringid.GenerateRandomID()
   228  
   229  	if err := driver.Create(base, "", "", nil); err != nil {
   230  		b.Fatal(err)
   231  	}
   232  
   233  	content := []byte("test content")
   234  	if err := addFile(driver, base, "testfile.txt", content); err != nil {
   235  		b.Fatal(err)
   236  	}
   237  
   238  	topLayer, err := addManyLayers(driver, base, layerCount)
   239  	if err != nil {
   240  		b.Fatal(err)
   241  	}
   242  
   243  	root, err := driver.Get(topLayer, "")
   244  	if err != nil {
   245  		b.Fatal(err)
   246  	}
   247  	defer driver.Put(topLayer)
   248  
   249  	b.ResetTimer()
   250  	for i := 0; i < b.N; i++ {
   251  
   252  		// Read content
   253  		c, err := ioutil.ReadFile(filepath.Join(root, "testfile.txt"))
   254  		if err != nil {
   255  			b.Fatal(err)
   256  		}
   257  
   258  		b.StopTimer()
   259  		if bytes.Compare(c, content) != 0 {
   260  			b.Fatalf("Wrong content in file %v, expected %v", c, content)
   261  		}
   262  		b.StartTimer()
   263  	}
   264  }