Skip to content

Commit 84d9556

Browse files
committed
reduce lock time
1 parent 34a77d5 commit 84d9556

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

coderd/cryptokeys/dbkeycache.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ func NewDBKeyCache(ctx context.Context, logger slog.Logger, db database.Store, f
4040
opt(d)
4141
}
4242

43-
err := d.newCache(ctx)
43+
cache, latest, err := d.newCache(ctx)
4444
if err != nil {
4545
return nil, xerrors.Errorf("new cache: %w", err)
4646
}
47+
d.cache, d.latestKey = cache, latest
4748

48-
go d.refreshCache(ctx)
49+
go d.refresh(ctx)
4950
return d, nil
5051
}
5152

@@ -111,38 +112,44 @@ func (d *DBKeyCache) Latest(ctx context.Context) (database.CryptoKey, error) {
111112
return d.latestKey, nil
112113
}
113114

114-
err := d.newCache(ctx)
115+
cache, latest, err := d.newCache(ctx)
115116
if err != nil {
116117
return database.CryptoKey{}, xerrors.Errorf("new cache: %w", err)
117118
}
118119

119-
if len(d.cache) == 0 {
120+
if len(cache) == 0 {
120121
return database.CryptoKey{}, ErrKeyNotFound
121122
}
122123

123-
if !d.latestKey.IsActive(now) {
124+
if !latest.IsActive(now) {
124125
return database.CryptoKey{}, ErrKeyInvalid
125126
}
126127

128+
d.cache, d.latestKey = cache, latest
129+
127130
return d.latestKey, nil
128131
}
129132

130-
func (d *DBKeyCache) refreshCache(ctx context.Context) {
133+
func (d *DBKeyCache) refresh(ctx context.Context) {
131134
d.Clock.TickerFunc(ctx, time.Minute*10, func() error {
132-
d.cacheMu.Lock()
133-
defer d.cacheMu.Unlock()
134-
if err := d.newCache(ctx); err != nil {
135+
cache, latest, err := d.newCache(ctx)
136+
if err != nil {
135137
d.logger.Error(ctx, "failed to refresh cache", slog.Error(err))
138+
return nil
136139
}
140+
d.cacheMu.Lock()
141+
defer d.cacheMu.Unlock()
142+
143+
d.cache, d.latestKey = cache, latest
137144
return nil
138145
})
139146
}
140147

141-
func (d *DBKeyCache) newCache(ctx context.Context) error {
148+
func (d *DBKeyCache) newCache(ctx context.Context) (map[int32]database.CryptoKey, database.CryptoKey, error) {
142149
now := d.Clock.Now().UTC()
143150
keys, err := d.db.GetCryptoKeysByFeature(ctx, d.feature)
144151
if err != nil {
145-
return xerrors.Errorf("get crypto keys by feature: %w", err)
152+
return nil, database.CryptoKey{}, xerrors.Errorf("get crypto keys by feature: %w", err)
146153
}
147154
cache := toMap(keys)
148155
var latest database.CryptoKey
@@ -154,9 +161,7 @@ func (d *DBKeyCache) newCache(ctx context.Context) error {
154161
break
155162
}
156163

157-
d.cache = cache
158-
d.latestKey = latest
159-
return nil
164+
return cache, latest, nil
160165
}
161166

162167
func toMap(keys []database.CryptoKey) map[int32]database.CryptoKey {

0 commit comments

Comments
 (0)