-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cache rendered centrals #1433
Cache rendered centrals #1433
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,18 +2,26 @@ package gitops | |||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
"encoding/json" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"strings" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"sync" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"text/template" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/pkg/errors" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/stackrox/acs-fleet-manager/fleetshard/pkg/util" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/stackrox/rox/operator/apis/platform/v1alpha1" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"k8s.io/apimachinery/pkg/util/strategicpatch" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"sigs.k8s.io/yaml" | ||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
var ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
centralCRYAMLCache = make(map[string]string) | ||||||||||||||||||||||||||||||||||||||||||||||||||
centralCacheMutex = sync.RWMutex{} | ||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// Service applies GitOps configuration to Central instances. | ||||||||||||||||||||||||||||||||||||||||||||||||||
type Service interface { | ||||||||||||||||||||||||||||||||||||||||||||||||||
GetCentral(ctx CentralParams) (v1alpha1.Central, error) | ||||||||||||||||||||||||||||||||||||||||||||||||||
GetCentral(ctx CentralParams) (string, error) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
type service struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -26,12 +34,74 @@ func NewService(configProvider ConfigProvider) Service { | |||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// GetCentral returns a Central instance with the given parameters. | ||||||||||||||||||||||||||||||||||||||||||||||||||
func (s *service) GetCentral(params CentralParams) (v1alpha1.Central, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
func (s *service) GetCentral(params CentralParams) (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
cfg, err := s.configProvider.Get() | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return v1alpha1.Central{}, errors.Wrap(err, "failed to get GitOps configuration") | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", errors.Wrap(err, "failed to get GitOps configuration") | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
result, err := readFromCache(params, cfg) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", err | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
if result != "" { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return result, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
centralCR, err := renderCentral(params, cfg) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", err | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
centralYaml, err := yaml.Marshal(centralCR) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", errors.Wrap(err, "failed to marshal Central CR") | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
centralYAMLString := string(centralYaml) | ||||||||||||||||||||||||||||||||||||||||||||||||||
err = addCache(params, cfg, centralYAMLString) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", err | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return centralYAMLString, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// getCacheKey returns a key in the format of "<params_hash>:<config_hash>" | ||||||||||||||||||||||||||||||||||||||||||||||||||
func getCacheKey(params CentralParams, config Config) (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
paramsHash, err := util.MD5SumFromJSONStruct(params) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("could not create MD5 from CentralParams name: %s, id: %s, %w", params.Name, params.ID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
configHash, err := util.MD5SumFromJSONStruct(config) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("could not create MD5 from gitops Configame: %s, id: %s, %w", params.Name, params.ID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Sprintf("%s:%s", string(paramsHash[:]), string(configHash[:])), nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func addCache(params CentralParams, config Config, centralYAML string) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||
centralCacheMutex.Lock() | ||||||||||||||||||||||||||||||||||||||||||||||||||
defer centralCacheMutex.Unlock() | ||||||||||||||||||||||||||||||||||||||||||||||||||
key, err := getCacheKey(params, config) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("could not add to cache: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
centralCRYAMLCache[key] = centralYAML | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+82
to
+91
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. passing the cache key directly
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Example of keyed mutex for locking cache keys
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// readFromCache returns a CentralYAML from the cache | ||||||||||||||||||||||||||||||||||||||||||||||||||
func readFromCache(params CentralParams, config Config) (string, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
cacheKey, err := getCacheKey(params, config) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", fmt.Errorf("Could not get cache key: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
if val, ok := centralCRYAMLCache[cacheKey]; ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+95
to
+101
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here you need to RLock the cache + passing the cache key directly
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
return val, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return renderCentral(params, cfg) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return "", nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func renderCentral(params CentralParams, config Config) (v1alpha1.Central, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need to lock the cache key