Skip to content

Commit

Permalink
feat: periodic in-memory store pruner
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmypw committed Oct 26, 2024
1 parent 257e87f commit b793408
Showing 1 changed file with 37 additions and 4 deletions.
41 changes: 37 additions & 4 deletions pkg/storage/memory/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,37 @@ type (

storageMem struct {
sync.RWMutex
store map[string]memStorageSecret
storePruneTimer time.Ticker
store map[string]memStorageSecret
}
)

// New creates a new In-Mem storage
func New() storage.Storage {
return &storageMem{
store: make(map[string]memStorageSecret),
store := &storageMem{
storePruneTimer: *time.NewTicker(time.Minute),
store: make(map[string]memStorageSecret),
}

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)
}
}
}

Expand Down Expand Up @@ -68,9 +91,19 @@ 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 {
if !m.Expiry.IsZero() && m.Expiry.Before(time.Now()) {
return true
}
return false
}

0 comments on commit b793408

Please sign in to comment.