Skip to content

Commit c751d92

Browse files
committed
run-resourcewatch: Add a gitstorage benchmark
1 parent b17ccfd commit c751d92

File tree

4 files changed

+96
-39
lines changed

4 files changed

+96
-39
lines changed

go.mod

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
module github.com/openshift/origin
22

3-
go 1.23.0
4-
5-
toolchain go1.23.4
3+
go 1.24.4
64

75
require (
86
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0
@@ -21,6 +19,7 @@ require (
2119
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
2220
github.com/go-bindata/go-bindata v3.1.2+incompatible
2321
github.com/go-ldap/ldap/v3 v3.4.3
22+
github.com/go-logr/logr v1.4.2
2423
github.com/golang/protobuf v1.5.4
2524
github.com/google/gnostic-models v0.6.8
2625
github.com/google/go-cmp v0.6.0
@@ -171,7 +170,6 @@ require (
171170
github.com/go-errors/errors v1.4.2 // indirect
172171
github.com/go-fonts/liberation v0.3.1 // indirect
173172
github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 // indirect
174-
github.com/go-logr/logr v1.4.2 // indirect
175173
github.com/go-logr/stdr v1.2.2 // indirect
176174
github.com/go-openapi/jsonpointer v0.21.0 // indirect
177175
github.com/go-openapi/jsonreference v0.21.0 // indirect

pkg/resourcewatch/operator/starter.go

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package operator
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
7+
"io"
68
"os"
79
"os/signal"
810
"sync"
@@ -45,8 +47,12 @@ func RunResourceWatch(toJsonPath, fromJsonPath string) error {
4547
var sink observationSink
4648

4749
if fromJsonPath != "" {
48-
var err error
49-
source, err = jsonSource(fromJsonPath)
50+
file, err := os.Open(fromJsonPath)
51+
if err != nil {
52+
return fmt.Errorf("failed to open json file %q: %w", fromJsonPath, err)
53+
}
54+
55+
source, err = jsonSource(file)
5056
if err != nil {
5157
return err
5258
}
@@ -59,8 +65,12 @@ func RunResourceWatch(toJsonPath, fromJsonPath string) error {
5965
}
6066

6167
if toJsonPath != "" {
62-
var err error
63-
sink, err = jsonSink(toJsonPath)
68+
file, err := os.OpenFile(toJsonPath, os.O_CREATE|os.O_EXCL|os.O_WRONLY|os.O_APPEND, 0664)
69+
if err != nil {
70+
return fmt.Errorf("failed to create json file %q: %w", toJsonPath, err)
71+
}
72+
73+
sink, err = jsonSink(file)
6474
if err != nil {
6575
return err
6676
}
@@ -217,13 +227,7 @@ func clusterSource() (observationSource, error) {
217227
}, nil
218228
}
219229

220-
func jsonSource(fromJsonPath string) (observationSource, error) {
221-
file, err := os.Open(fromJsonPath)
222-
if err != nil {
223-
klog.Errorf("Failed to open json file with error %v", err)
224-
return nil, err
225-
}
226-
230+
func jsonSource(file io.ReadCloser) (observationSource, error) {
227231
decoder := json.NewDecoder(file)
228232

229233
return func(ctx context.Context, log logr.Logger, resourceC chan<- *observe.ResourceObservation) chan struct{} {
@@ -253,12 +257,7 @@ func jsonSource(fromJsonPath string) (observationSource, error) {
253257
}
254258

255259
func gitSink() (observationSink, error) {
256-
repositoryPath := "/repository"
257-
if repositoryPathEnv := os.Getenv("REPOSITORY_PATH"); len(repositoryPathEnv) > 0 {
258-
repositoryPath = repositoryPathEnv
259-
}
260-
261-
gitStorage, err := storage.NewGitStorage(repositoryPath)
260+
gitStorage, err := gitInitStorage()
262261
if err != nil {
263262
klog.Errorf("Failed to create git storage with error %v", err)
264263
return nil, err
@@ -269,32 +268,38 @@ func gitSink() (observationSink, error) {
269268
go func() {
270269
defer close(finished)
271270
for observation := range resourceC {
272-
gvr := schema.GroupVersionResource{
273-
Group: observation.Group,
274-
Version: observation.Version,
275-
Resource: observation.Resource,
276-
}
277-
switch observation.ObservationType {
278-
case observe.ObservationTypeAdd:
279-
gitStorage.OnAdd(gvr, observation.Object)
280-
case observe.ObservationTypeUpdate:
281-
gitStorage.OnUpdate(gvr, observation.OldObject, observation.Object)
282-
case observe.ObservationTypeDelete:
283-
gitStorage.OnDelete(gvr, observation.Object)
284-
}
271+
gitWrite(gitStorage, observation)
285272
}
286273
}()
287274
return finished
288275
}, nil
289276
}
290277

291-
func jsonSink(toJsonPath string) (observationSink, error) {
292-
file, err := os.OpenFile(toJsonPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0664)
293-
if err != nil {
294-
klog.Errorf("Failed to create json file with error %v", err)
295-
return nil, err
278+
func gitInitStorage() (*storage.GitStorage, error) {
279+
repositoryPath := "/repository"
280+
if repositoryPathEnv := os.Getenv("REPOSITORY_PATH"); len(repositoryPathEnv) > 0 {
281+
repositoryPath = repositoryPathEnv
296282
}
283+
return storage.NewGitStorage(repositoryPath)
284+
}
285+
286+
func gitWrite(gitStorage *storage.GitStorage, observation *observe.ResourceObservation) {
287+
gvr := schema.GroupVersionResource{
288+
Group: observation.Group,
289+
Version: observation.Version,
290+
Resource: observation.Resource,
291+
}
292+
switch observation.ObservationType {
293+
case observe.ObservationTypeAdd:
294+
gitStorage.OnAdd(gvr, observation.Object)
295+
case observe.ObservationTypeUpdate:
296+
gitStorage.OnUpdate(gvr, observation.OldObject, observation.Object)
297+
case observe.ObservationTypeDelete:
298+
gitStorage.OnDelete(gvr, observation.Object)
299+
}
300+
}
297301

302+
func jsonSink(file io.WriteCloser) (observationSink, error) {
298303
encoder := json.NewEncoder(file)
299304

300305
return func(resourceC <-chan *observe.ResourceObservation) chan struct{} {
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package operator
2+
3+
import (
4+
"compress/gzip"
5+
"os"
6+
"testing"
7+
"time"
8+
9+
"github.com/go-logr/logr"
10+
"github.com/openshift/origin/pkg/resourcewatch/observe"
11+
)
12+
13+
func BenchmarkGitSink(b *testing.B) {
14+
repoDir := b.TempDir()
15+
os.Setenv("REPOSITORY_PATH", repoDir)
16+
17+
// Because we have no .gitconfig
18+
os.Setenv("GIT_COMMITTER_NAME", "run-resourcewatch")
19+
os.Setenv("GIT_COMMITTER_EMAIL", "[email protected]")
20+
21+
// Don't use git configuration from the user's home directory
22+
os.Setenv("HOME", "")
23+
24+
gitStorage, err := gitInitStorage()
25+
if err != nil {
26+
b.Fatalf("Failed to initialise git storage: %v", err)
27+
}
28+
29+
file, err := os.Open("testdata/observations.json.gz")
30+
if err != nil {
31+
b.Fatalf("Failed to open test data: %v", err)
32+
}
33+
34+
uncompressed, err := gzip.NewReader(file)
35+
if err != nil {
36+
b.Fatalf("Failed to decompress test data: %v", err)
37+
}
38+
39+
source, err := jsonSource(uncompressed)
40+
if err != nil {
41+
b.Fatalf("Failed to initialise json source: %v", err)
42+
}
43+
44+
resourceC := make(chan *observe.ResourceObservation, 1000000)
45+
source(b.Context(), logr.Discard(), resourceC)
46+
47+
for b.Loop() {
48+
gitWrite(gitStorage, <-resourceC)
49+
}
50+
51+
// gitStorage creates unmanaged go threads which can prevent us from cleaning up.
52+
// Until we address that, just give them a chance to finish
53+
time.Sleep(5 * time.Second)
54+
}
13.1 MB
Binary file not shown.

0 commit comments

Comments
 (0)