Skip to content

Commit fa62742

Browse files
pstibranypracucci
andauthored
Release the lock when loading of cache gen number fails. (#3182)
* Release the lock when loading of cache gen number fails. Signed-off-by: Peter Štibraný <[email protected]> * Release the lock when loading of cache gen number fails. Signed-off-by: Peter Štibraný <[email protected]> * CHANGELOG.md Signed-off-by: Peter Štibraný <[email protected]> * Fixed linter Signed-off-by: Marco Pracucci <[email protected]> Co-authored-by: Marco Pracucci <[email protected]>
1 parent 9e8575c commit fa62742

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
* [BUGFIX] Cassandra: fixed consistency setting in the CQL session when creating the keyspace. #3105
7070
* [BUGFIX] Ruler: Config API would return both the `record` and `alert` in `YAML` response keys even when one of them must be empty. #3120
7171
* [BUGFIX] Index page now uses configured HTTP path prefix when creating links. #3126
72+
* [BUGFIX] Purger: fixed deadlock when reloading of tombstones failed. #3182
7273
* [BUGFIX] Fixed panic in flusher job, when error writing chunks to the store would cause "idle" chunks to be flushed, which triggered panic. #3140
7374
* [BUGFIX] Index page no longer shows links that are not valid for running Cortex instance. #3133
7475
* [BUGFIX] Configs: prevent validation of templates to fail when using template functions. #3157

pkg/chunk/purger/tombstones.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ type TombstonesSet struct {
4747
oldestTombstoneStart, newestTombstoneEnd model.Time // Used as optimization to find whether we want to iterate over tombstones or not
4848
}
4949

50+
// Used for easier injection of mocks.
51+
type DeleteStoreAPI interface {
52+
getCacheGenerationNumbers(ctx context.Context, user string) (*cacheGenNumbers, error)
53+
GetPendingDeleteRequestsForUser(ctx context.Context, id string) ([]DeleteRequest, error)
54+
}
55+
5056
// TombstonesLoader loads delete requests and gen numbers from store and keeps checking for updates.
5157
// It keeps checking for changes in gen numbers, which also means changes in delete requests and reloads specific users delete requests.
5258
type TombstonesLoader struct {
@@ -56,13 +62,13 @@ type TombstonesLoader struct {
5662
cacheGenNumbers map[string]*cacheGenNumbers
5763
cacheGenNumbersMtx sync.RWMutex
5864

59-
deleteStore *DeleteStore
65+
deleteStore DeleteStoreAPI
6066
metrics *tombstonesLoaderMetrics
6167
quit chan struct{}
6268
}
6369

6470
// NewTombstonesLoader creates a TombstonesLoader
65-
func NewTombstonesLoader(deleteStore *DeleteStore, registerer prometheus.Registerer) *TombstonesLoader {
71+
func NewTombstonesLoader(deleteStore DeleteStoreAPI, registerer prometheus.Registerer) *TombstonesLoader {
6672
tl := TombstonesLoader{
6773
tombstones: map[string]*TombstonesSet{},
6874
cacheGenNumbers: map[string]*cacheGenNumbers{},
@@ -106,6 +112,7 @@ func (tl *TombstonesLoader) reloadTombstones() error {
106112
for userID, oldGenNumbers := range tl.cacheGenNumbers {
107113
newGenNumbers, err := tl.deleteStore.getCacheGenerationNumbers(context.Background(), userID)
108114
if err != nil {
115+
tl.cacheGenNumbersMtx.RUnlock()
109116
return err
110117
}
111118

pkg/chunk/purger/tombstones_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package purger
22

33
import (
44
"context"
5+
"errors"
56
"testing"
67
"time"
78

@@ -131,3 +132,27 @@ func TestTombstonesLoader(t *testing.T) {
131132
})
132133
}
133134
}
135+
136+
func TestTombstonesReloadDoesntDeadlockOnFailure(t *testing.T) {
137+
s := &store{}
138+
tombstonesLoader := NewTombstonesLoader(s, nil)
139+
tombstonesLoader.getCacheGenNumbers("test")
140+
141+
s.err = errors.New("error")
142+
require.NotNil(t, tombstonesLoader.reloadTombstones())
143+
144+
s.err = nil
145+
require.NotNil(t, tombstonesLoader.getCacheGenNumbers("test2"))
146+
}
147+
148+
type store struct {
149+
err error
150+
}
151+
152+
func (f *store) getCacheGenerationNumbers(ctx context.Context, user string) (*cacheGenNumbers, error) {
153+
return &cacheGenNumbers{}, f.err
154+
}
155+
156+
func (f *store) GetPendingDeleteRequestsForUser(ctx context.Context, id string) ([]DeleteRequest, error) {
157+
return nil, nil
158+
}

0 commit comments

Comments
 (0)