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"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
"math"
|
||||||
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
@ -55,6 +57,11 @@ import (
|
||||||
"github.com/fluxcd/pkg/apis/meta"
|
"github.com/fluxcd/pkg/apis/meta"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
percent10 = 10.0
|
||||||
|
percent80 = 80.0
|
||||||
|
)
|
||||||
|
|
||||||
func TestKustomizationReconciler_Decryptor(t *testing.T) {
|
func TestKustomizationReconciler_Decryptor(t *testing.T) {
|
||||||
g := NewWithT(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) {
|
func Test_isSOPSEncryptedResource(t *testing.T) {
|
||||||
g := NewWithT(t)
|
g := NewWithT(t)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue