| 320 | } |
| 321 | |
| 322 | func (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: |