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