Skip to content

Commit 0049bc0

Browse files
authored
Add periodic in-memory store pruner (#200)
1 parent 8a21dad commit 0049bc0

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

pkg/storage/memory/memory.go

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,37 @@ type (
1818

1919
storageMem struct {
2020
sync.RWMutex
21-
store map[string]memStorageSecret
21+
store map[string]memStorageSecret
22+
storePruneTimer *time.Ticker
2223
}
2324
)
2425

2526
// New creates a new In-Mem storage
2627
func New() storage.Storage {
27-
return &storageMem{
28-
store: make(map[string]memStorageSecret),
28+
store := &storageMem{
29+
store: make(map[string]memStorageSecret),
30+
storePruneTimer: time.NewTicker(time.Minute),
31+
}
32+
33+
go store.storePruner()
34+
35+
return store
36+
}
37+
38+
func (s *storageMem) storePruner() {
39+
for range s.storePruneTimer.C {
40+
s.pruneStore()
41+
}
42+
}
43+
44+
func (s *storageMem) pruneStore() {
45+
s.Lock()
46+
defer s.Unlock()
47+
48+
for k, v := range s.store {
49+
if v.hasExpired() {
50+
delete(s.store, k)
51+
}
2952
}
3053
}
3154

@@ -68,9 +91,16 @@ func (s *storageMem) ReadAndDestroy(id string) (string, error) {
6891

6992
defer delete(s.store, id)
7093

71-
if !secret.Expiry.IsZero() && secret.Expiry.Before(time.Now()) {
94+
// Still check to see if the secret has expired in order to prevent a
95+
// race condition where a secret has expired but the the store pruner has
96+
// not yet been invoked.
97+
if secret.hasExpired() {
7298
return "", storage.ErrSecretNotFound
7399
}
74100

75101
return secret.Secret, nil
76102
}
103+
104+
func (m *memStorageSecret) hasExpired() bool {
105+
return !m.Expiry.IsZero() && m.Expiry.Before(time.Now())
106+
}

0 commit comments

Comments
 (0)