/// <summary> /// Removes shard map from cache given the name. /// </summary> /// <param name="ssm">Storage representation of shard map.</param> internal void Remove(IStoreShardMap ssm) { if (_shardMapsByName.ContainsKey(ssm.Name)) { CacheShardMap csm = _shardMapsByName[ssm.Name]; _shardMapsByName.Remove(ssm.Name); // Dispose off the cached map if (csm != null) { csm.Dispose(); } } if (_shardMapsById.ContainsKey(ssm.Id)) { CacheShardMap csm = _shardMapsById[ssm.Id]; _shardMapsById.Remove(ssm.Id); // Dispose off the cached map if (csm != null) { csm.Dispose(); } } }
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); }