Skip to content

Commit a88f1fc

Browse files
authored
make repository sync frequency configurable (#4076)
Signed-off-by: himanshuchahar <[email protected]>
1 parent 5f1d54b commit a88f1fc

File tree

8 files changed

+64
-12
lines changed

8 files changed

+64
-12
lines changed

porch/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ run-local: porch
159159
--standalone-debug-mode \
160160
--kubeconfig="$(KUBECONFIG)" \
161161
--cache-directory="$(CACHEDIR)" \
162-
--function-runner 192.168.8.202:9445
162+
--function-runner 192.168.8.202:9445 \
163+
--repo-sync-frequency=60s
163164

164165
.PHONY: run-jaeger
165166
run-jaeger:

porch/deployments/porch/3-porch-server.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ spec:
7373
- --cache-directory=/cache
7474
- --cert-dir=/tmp/certs
7575
- --secure-port=4443
76+
- --repo-sync-frequency=60s
7677

7778
---
7879
apiVersion: v1

porch/pkg/apiserver/apiserver.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"fmt"
2020
"os"
21+
"time"
2122

2223
"github.com/GoogleContainerTools/kpt/internal/fnruntime"
2324
"github.com/GoogleContainerTools/kpt/porch/api/porch/install"
@@ -76,6 +77,7 @@ type ExtraConfig struct {
7677
CacheDirectory string
7778
FunctionRunnerAddress string
7879
DefaultImagePrefix string
80+
RepoSyncFrequency time.Duration
7981
}
8082

8183
// Config defines the config for the apiserver
@@ -220,7 +222,7 @@ func (c completedConfig) New() (*PorchServer, error) {
220222

221223
watcherMgr := engine.NewWatcherManager()
222224

223-
cache := cache.NewCache(c.ExtraConfig.CacheDirectory, cache.CacheOptions{
225+
cache := cache.NewCache(c.ExtraConfig.CacheDirectory, c.ExtraConfig.RepoSyncFrequency, cache.CacheOptions{
224226
CredentialResolver: credentialResolver,
225227
UserInfoProvider: userInfoProvider,
226228
MetadataStore: metadataStore,

porch/pkg/cache/cache.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"path/filepath"
2222
"sync"
23+
"time"
2324

2425
kptoci "github.com/GoogleContainerTools/kpt/pkg/oci"
2526
configapi "github.com/GoogleContainerTools/kpt/porch/api/porchconfig/v1alpha1"
@@ -48,8 +49,8 @@ type Cache struct {
4849
credentialResolver repository.CredentialResolver
4950
userInfoProvider repository.UserInfoProvider
5051
metadataStore meta.MetadataStore
51-
52-
objectNotifier objectNotifier
52+
repoSyncFrequency time.Duration
53+
objectNotifier objectNotifier
5354
}
5455

5556
type objectNotifier interface {
@@ -63,14 +64,15 @@ type CacheOptions struct {
6364
ObjectNotifier objectNotifier
6465
}
6566

66-
func NewCache(cacheDir string, opts CacheOptions) *Cache {
67+
func NewCache(cacheDir string, repoSyncFrequency time.Duration, opts CacheOptions) *Cache {
6768
return &Cache{
6869
repositories: make(map[string]*cachedRepository),
6970
cacheDir: cacheDir,
7071
credentialResolver: opts.CredentialResolver,
7172
userInfoProvider: opts.UserInfoProvider,
7273
metadataStore: opts.MetadataStore,
7374
objectNotifier: opts.ObjectNotifier,
75+
repoSyncFrequency: repoSyncFrequency,
7476
}
7577
}
7678

@@ -101,7 +103,7 @@ func (c *Cache) OpenRepository(ctx context.Context, repositorySpec *configapi.Re
101103
if err != nil {
102104
return nil, err
103105
}
104-
cr = newRepository(key, repositorySpec, r, c.objectNotifier, c.metadataStore)
106+
cr = newRepository(key, repositorySpec, r, c.objectNotifier, c.metadataStore, c.repoSyncFrequency)
105107
c.repositories[key] = cr
106108
}
107109
return cr, nil
@@ -137,7 +139,7 @@ func (c *Cache) OpenRepository(ctx context.Context, repositorySpec *configapi.Re
137139
}); err != nil {
138140
return nil, err
139141
} else {
140-
cr = newRepository(key, repositorySpec, r, c.objectNotifier, c.metadataStore)
142+
cr = newRepository(key, repositorySpec, r, c.objectNotifier, c.metadataStore, c.repoSyncFrequency)
141143
c.repositories[key] = cr
142144
}
143145
} else {

porch/pkg/cache/cache_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"os"
2121
"path/filepath"
2222
"testing"
23+
"time"
2324

2425
api "github.com/GoogleContainerTools/kpt/porch/api/porch/v1alpha1"
2526
"github.com/GoogleContainerTools/kpt/porch/api/porchconfig/v1alpha1"
@@ -134,7 +135,7 @@ func openRepositoryFromArchive(t *testing.T, ctx context.Context, testPath, name
134135
repo, address := git.ServeGitRepository(t, tarfile, tempdir)
135136
metadataStore := createMetadataStoreFromArchive(t, "", "")
136137

137-
cache := NewCache(t.TempDir(), CacheOptions{
138+
cache := NewCache(t.TempDir(), 60*time.Second, CacheOptions{
138139
MetadataStore: metadataStore,
139140
ObjectNotifier: &fakecache.ObjectNotifier{},
140141
})

porch/pkg/cache/repository.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ type cachedRepository struct {
6868
metadataStore meta.MetadataStore
6969
}
7070

71-
func newRepository(id string, repoSpec *configapi.Repository, repo repository.Repository, objectNotifier objectNotifier, metadataStore meta.MetadataStore) *cachedRepository {
71+
func newRepository(id string, repoSpec *configapi.Repository, repo repository.Repository, objectNotifier objectNotifier, metadataStore meta.MetadataStore, repoSyncFrequency time.Duration) *cachedRepository {
7272
ctx, cancel := context.WithCancel(context.Background())
7373
r := &cachedRepository{
7474
id: id,
@@ -81,7 +81,7 @@ func newRepository(id string, repoSpec *configapi.Repository, repo repository.Re
8181

8282
// TODO: Should we fetch the packages here?
8383

84-
go r.pollForever(ctx)
84+
go r.pollForever(ctx, repoSyncFrequency)
8585

8686
return r
8787
}
@@ -339,7 +339,7 @@ func (r *cachedRepository) Close() error {
339339
}
340340

341341
// pollForever will continue polling until signal channel is closed or ctx is done.
342-
func (r *cachedRepository) pollForever(ctx context.Context) {
342+
func (r *cachedRepository) pollForever(ctx context.Context, repoSyncFrequency time.Duration) {
343343
r.pollOnce(ctx)
344344
for {
345345
select {
@@ -348,7 +348,7 @@ func (r *cachedRepository) pollForever(ctx context.Context) {
348348
return
349349
default:
350350
r.pollOnce(ctx)
351-
time.Sleep(60 * time.Second)
351+
time.Sleep(repoSyncFrequency)
352352
}
353353
}
354354
}

porch/pkg/cmd/server/start.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"io"
2121
"net"
2222
"os"
23+
"time"
2324

2425
"github.com/spf13/cobra"
2526
"github.com/spf13/pflag"
@@ -51,6 +52,7 @@ type PorchServerOptions struct {
5152
CoreAPIKubeconfigPath string
5253
FunctionRunnerAddress string
5354
DefaultImagePrefix string
55+
RepoSyncFrequency time.Duration
5456

5557
SharedInformerFactory informers.SharedInformerFactory
5658
StdOut io.Writer
@@ -182,6 +184,7 @@ func (o *PorchServerOptions) Config() (*apiserver.Config, error) {
182184
ExtraConfig: apiserver.ExtraConfig{
183185
CoreAPIKubeconfigPath: o.CoreAPIKubeconfigPath,
184186
CacheDirectory: o.CacheDirectory,
187+
RepoSyncFrequency: o.RepoSyncFrequency,
185188
FunctionRunnerAddress: o.FunctionRunnerAddress,
186189
DefaultImagePrefix: o.DefaultImagePrefix,
187190
},
@@ -229,4 +232,5 @@ func (o *PorchServerOptions) AddFlags(fs *pflag.FlagSet) {
229232
fs.StringVar(&o.FunctionRunnerAddress, "function-runner", "", "Address of the function runner gRPC service.")
230233
fs.StringVar(&o.DefaultImagePrefix, "default-image-prefix", "gcr.io/kpt-fn/", "Default prefix for unqualified function names")
231234
fs.StringVar(&o.CacheDirectory, "cache-directory", "", "Directory where Porch server stores repository and package caches.")
235+
fs.DurationVar(&o.RepoSyncFrequency, "repo-sync-frequency", 60*time.Second, "Frequency in seconds at which registered repositories will be synced.")
232236
}

porch/pkg/cmd/server/start_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright 2023 The kpt Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package server
16+
17+
import (
18+
porchv1alpha1 "github.com/GoogleContainerTools/kpt/porch/api/porch/v1alpha1"
19+
"github.com/GoogleContainerTools/kpt/porch/pkg/apiserver"
20+
"github.com/spf13/pflag"
21+
"k8s.io/apimachinery/pkg/runtime/schema"
22+
genericoptions "k8s.io/apiserver/pkg/server/options"
23+
"testing"
24+
"time"
25+
)
26+
27+
func TestAddFlags(t *testing.T) {
28+
versions := schema.GroupVersions{
29+
porchv1alpha1.SchemeGroupVersion,
30+
}
31+
o := PorchServerOptions{
32+
RecommendedOptions: genericoptions.NewRecommendedOptions(
33+
defaultEtcdPathPrefix,
34+
apiserver.Codecs.LegacyCodec(versions...),
35+
),
36+
}
37+
o.AddFlags(&pflag.FlagSet{})
38+
if o.RepoSyncFrequency < 30*time.Second {
39+
t.Fatalf("AddFlags(): repo-sync-frequency cannot be less that 30 seconds.")
40+
}
41+
}

0 commit comments

Comments
 (0)