@@ -152,13 +152,12 @@ type Ingester struct {
152
152
lifecycler * ring.Lifecycler
153
153
limits * validation.Overrides
154
154
155
- stopLock sync.RWMutex
156
- stopped bool
157
- quit chan struct {}
158
- done sync.WaitGroup
155
+ quit chan struct {}
156
+ done sync.WaitGroup
159
157
160
- userStatesMtx sync.RWMutex
158
+ userStatesMtx sync.RWMutex // protects userStates and stopped
161
159
userStates * userStates
160
+ stopped bool // protected by userStatesMtx
162
161
163
162
// One queue per flush thread. Fingerprint is used to
164
163
// pick a queue.
@@ -247,8 +246,8 @@ func (i *Ingester) Shutdown() {
247
246
248
247
// StopIncomingRequests is called during the shutdown process.
249
248
func (i * Ingester ) StopIncomingRequests () {
250
- i .stopLock .Lock ()
251
- defer i .stopLock .Unlock ()
249
+ i .userStatesMtx .Lock ()
250
+ defer i .userStatesMtx .Unlock ()
252
251
i .stopped = true
253
252
}
254
253
@@ -286,21 +285,25 @@ func (i *Ingester) Push(ctx old_ctx.Context, req *client.WriteRequest) (*client.
286
285
func (i * Ingester ) append (ctx context.Context , userID string , labels labelPairs , timestamp model.Time , value model.SampleValue , source client.WriteRequest_SourceEnum ) error {
287
286
labels .removeBlanks ()
288
287
289
- i .stopLock .RLock ()
290
- defer i .stopLock .RUnlock ()
288
+ var (
289
+ state * userState
290
+ fp model.Fingerprint
291
+ )
292
+ i .userStatesMtx .RLock ()
293
+ defer func () {
294
+ i .userStatesMtx .RUnlock ()
295
+ if state != nil {
296
+ state .fpLocker .Unlock (fp )
297
+ }
298
+ }()
291
299
if i .stopped {
292
300
return fmt .Errorf ("ingester stopping" )
293
301
}
294
-
295
- i .userStatesMtx .RLock ()
296
- defer i .userStatesMtx .RUnlock ()
297
302
state , fp , series , err := i .userStates .getOrCreateSeries (ctx , userID , labels )
298
303
if err != nil {
304
+ state = nil // don't want to unlock the fp if there is an error
299
305
return err
300
306
}
301
- defer func () {
302
- state .fpLocker .Unlock (fp )
303
- }()
304
307
305
308
prevNumChunks := len (series .chunkDescs )
306
309
if i .cfg .SpreadFlushes && prevNumChunks > 0 {
0 commit comments