From cbbc8ec69e61aeca0a9397c54b3576474d0f08a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Tyczy=C5=84ski?= Date: Thu, 24 Nov 2022 10:37:17 +0100 Subject: [PATCH] Add microbenchmark for listing from watchcache --- test/integration/apiserver/watchcache_test.go | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/test/integration/apiserver/watchcache_test.go b/test/integration/apiserver/watchcache_test.go index f98343e31d2..b5abfb368eb 100644 --- a/test/integration/apiserver/watchcache_test.go +++ b/test/integration/apiserver/watchcache_test.go @@ -19,6 +19,7 @@ package apiserver import ( "context" "fmt" + "sync" "testing" "time" @@ -164,3 +165,68 @@ func TestWatchCacheUpdatedByEtcd(t *testing.T) { t.Errorf("Events watchcache unexpected synced: %v", err) } } + +func BenchmarkListFromWatchCache(b *testing.B) { + c, _, tearDownFn := framework.StartTestServer(b, framework.TestServerSetup{ + ModifyServerConfig: func(config *controlplane.Config) { + // Switch off endpoints reconciler to avoid unnecessary operations. + config.ExtraConfig.EndpointReconcilerType = reconcilers.NoneEndpointReconcilerType + }, + }) + defer tearDownFn() + + namespaces, secretsPerNamespace := 100, 1000 + wg := sync.WaitGroup{} + + errCh := make(chan error, namespaces) + for i := 0; i < namespaces; i++ { + wg.Add(1) + index := i + go func() { + defer wg.Done() + + ctx := context.Background() + ns := &v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{Name: fmt.Sprintf("namespace-%d", index)}, + } + ns, err := c.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{}) + if err != nil { + errCh <- err + return + } + + for j := 0; j < secretsPerNamespace; j++ { + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("secret-%d", j), + }, + } + _, err := c.CoreV1().Secrets(ns.Name).Create(ctx, secret, metav1.CreateOptions{}) + if err != nil { + errCh <- err + return + } + } + }() + } + + wg.Wait() + close(errCh) + for err := range errCh { + b.Error(err) + } + + b.ResetTimer() + + ctx := context.Background() + opts := metav1.ListOptions{ + ResourceVersion: "0", + } + for i := 0; i < b.N; i++ { + secrets, err := c.CoreV1().Secrets("").List(ctx, opts) + if err != nil { + b.Errorf("failed to list secrets: %v", err) + } + b.Logf("Number of secrets: %d", len(secrets.Items)) + } +}