internal CacheShardMap AddOrUpdate(IStoreShardMap ssm) { CacheShardMap csm = new CacheShardMap(ssm); CacheShardMap csmOldByName = null; CacheShardMap csmOldById = null; if (_shardMapsByName.TryGetValue(ssm.Name, out csmOldByName)) { _shardMapsByName.Remove(ssm.Name); } if (_shardMapsById.TryGetValue(ssm.Id, out csmOldById)) { _shardMapsById.Remove(ssm.Id); } // Both should be found or none should be found. Debug.Assert((csmOldByName == null && csmOldById == null) || (csmOldByName != null && csmOldById != null)); // Both should point to same cached copy. Debug.Assert(Object.ReferenceEquals(csmOldByName, csmOldById)); if (csmOldByName != null) { csm.TransferStateFrom(csmOldByName); // Dispose off the old cached shard map csmOldByName.Dispose(); } _shardMapsByName.Add(ssm.Name, csm); _shardMapsById.Add(ssm.Id, csm); return(csm); }