Add periodic in-memory store pruner (#200)

This commit is contained in:
James Park-Watt 2024-10-27 11:33:53 +00:00 committed by GitHub
parent 8a21dad603
commit 0049bc03ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -19,13 +19,36 @@ type (
storageMem struct {
sync.RWMutex
store map[string]memStorageSecret
storePruneTimer *time.Ticker
}
)
// New creates a new In-Mem storage
func New() storage.Storage {
return &storageMem{
store := &storageMem{
store: make(map[string]memStorageSecret),
storePruneTimer: time.NewTicker(time.Minute),
}
go store.storePruner()
return store
}
func (s *storageMem) storePruner() {
for range s.storePruneTimer.C {
s.pruneStore()
}
}
func (s *storageMem) pruneStore() {
s.Lock()
defer s.Unlock()
for k, v := range s.store {
if v.hasExpired() {
delete(s.store, k)
}
}
}
@ -68,9 +91,16 @@ func (s *storageMem) ReadAndDestroy(id string) (string, error) {
defer delete(s.store, id)
if !secret.Expiry.IsZero() && secret.Expiry.Before(time.Now()) {
// Still check to see if the secret has expired in order to prevent a
// race condition where a secret has expired but the the store pruner has
// not yet been invoked.
if secret.hasExpired() {
return "", storage.ErrSecretNotFound
}
return secret.Secret, nil
}
func (m *memStorageSecret) hasExpired() bool {
return !m.Expiry.IsZero() && m.Expiry.Before(time.Now())
}