-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #139 from Ajpantuso/apantuso/extractor_store
refactor: extractor cache cleanup
- Loading branch information
Showing
15 changed files
with
414 additions
and
248 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,70 @@ | ||
package extractor | ||
|
||
import ( | ||
"sync" | ||
"errors" | ||
"fmt" | ||
|
||
"github.com/operator-framework/operator-registry/pkg/registry" | ||
) | ||
|
||
type bundleMemoryCache struct { | ||
encoder BundleEncoder | ||
// NewBundleCacheImpl returns an initialized BundleCacheImpl. A | ||
// variadic slice of options can be used to alter the behavior | ||
// of the cache. | ||
func NewBundleCacheImpl(opts ...BundleCacheImplOption) *BundleCacheImpl { | ||
var cfg BundleCacheImplConfig | ||
|
||
lock sync.RWMutex | ||
store map[string][]byte | ||
} | ||
cfg.Option(opts...) | ||
cfg.Default() | ||
|
||
// NewBundleMemoryCache - in-memory cache for bundle, using an encoder | ||
func NewBundleMemoryCache(encoder BundleEncoder) BundleCache { | ||
return &bundleMemoryCache{ | ||
encoder: encoder, | ||
store: make(map[string][]byte), | ||
return &BundleCacheImpl{ | ||
cfg: cfg, | ||
} | ||
} | ||
|
||
func (c *bundleMemoryCache) Get(bundleImage string) (*registry.Bundle, error) { | ||
c.lock.RLock() | ||
defer c.lock.RUnlock() | ||
type BundleCacheImpl struct { | ||
cfg BundleCacheImplConfig | ||
} | ||
|
||
var ErrInvalidBundleData = errors.New("invalid bundle data") | ||
|
||
if data, ok := c.store[bundleImage]; ok { | ||
bundle, err := c.encoder.Decode(data) | ||
if err != nil { | ||
return nil, err | ||
} | ||
func (c *BundleCacheImpl) GetBundle(img string) (*registry.Bundle, error) { | ||
data, ok := c.cfg.Store.Read(img) | ||
if !ok { | ||
return nil, nil | ||
} | ||
|
||
return hackSetCacheStaleToTrue(bundle), nil | ||
bundle, ok := data.(registry.Bundle) | ||
if !ok { | ||
return nil, ErrInvalidBundleData | ||
} | ||
|
||
return nil, nil | ||
return &bundle, nil | ||
} | ||
|
||
// hack to set b.cacheStale to true otherwise we can't access the csv of the | ||
// underlying bundle. This is a bug on OPM's side, which does not support | ||
// serialization/deserialization of their bundles. | ||
// https://github.com/operator-framework/operator-registry/blob/master/pkg/registry/bundle.go#L103 | ||
func hackSetCacheStaleToTrue(b *registry.Bundle) *registry.Bundle { | ||
if len(b.Objects) == 0 { | ||
return b | ||
func (c *BundleCacheImpl) SetBundle(img string, bundle registry.Bundle) error { | ||
if err := c.cfg.Store.Write(img, bundle); err != nil { | ||
return fmt.Errorf("writing bundle data: %w", err) | ||
} | ||
|
||
obj := b.Objects[0] | ||
b.Objects = b.Objects[1:] | ||
b.Add(obj) | ||
|
||
return b | ||
return nil | ||
} | ||
|
||
func (c *bundleMemoryCache) Set(bundleImage string, bundle *registry.Bundle) error { | ||
c.lock.Lock() | ||
defer c.lock.Unlock() | ||
type BundleCacheImplConfig struct { | ||
Store Store | ||
} | ||
|
||
// bundles are supposed to be immutable, so we can save a few CPU cycles by | ||
// avoiding re-encoding bundles and unnecessarily overwriting the cache | ||
if _, ok := c.store[bundleImage]; ok { | ||
return nil | ||
func (c *BundleCacheImplConfig) Option(opts ...BundleCacheImplOption) { | ||
for _, opt := range opts { | ||
opt.ConfigureBundleCacheImpl(c) | ||
} | ||
} | ||
|
||
data, err := c.encoder.Encode(bundle) | ||
if err != nil { | ||
return err | ||
func (c *BundleCacheImplConfig) Default() { | ||
if c.Store == nil { | ||
c.Store = NewThreadSafeStore() | ||
} | ||
} | ||
|
||
c.store[bundleImage] = data | ||
|
||
return nil | ||
type BundleCacheImplOption interface { | ||
ConfigureBundleCacheImpl(*BundleCacheImplConfig) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package extractor | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestBundleCacheImplInterfaces(t *testing.T) { | ||
t.Parallel() | ||
|
||
require.Implements(t, new(BundleCache), new(BundleCacheImpl)) | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.