| 1294 | } |
| 1295 | |
| 1296 | func (r *Ring) getCachedShuffledSubring(identifier string, size int) *Ring { |
| 1297 | if r.cfg.SubringCacheDisabled { |
| 1298 | return nil |
| 1299 | } |
| 1300 | |
| 1301 | r.mtx.RLock() |
| 1302 | defer r.mtx.RUnlock() |
| 1303 | |
| 1304 | // if shuffledSubringCache map is nil, reading it returns default value (nil pointer). |
| 1305 | cached := r.shuffledSubringCache[subringCacheKey{identifier: identifier, shardSize: size}] |
| 1306 | if cached == nil { |
| 1307 | return nil |
| 1308 | } |
| 1309 | |
| 1310 | // No need to update cached subring, if it is the original ring itself. |
| 1311 | if r == cached { |
| 1312 | return cached |
| 1313 | } |
| 1314 | |
| 1315 | cached.mtx.Lock() |
| 1316 | defer cached.mtx.Unlock() |
| 1317 | |
| 1318 | // Update instance states and timestamps. We know that the topology is the same, |
| 1319 | // so zones and tokens are equal. |
| 1320 | for name, cachedIng := range cached.ringDesc.Ingesters { |
| 1321 | ing := r.ringDesc.Ingesters[name] |
| 1322 | cachedIng.State = ing.State |
| 1323 | cachedIng.Timestamp = ing.Timestamp |
| 1324 | cached.ringDesc.Ingesters[name] = cachedIng |
| 1325 | } |
| 1326 | return cached |
| 1327 | } |
| 1328 | |
| 1329 | func (r *Ring) setCachedShuffledSubring(identifier string, size int, subring *Ring) { |
| 1330 | if subring == nil || r.cfg.SubringCacheDisabled { |