MCPcopy Create free account
hub / github.com/cortexproject/cortex / updateRingState

Method updateRingState

pkg/ring/ring.go:322–374  ·  view source on GitHub ↗
(ringDesc *Desc)

Source from the content-addressed store, hash-verified

320}
321
322func (r *Ring) updateRingState(ringDesc *Desc) {
323 r.mtx.RLock()
324 prevRing := r.ringDesc
325 r.mtx.RUnlock()
326
327 // Filter out all instances belonging to excluded zones.
328 if len(r.cfg.ExcludedZones) > 0 {
329 for instanceID, instance := range ringDesc.Ingesters {
330 if slices.Contains(r.cfg.ExcludedZones, instance.Zone) {
331 delete(ringDesc.Ingesters, instanceID)
332 }
333 }
334 }
335
336 rc := prevRing.RingCompare(ringDesc)
337 if rc == Equal || rc == EqualButStatesAndTimestamps || rc == EqualButReadOnly {
338 // No need to update tokens or zones. Only states and timestamps
339 // have changed. (If Equal, nothing has changed, but that doesn't happen
340 // when watching the ring for updates).
341 r.mtx.Lock()
342 r.ringDesc = ringDesc
343 if rc == EqualButReadOnly && r.shuffledSubringCache != nil {
344 // Invalidate all cached subrings.
345 r.shuffledSubringCache = make(map[subringCacheKey]*Ring)
346 }
347 r.updateRingMetrics(rc)
348 r.mtx.Unlock()
349 return
350 }
351
352 now := time.Now()
353 ringTokens := ringDesc.GetTokens()
354 ringTokensByZone := ringDesc.getTokensByZone()
355 ringInstanceByToken := ringDesc.getTokensInfo()
356 ringInstanceByAddr := ringDesc.getInstancesByAddr()
357 ringZones := getZones(ringTokensByZone)
358
359 r.mtx.Lock()
360 defer r.mtx.Unlock()
361 r.ringDesc = ringDesc
362 r.ringTokens = ringTokens
363 r.ringTokensByZone = ringTokensByZone
364 r.ringInstanceByToken = ringInstanceByToken
365 r.ringInstanceIdByAddr = ringInstanceByAddr
366 r.previousRingZones = r.ringZones
367 r.ringZones = ringZones
368 r.lastTopologyChange = now
369 if r.shuffledSubringCache != nil {
370 // Invalidate all cached subrings.
371 r.shuffledSubringCache = make(map[subringCacheKey]*Ring)
372 }
373 r.updateRingMetrics(rc)
374}
375
376// Get returns n (or more) instances which form the replicas for the given key.
377// This implementation guarantees:

Callers 6

startingMethod · 0.95
loopMethod · 0.95
benchmarkUpdateRingStateFunction · 0.80
TestUpdateMetricsFunction · 0.80

Calls 7

updateRingMetricsMethod · 0.95
getZonesFunction · 0.85
RingCompareMethod · 0.80
getTokensByZoneMethod · 0.80
getTokensInfoMethod · 0.80
getInstancesByAddrMethod · 0.80
GetTokensMethod · 0.45

Tested by 4

benchmarkUpdateRingStateFunction · 0.64
TestUpdateMetricsFunction · 0.64