benchmark recurseKustomizationFiles()
Add benchmark for recurseKustomizationFiles() to measure the performance of recursively loading kustomization files with certain percentage of symlinks in the kustomizations. Signed-off-by: Sunny <darkowlzz@protonmail.com>
This commit is contained in:
parent
2f41b20d6b
commit
e7f7225d32
|
|
@ -22,6 +22,8 @@ import (
|
|||
"encoding/base64"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"math"
|
||||
"math/rand"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
|
|
@ -55,6 +57,11 @@ import (
|
|||
"github.com/fluxcd/pkg/apis/meta"
|
||||
)
|
||||
|
||||
const (
|
||||
percent10 = 10.0
|
||||
percent80 = 80.0
|
||||
)
|
||||
|
||||
func TestKustomizationReconciler_Decryptor(t *testing.T) {
|
||||
g := NewWithT(t)
|
||||
|
||||
|
|
@ -1573,6 +1580,92 @@ func Test_recurseKustomizationFiles(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
// benchmarkRecKustFiles runs benchmark for recurseKustomizationFiles().
|
||||
func benchmarkRecKustFiles(numKusNodes int, percentSymlinks float64, b *testing.B) {
|
||||
b.StopTimer()
|
||||
|
||||
numSymlinksFloat := (percentSymlinks / 100.0) * float64(numKusNodes)
|
||||
numSymlinks := int(math.Round(numSymlinksFloat))
|
||||
|
||||
g := NewWithT(b)
|
||||
tmpDir := b.TempDir()
|
||||
|
||||
// Create manifest directories. Write all the symlinked manifests in bar.
|
||||
// /tmp/test-dir/
|
||||
// ├── bar
|
||||
// │ └── 1
|
||||
// │ └── kustomization.yaml
|
||||
// │
|
||||
// └── foo
|
||||
// ├── 0
|
||||
// │ └── kustomization.yaml
|
||||
// └── 1 -> ../bar/1
|
||||
os.MkdirAll(filepath.Join(tmpDir, "foo"), 0o700)
|
||||
os.MkdirAll(filepath.Join(tmpDir, "bar"), 0o700)
|
||||
|
||||
// Generate index of kustomizations that'll be symlinked.
|
||||
rand.Seed(42) // Reproducible.
|
||||
randKusNodes := rand.Perm(numKusNodes)[0:numSymlinks]
|
||||
symlinkKusNodes := map[int]struct{}{}
|
||||
for _, n := range randKusNodes {
|
||||
symlinkKusNodes[n] = struct{}{}
|
||||
}
|
||||
|
||||
// Create kustomization nodes.
|
||||
// The kustomizations are chained to one another. The first kustomization
|
||||
// refers to the second, the second refers to the third, and so on.
|
||||
for kn := 0; kn < numKusNodes; kn++ {
|
||||
// /tmp/test-dir/foo/0
|
||||
kPath := filepath.Join(tmpDir, "foo", fmt.Sprint(kn))
|
||||
kus := kustypes.Kustomization{
|
||||
TypeMeta: kustypes.TypeMeta{
|
||||
APIVersion: kustypes.KustomizationVersion,
|
||||
Kind: kustypes.KustomizationKind,
|
||||
},
|
||||
Resources: []string{},
|
||||
}
|
||||
// Append next node reference, except for when it is the last node.
|
||||
if kn != numKusNodes-1 {
|
||||
kus.Resources = append(kus.Resources, filepath.Join("..", fmt.Sprint(kn+1)))
|
||||
}
|
||||
b, err := yaml.Marshal(kus)
|
||||
g.Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
// If this node is a symlink, create a symlink and write to the
|
||||
// respective source file. Else, write to the actual file.
|
||||
if _, ok := symlinkKusNodes[kn]; ok {
|
||||
srcPath := filepath.Join(tmpDir, "bar", fmt.Sprint(kn))
|
||||
g.Expect(os.MkdirAll(srcPath, 0o700)).ToNot(HaveOccurred())
|
||||
// Relative path from foo/0 to bar/0 is ../bar/0.
|
||||
g.Expect(os.Symlink(filepath.Join("..", "bar", fmt.Sprint(kn)), kPath)).ToNot(HaveOccurred())
|
||||
g.Expect(os.WriteFile(filepath.Join(srcPath, "kustomization.yaml"), b, 0o644)).ToNot(HaveOccurred())
|
||||
} else {
|
||||
g.Expect(os.MkdirAll(kPath, 0o700)).ToNot(HaveOccurred())
|
||||
g.Expect(os.WriteFile(filepath.Join(kPath, "kustomization.yaml"), b, 0o644)).ToNot(HaveOccurred())
|
||||
}
|
||||
}
|
||||
|
||||
// no-op visit.
|
||||
visit := func(root, path string, kus *kustypes.Kustomization) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
b.StartTimer()
|
||||
for n := 0; n < b.N; n++ {
|
||||
visited := make(map[string]struct{})
|
||||
recurseKustomizationFiles(tmpDir, filepath.Join(tmpDir, "foo", "0"), visit, visited)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkRecKust10Nodes10pcSymlink(b *testing.B) { benchmarkRecKustFiles(10, percent10, b) }
|
||||
func BenchmarkRecKust10Nodes80pcSymlink(b *testing.B) { benchmarkRecKustFiles(10, percent80, b) }
|
||||
func BenchmarkRecKust100Nodes10pcSymlink(b *testing.B) { benchmarkRecKustFiles(100, percent10, b) }
|
||||
func BenchmarkRecKust100Nodes80pcSymlink(b *testing.B) { benchmarkRecKustFiles(100, percent80, b) }
|
||||
func BenchmarkRecKust1000Nodes10pcSymlink(b *testing.B) { benchmarkRecKustFiles(1000, percent10, b) }
|
||||
func BenchmarkRecKust1000Nodes80pcSymlink(b *testing.B) { benchmarkRecKustFiles(1000, percent80, b) }
|
||||
func BenchmarkRecKust10000Nodes10pcSymlink(b *testing.B) { benchmarkRecKustFiles(10000, percent10, b) }
|
||||
func BenchmarkRecKust10000Nodes80pcSymlink(b *testing.B) { benchmarkRecKustFiles(10000, percent80, b) }
|
||||
|
||||
func Test_isSOPSEncryptedResource(t *testing.T) {
|
||||
g := NewWithT(t)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue