| 447 | } |
| 448 | |
| 449 | func (r *Ring) setRingStateFromDesc(ringDesc *Desc, updateMetrics, updateRegisteredTimestampCache, updateReadOnlyInstances bool) { |
| 450 | now := time.Now() |
| 451 | ringTokens := ringDesc.GetTokens() |
| 452 | ringTokensByZone := ringDesc.getTokensByZone() |
| 453 | ringInstanceByToken := ringDesc.getTokensInfo() |
| 454 | ringZones := getZones(ringTokensByZone) |
| 455 | oldestRegisteredTimestamp := ringDesc.getOldestRegisteredTimestamp() |
| 456 | instancesWithTokensCount := ringDesc.instancesWithTokensCount() |
| 457 | instancesCountPerZone := ringDesc.instancesCountPerZone() |
| 458 | instancesWithTokensCountPerZone := ringDesc.instancesWithTokensCountPerZone() |
| 459 | writableInstancesWithTokensCount := ringDesc.writableInstancesWithTokensCount() |
| 460 | writableInstancesWithTokensCountPerZone := ringDesc.writableInstancesWithTokensCountPerZone() |
| 461 | readOnlyInstances, oldestReadOnlyUpdatedTimestamp := ringDesc.readOnlyInstancesAndOldestReadOnlyUpdatedTimestamp() |
| 462 | |
| 463 | r.mtx.Lock() |
| 464 | defer r.mtx.Unlock() |
| 465 | r.ringDesc = ringDesc |
| 466 | r.ringTokens = ringTokens |
| 467 | r.ringTokensByZone = ringTokensByZone |
| 468 | r.ringInstanceByToken = ringInstanceByToken |
| 469 | r.updateRingZones(ringZones) |
| 470 | r.instancesWithTokensCount = instancesWithTokensCount |
| 471 | r.instancesCountPerZone = instancesCountPerZone |
| 472 | r.instancesWithTokensCountPerZone = instancesWithTokensCountPerZone |
| 473 | r.writableInstancesWithTokensCount = writableInstancesWithTokensCount |
| 474 | r.writableInstancesWithTokensCountPerZone = writableInstancesWithTokensCountPerZone |
| 475 | if updateRegisteredTimestampCache { |
| 476 | r.oldestRegisteredTimestamp = oldestRegisteredTimestamp |
| 477 | } |
| 478 | r.lastTopologyChange = now |
| 479 | if updateReadOnlyInstances { |
| 480 | r.readOnlyInstances = &readOnlyInstances |
| 481 | r.oldestReadOnlyUpdatedTimestamp = &oldestReadOnlyUpdatedTimestamp |
| 482 | } |
| 483 | |
| 484 | // Invalidate all cached subrings. |
| 485 | if r.shuffledSubringCache != nil { |
| 486 | r.shuffledSubringCache = make(map[subringCacheKey]*Ring) |
| 487 | } |
| 488 | if r.shuffledSubringWithLookbackCache != nil { |
| 489 | r.shuffledSubringWithLookbackCache = make(map[subringCacheKey]cachedSubringWithLookback[*Ring]) |
| 490 | } |
| 491 | |
| 492 | if updateMetrics { |
| 493 | r.updateRingMetrics() |
| 494 | } |
| 495 | } |
| 496 | |
| 497 | // Get returns n (or more) instances which form the replicas for the given key. |
| 498 | func (r *Ring) Get(key uint32, op Operation, bufDescs []InstanceDesc, bufHosts, _ []string) (ReplicationSet, error) { |