github.com/rawahars/moby@v24.0.4+incompatible/daemon/graphdriver/graphtest/graphbench_unix.go (about)

     1  //go:build linux || freebsd
     2  // +build linux freebsd
     3  
     4  package graphtest // import "github.com/docker/docker/daemon/graphdriver/graphtest"
     5  
     6  import (
     7  	"io"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/docker/docker/pkg/stringid"
    13  	"gotest.tools/v3/assert"
    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, "")
    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, "")
    77  		if err != nil {
    78  			b.Fatal(err)
    79  		}
    80  		_, err = io.Copy(io.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, "")
   113  		if err != nil {
   114  			b.Fatal(err)
   115  		}
   116  		_, err = io.Copy(io.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, "")
   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, "")
   164  		if err != nil {
   165  			b.Fatal(err)
   166  		}
   167  
   168  		applyDiffSize, err := driver.ApplyDiff(diff, "", arch)
   169  		if err != nil {
   170  			b.Fatal(err)
   171  		}
   172  
   173  		b.StopTimer()
   174  		arch.Close()
   175  
   176  		// suppressing "SA9003: empty branch (staticcheck)" instead of commenting-out/removing
   177  		// these lines because removing/commenting these lines causes a ripple effect
   178  		// of changes, and there's still a to-do below
   179  		//nolint:staticcheck,revive
   180  		if applyDiffSize != diffSize {
   181  			// TODO: enforce this
   182  			// b.Fatalf("Apply diff size different, got %d, expected %s", applyDiffSize, diffSize)
   183  		}
   184  		if err := checkManyFiles(driver, diff, fileCount, 6); err != nil {
   185  			b.Fatal(err)
   186  		}
   187  	}
   188  }
   189  
   190  // DriverBenchDeepLayerDiff benchmarks calls to diff on top of a given number of layers.
   191  func DriverBenchDeepLayerDiff(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
   192  	driver := GetDriver(b, drivername, driveroptions...)
   193  	defer PutDriver(b)
   194  
   195  	base := stringid.GenerateRandomID()
   196  	if err := driver.Create(base, "", nil); err != nil {
   197  		b.Fatal(err)
   198  	}
   199  
   200  	if err := addFiles(driver, base, 50); err != nil {
   201  		b.Fatal(err)
   202  	}
   203  
   204  	topLayer, err := addManyLayers(driver, base, layerCount)
   205  	if err != nil {
   206  		b.Fatal(err)
   207  	}
   208  
   209  	b.ResetTimer()
   210  	for i := 0; i < b.N; i++ {
   211  		arch, err := driver.Diff(topLayer, "")
   212  		if err != nil {
   213  			b.Fatal(err)
   214  		}
   215  		_, err = io.Copy(io.Discard, arch)
   216  		if err != nil {
   217  			b.Fatalf("Error copying archive: %s", err)
   218  		}
   219  		arch.Close()
   220  	}
   221  }
   222  
   223  // DriverBenchDeepLayerRead benchmarks calls to read a file under a given number of layers.
   224  func DriverBenchDeepLayerRead(b *testing.B, layerCount int, drivername string, driveroptions ...string) {
   225  	driver := GetDriver(b, drivername, driveroptions...)
   226  	defer PutDriver(b)
   227  
   228  	base := stringid.GenerateRandomID()
   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  		// Read content
   252  		c, err := os.ReadFile(filepath.Join(root, "testfile.txt"))
   253  		if err != nil {
   254  			b.Fatal(err)
   255  		}
   256  
   257  		b.StopTimer()
   258  		assert.DeepEqual(b, content, c)
   259  		b.StartTimer()
   260  	}
   261  }