/// <summary> /// Returns the proper ShardManagementException corresponding to given error code in /// <paramref name="result"/> for ShardMap operations. /// </summary> /// <param name="result">Operation result object.</param> /// <param name="shardMap">Shard map object.</param> /// <param name="location">Location of operation.</param> /// <param name="errorCategory">Error category to use for raised errors.</param> /// <param name="operationName">Operation being performed.</param> /// <param name="storedProcName">Stored procedure being executed.</param> /// <returns>ShardManagementException to be raised.</returns> internal static ShardManagementException OnRecoveryErrorLocal( IStoreResults result, IStoreShardMap shardMap, ShardLocation location, ShardManagementErrorCategory errorCategory, string operationName, string storedProcName) { switch (result.Result) { case StoreResult.ShardMapDoesNotExist: return(new ShardManagementException( errorCategory, ShardManagementErrorCode.ShardMapDoesNotExist, Errors._Store_ShardMap_DoesNotExistLocal, shardMap.Name, location, storedProcName, operationName)); case StoreResult.StoreVersionMismatch: case StoreResult.MissingParametersForStoredProcedure: default: return(StoreOperationErrorHandler.OnCommonErrorLocal( result, location, operationName, storedProcName)); } }
/// <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(); } } }
/// <summary> /// Constructs request for attaching the given shard map and shard information to the GSM database. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shard">Shard to attach</param> /// <param name="shardMap">Shard map to attach specified shard</param> /// <returns>The store operation.</returns> public virtual IStoreOperation CreateAttachShardOperation( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard) { return(new AttachShardOperation(shardMapManager, shardMap, shard)); }
/// <summary> /// Creates request to attach shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which to attach shard.</param> /// <param name="shard">Shard to attach.</param> protected internal AttachShardOperation( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard) : this(shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, shardMap, shard) { }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which to add shard.</param> /// <param name="shard">Shard to add.</param> protected internal AddShardOperation( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard) : this(shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, shardMap, shard) { }
/// <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(); } } }
/// <summary> /// Removes a shard map from global shard map. /// </summary> /// <param name="ssm">Shard map to remove.</param> private void RemoveShardMapFromStore(IStoreShardMap ssm) { using (IStoreOperationGlobal op = this.StoreOperationFactory.CreateRemoveShardMapGlobalOperation(this, "DeleteShardMap", ssm)) { op.Do(); } }
/// <summary> /// Converts IStoreShardMap to ShardMap. /// </summary> /// <param name="manager">Reference to shard map manager.</param> /// <param name="ssm">Storage representation for ShardMap.</param> /// <returns>ShardMap object corresponding to storange representation.</returns> internal static ShardMap CreateShardMapFromStoreShardMap( ShardMapManager manager, IStoreShardMap ssm) { switch (ssm.MapType) { case ShardMapType.List: // Create ListShardMap<TKey> return((ShardMap)Activator.CreateInstance( typeof(ListShardMap <>).MakeGenericType( ShardKey.TypeFromShardKeyType(ssm.KeyType)), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { manager, ssm }, CultureInfo.InvariantCulture)); default: Debug.Assert(ssm.MapType == ShardMapType.Range); // Create RangeShardMap<TKey> return((ShardMap)Activator.CreateInstance( typeof(RangeShardMap <>).MakeGenericType( ShardKey.TypeFromShardKeyType(ssm.KeyType)), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { manager, ssm }, CultureInfo.InvariantCulture)); } }
/// <summary> /// Finds a shard map from cache if requested and if necessary from global shard map. /// </summary> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMapName">Name of shard map.</param> /// <param name="lookInCacheFirst">Whether to skip first lookup in cache.</param> /// <returns>Shard map object corresponding to one being searched.</returns> internal ShardMap LookupShardMapByName(string operationName, string shardMapName, bool lookInCacheFirst) { IStoreShardMap ssm = null; if (lookInCacheFirst) { // Typical scenario will result in immediate lookup succeeding. ssm = this.Cache.LookupShardMapByName(shardMapName); } ShardMap shardMap; // Cache miss. Go to store and add entry to cache. if (ssm == null) { Stopwatch stopwatch = Stopwatch.StartNew(); shardMap = this.LookupShardMapByNameInStore(operationName, shardMapName); stopwatch.Stop(); Tracer.TraceInfo(TraceSourceConstants.ComponentNames.ShardMapManager, "LookupShardMapByName", "Lookup ShardMap: {0} in store complete; Duration: {1}", shardMapName, stopwatch.Elapsed); } else { shardMap = ShardMapUtils.CreateShardMapFromStoreShardMap(this, ssm); } return(shardMap); }
/// <summary> /// Adds a shard to global shard map. /// </summary> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="ssm">Storage representation of shard map object.</param> private void AddShardMapToStore(string operationName, IStoreShardMap ssm) { using (IStoreOperationGlobal op = this.StoreOperationFactory.CreateAddShardMapGlobalOperation(this, operationName, ssm)) { op.Do(); } }
/// <summary> /// Looks up a given key in given shard map. /// </summary> /// <param name="shardMap">Storage representation of shard map.</param> /// <param name="key">Key value.</param> /// <returns>Mapping corresponding to <paramref name="key"/> or null.</returns> public virtual ICacheStoreMapping LookupMappingByKey(IStoreShardMap shardMap, ShardKey key) { ICacheStoreMapping sm = null; using (ReadLockScope rls = _cacheRoot.GetReadLockScope(false)) { CacheShardMap csm = _cacheRoot.LookupById(shardMap.Id); if (csm != null) { using (ReadLockScope rlsShardMap = csm.GetReadLockScope(false)) { IStoreMapping smDummy; sm = csm.Mapper.LookupByKey(key, out smDummy); /* * // perf counter can not be updated in csm.Mapper.LookupByKey() as this function is also called from csm.Mapper.AddOrUpdate() * // so updating perf counter value here instead. * csm.IncrementPerformanceCounter(sm == null ? PerformanceCounterName.MappingsLookupFailedPerSec : PerformanceCounterName.MappingsLookupSucceededPerSec); */ } } } return(sm); }
/// <summary> /// Constructs request to get shard with specific location for given shard map from GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map for which shard is being requested.</param> /// <param name="location">Location of shard being searched.</param> internal FindShardByLocationGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, ShardLocation location) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; _location = location; }
/// <summary> /// Constructs request to get shard with specific location for given shard map from GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map for which shard is being requested.</param> /// <param name="location">Location of shard being searched.</param> internal FindShardByLocationGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, ShardLocation location) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; _location = location; }
/// <summary> /// Constructs a new instance. /// </summary> /// <param name="manager">Reference to ShardMapManager.</param> /// <param name="ssm">Storage representation.</param> internal ListShardMap(ShardMapManager manager, IStoreShardMap ssm) : base(manager, ssm) { Debug.Assert(manager != null); Debug.Assert(ssm != null); _lsm = new ListShardMapper <TKey>(this.Manager, this); }
/// <summary> /// Converts IStoreShardMap to ShardMap. /// </summary> /// <param name="manager">Reference to shard map manager.</param> /// <param name="ssm">Storage representation for ShardMap.</param> /// <returns>ShardMap object corresponding to storange representation.</returns> internal static ShardMap CreateShardMapFromStoreShardMap( ShardMapManager manager, IStoreShardMap ssm) { switch (ssm.MapType) { case ShardMapType.List: // Create ListShardMap<TKey> return (ShardMap)Activator.CreateInstance( typeof(ListShardMap<>).MakeGenericType( ShardKey.TypeFromShardKeyType(ssm.KeyType)), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { manager, ssm }, CultureInfo.InvariantCulture); default: Debug.Assert(ssm.MapType == ShardMapType.Range); // Create RangeShardMap<TKey> return (ShardMap)Activator.CreateInstance( typeof(RangeShardMap<>).MakeGenericType( ShardKey.TypeFromShardKeyType(ssm.KeyType)), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { manager, ssm }, CultureInfo.InvariantCulture); } }
/// <summary> /// Creates request to update shard in given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which to remove shard.</param> /// <param name="shardOld">Shard to update.</param> /// <param name="shardNew">Updated shard.</param> protected internal UpdateShardOperation( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shardOld, IStoreShard shardNew) : this(shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, shardMap, shardOld, shardNew) { }
/// <summary> /// Constructs request for replacing the GSM mappings for given shard map with the input mappings. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation name.</param> /// <param name="shardMap">GSM Shard map.</param> /// <param name="shard">GSM Shard.</param> /// <param name="mappingsToRemove">Optional list of mappings to remove.</param> /// <param name="mappingsToAdd">List of mappings to add.</param> internal ReplaceMappingsGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreShard shard, IEnumerable<IStoreMapping> mappingsToRemove, IEnumerable<IStoreMapping> mappingsToAdd) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMap = shardMap; _shard = shard; _mappingsToRemove = mappingsToRemove; _mappingsToAdd = mappingsToAdd; }
/// <summary> /// Creates request to update shard in given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which to remove shard.</param> /// <param name="shardOld">Shard to update.</param> /// <param name="shardNew">Updated shard.</param> /// <returns>The store operation.</returns> public virtual IStoreOperation CreateUpdateShardOperation( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shardOld, IStoreShard shardNew) { return(new UpdateShardOperation(shardMapManager, shardMap, shardOld, shardNew)); }
/// <summary> /// Constructs request for obtaining mapping from GSM based on given key. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation being executed.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="mapping">Mapping whose Id will be used.</param> /// <param name="errorCategory">Error category.</param> internal FindMappingByIdGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreMapping mapping, ShardManagementErrorCategory errorCategory) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _manager = shardMapManager; _shardMap = shardMap; _mapping = mapping; _errorCategory = errorCategory; }
/// <summary> /// Constructs request for replacing the GSM mappings for given shard map with the input mappings. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation name.</param> /// <param name="shardMap">GSM Shard map.</param> /// <param name="shard">GSM Shard.</param> /// <param name="mappingsToRemove">Optional list of mappings to remove.</param> /// <param name="mappingsToAdd">List of mappings to add.</param> internal ReplaceMappingsGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreShard shard, IEnumerable <IStoreMapping> mappingsToRemove, IEnumerable <IStoreMapping> mappingsToAdd) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMap = shardMap; _shard = shard; _mappingsToRemove = mappingsToRemove; _mappingsToAdd = mappingsToAdd; }
/// <summary> /// Constructs request for obtaining mapping from GSM based on given key. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation being executed.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="mapping">Mapping whose Id will be used.</param> /// <param name="errorCategory">Error category.</param> internal FindMappingByIdGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreMapping mapping, ShardManagementErrorCategory errorCategory) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _manager = shardMapManager; _shardMap = shardMap; _mapping = mapping; _errorCategory = errorCategory; }
internal NTimeFailingRemoveShardMapGlobalOperation( int failureCountMax, ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap) : base(shardMapManager, operationName, shardMap) { _failureCountMax = failureCountMax; _currentFailureCount = 0; }
/// <summary> /// Constructs request to get all shards for given shard map from GSM. /// </summary> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which shards are being requested.</param> internal GetShardsGlobalOperation( string operationName, ShardMapManager shardMapManager, IStoreShardMap shardMap) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; }
/// <summary> /// Constructs request to get all shards for given shard map from GSM. /// </summary> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which shards are being requested.</param> internal GetShardsGlobalOperation( string operationName, ShardMapManager shardMapManager, IStoreShardMap shardMap) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; }
/// <summary> /// Constructs request to remove given shard map from GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map to remove.</param> /// <returns>The store operation.</returns> public virtual IStoreOperationGlobal CreateRemoveShardMapGlobalOperation( ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap) { return(new RemoveShardMapGlobalOperation( shardMapManager, operationName, shardMap)); }
internal NTimeFailingRemoveShardOperation( int failureCountMax, ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard) : base(shardMapManager, shardMap, shard) { _failureCountMax = failureCountMax; _currentFailureCount = 0; }
/// <summary> /// Constructs request to get all shards for given shard map from GSM. /// </summary> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="shardMap">Shard map for which shards are being requested.</param> /// <returns>The store operation.</returns> public virtual IStoreOperationGlobal CreateGetShardsGlobalOperation( string operationName, ShardMapManager shardMapManager, IStoreShardMap shardMap) { return(new GetShardsGlobalOperation( operationName, shardMapManager, shardMap)); }
/// <summary> /// Creates request to attach shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="shardMap">Shard map for which to attach shard.</param> /// <param name="shard">Shard to attach.</param> internal AttachShardOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, IStoreShardMap shardMap, IStoreShard shard) : base(shardMapManager, operationId, undoStartState, StoreOperationCode.AttachShard, default(Guid), default(Guid)) { _shardMap = shardMap; _shard = shard; }
/// <summary> /// Constructs request for obtaining all the mappings from GSM based on given shard and mappings. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation being executed.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="shard">Local shard.</param> /// <param name="range">Optional range to get mappings from.</param> /// <param name="errorCategory">Error category.</param> /// <param name="cacheResults">Whether to cache the results of the operation.</param> /// <param name="ignoreFailure">Ignore shard map not found error.</param> internal GetMappingsByRangeGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreShard shard, ShardRange range, ShardManagementErrorCategory errorCategory, bool cacheResults, bool ignoreFailure) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _manager = shardMapManager; _shardMap = shardMap; _shard = shard; _range = range; _errorCategory = errorCategory; _cacheResults = cacheResults; _ignoreFailure = ignoreFailure; }
/// <summary> /// Constructs request for obtaining all the mappings from GSM based on given shard and mappings. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation being executed.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="shard">Local shard.</param> /// <param name="range">Optional range to get mappings from.</param> /// <param name="errorCategory">Error category.</param> /// <param name="cacheResults">Whether to cache the results of the operation.</param> /// <param name="ignoreFailure">Ignore shard map not found error.</param> internal GetMappingsByRangeGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreShard shard, ShardRange range, ShardManagementErrorCategory errorCategory, bool cacheResults, bool ignoreFailure) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _manager = shardMapManager; _shardMap = shardMap; _shard = shard; _range = range; _errorCategory = errorCategory; _cacheResults = cacheResults; _ignoreFailure = ignoreFailure; }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="shardMap">Shard map for which to add shard.</param> /// <param name="shard">Shard to add.</param> internal AddShardOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, IStoreShardMap shardMap, IStoreShard shard) : base(shardMapManager, operationId, undoStartState, StoreOperationCode.AddShard, default(Guid), default(Guid)) { _shardMap = shardMap; _shard = shard; }
internal NTimeFailingUpdateShardOperation( int failureCountMax, ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shardOld, IStoreShard shardNew) : base(shardMapManager, shardMap, shardOld, shardNew) { _failureCountMax = failureCountMax; _currentFailureCount = 0; }
/// <summary> /// Constructs request to get shard with specific location for given shard map from GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map for which shard is being requested.</param> /// <param name="location">Location of shard being searched.</param> /// <returns>The store operation.</returns> public virtual IStoreOperationGlobal CreateFindShardByLocationGlobalOperation( ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, ShardLocation location) { return(new FindShardByLocationGlobalOperation( shardMapManager, operationName, shardMap, location)); }
/// <summary> /// Constructs request to lock or unlock given mappings in GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map to add.</param> /// <param name="mapping">Mapping to lock or unlock. Null means all mappings.</param> /// <param name="lockOwnerId">Lock owner.</param> /// <param name="lockOpType">Lock operation type.</param> /// <param name="errorCategory">Error category.</param> internal LockOrUnLockMappingsGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreMapping mapping, Guid lockOwnerId, LockOwnerIdOpType lockOpType, ShardManagementErrorCategory errorCategory) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; _mapping = mapping; _lockOwnerId = lockOwnerId; _lockOpType = lockOpType; _errorCategory = errorCategory; Debug.Assert(mapping != null || (lockOpType == LockOwnerIdOpType.UnlockAllMappingsForId || lockOpType == LockOwnerIdOpType.UnlockAllMappings)); }
/// <summary> /// Raise conversion exception. /// </summary> /// <typeparam name="TKey">Key type.</typeparam> /// <param name="ssm">Shard map whose conversion failed.</param> /// <param name="targetKind">Requested type of shard map.</param> private static ShardManagementException GetConversionException <TKey>(IStoreShardMap ssm, string targetKind) { return(new ShardManagementException( ShardManagementErrorCategory.ShardMapManager, ShardManagementErrorCode.ShardMapTypeConversionError, Errors._ShardMapExtensions_AsTypedShardMap_ConversionFailure, ssm.Name, targetKind, typeof(TKey).Name, ssm.MapType.ToString(), ssm.KeyType == ShardKeyType.None ? string.Empty : ShardKey.TypeFromShardKeyType(ssm.KeyType).Name)); }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to add mapping.</param> /// <param name="mapping">Mapping to add.</param> /// <returns>The store operation.</returns> public virtual IStoreOperation CreateAddMappingOperation( ShardMapManager shardMapManager, StoreOperationCode operationCode, IStoreShardMap shardMap, IStoreMapping mapping) { return(new AddMappingOperation( shardMapManager, operationCode, shardMap, mapping)); }
/// <summary> /// Constructs request to lock or unlock given mappings in GSM. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationName">Operation name, useful for diagnostics.</param> /// <param name="shardMap">Shard map to add.</param> /// <param name="mapping">Mapping to lock or unlock. Null means all mappings.</param> /// <param name="lockOwnerId">Lock owner.</param> /// <param name="lockOpType">Lock operation type.</param> /// <param name="errorCategory">Error category.</param> internal LockOrUnLockMappingsGlobalOperation(ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, IStoreMapping mapping, Guid lockOwnerId, LockOwnerIdOpType lockOpType, ShardManagementErrorCategory errorCategory) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _shardMapManager = shardMapManager; _shardMap = shardMap; _mapping = mapping; _lockOwnerId = lockOwnerId; _lockOpType = lockOpType; _errorCategory = errorCategory; Debug.Assert(mapping != null || (lockOpType == LockOwnerIdOpType.UnlockAllMappingsForId || lockOpType == LockOwnerIdOpType.UnlockAllMappings)); }
/// <summary> /// Invoked for deleting shard map in cache becase it no longer exists in store. /// </summary> /// <param name="shardMap">Storage representation of shard map.</param> public virtual void DeleteShardMap(IStoreShardMap shardMap) { using (WriteLockScope wls = _cacheRoot.GetWriteLockScope()) { _cacheRoot.Remove(shardMap); Tracer.TraceVerbose( TraceSourceConstants.ComponentNames.ShardMapManager, "OnDeleteShardMap", "Cache delete complete. ShardMap: {0}", shardMap.Name); } }
/// <summary> /// Instantiates a new instance of range mapping comparison result. /// </summary> /// <param name="ssm">Store representation of shard map.</param> /// <param name="range">Range being considered.</param> /// <param name="mappingLocation">Location of mapping.</param> /// <param name="gsmMapping">Storage representation of GSM mapping.</param> /// <param name="lsmMapping">Storange representation of LSM mapping.</param> internal MappingComparisonResult( IStoreShardMap ssm, ShardRange range, MappingLocation mappingLocation, IStoreMapping gsmMapping, IStoreMapping lsmMapping) { this.ShardMap = ssm; this.Range = range; this.MappingLocation = mappingLocation; this.ShardMapManagerMapping = gsmMapping; this.ShardMapping = lsmMapping; }
/// <summary> /// Invoked for deleting shard map in cache becase it no longer exists in store. /// </summary> /// <param name="shardMap">Storage representation of shard map.</param> public virtual void DeleteShardMap(IStoreShardMap shardMap) { using (WriteLockScope wls = _cacheRoot.GetWriteLockScope()) { _cacheRoot.Remove(shardMap); Tracer.TraceVerbose( TraceSourceConstants.ComponentNames.ShardMapManager, "OnDeleteShardMap", "Cache delete complete. ShardMap: {0}", shardMap.Name); } }
/// <summary> /// Instantiates a new instance of range mapping comparison result. /// </summary> /// <param name="ssm">Store representation of shard map.</param> /// <param name="range">Range being considered.</param> /// <param name="mappingLocation">Location of mapping.</param> /// <param name="gsmMapping">Storage representation of GSM mapping.</param> /// <param name="lsmMapping">Storange representation of LSM mapping.</param> internal MappingComparisonResult( IStoreShardMap ssm, ShardRange range, MappingLocation mappingLocation, IStoreMapping gsmMapping, IStoreMapping lsmMapping) { this.ShardMap = ssm; this.Range = range; this.MappingLocation = mappingLocation; this.ShardMapManagerMapping = gsmMapping; this.ShardMapping = lsmMapping; }
/// <summary> /// Helper function that produces a list of MappingComparisonResults from union of points in the gsmMappings and lsmMappings. /// </summary> /// <param name="ssm">StoreShardmap to be referenced in produced MappingComparisonResults</param> /// <param name="gsmMappings">List of mappings from the GSM.</param> /// <param name="lsmMappings">List of mappings from the LSM.</param> /// <returns>List of mappingcomparisonresults: one for each range arising from the union of boundaries in gsmMappings and lsmMappings.</returns> internal static List <MappingComparisonResult> ComparePointMappings( IStoreShardMap ssm, IEnumerable <IStoreMapping> gsmMappings, IEnumerable <IStoreMapping> lsmMappings) { ShardKeyType keyType = ssm.KeyType; // Get a Linq-able set of points from the input mappings. // IDictionary <ShardKey, IStoreMapping> gsmPoints = gsmMappings.ToDictionary(gsmMapping => ShardKey.FromRawValue(keyType, gsmMapping.MinValue)); IDictionary <ShardKey, IStoreMapping> lsmPoints = lsmMappings.ToDictionary(lsmMapping => ShardKey.FromRawValue(keyType, lsmMapping.MinValue)); // Construct the output list. This is the concatenation of 3 mappings: // 1.) Intersection (the key exists in both the shardmap and the shard.) // 2.) Shard only (the key exists only in the shard.) // 3.) Shardmap only (the key exists only in the shardmap.) // List <MappingComparisonResult> results = (new List <MappingComparisonResult>()).Concat( // Intersection. lsmPoints.Keys.Intersect(gsmPoints.Keys).Select( commonPoint => new MappingComparisonResult( ssm, new ShardRange(commonPoint, commonPoint.GetNextKey()), MappingLocation.MappingInShardMapAndShard, gsmPoints[commonPoint], lsmPoints[commonPoint])) ).Concat( // Lsm only. lsmPoints.Keys.Except(gsmPoints.Keys).Select( lsmOnlyPoint => new MappingComparisonResult( ssm, new ShardRange(lsmOnlyPoint, lsmOnlyPoint.GetNextKey()), MappingLocation.MappingInShardOnly, null, lsmPoints[lsmOnlyPoint])) ).Concat( // Gsm only. gsmPoints.Keys.Except(lsmPoints.Keys).Select( gsmOnlyPoint => new MappingComparisonResult( ssm, new ShardRange(gsmOnlyPoint, gsmOnlyPoint.GetNextKey()), MappingLocation.MappingInShardMapOnly, gsmPoints[gsmOnlyPoint], null))).ToList(); return(results); }
internal MappingDifference( MappingDifferenceType type, MappingLocation location, IStoreShardMap shardMap, IStoreMapping mappingForShardMap, IStoreMapping mappingForShard ) { this.Type = type; this.Location = location; this.ShardMap = shardMap; this.MappingForShardMap = mappingForShardMap; this.MappingForShard = mappingForShard; }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to add mapping.</param> /// <param name="mapping">Mapping to add.</param> protected internal AddMappingOperation( ShardMapManager shardMapManager, StoreOperationCode operationCode, IStoreShardMap shardMap, IStoreMapping mapping) : this( shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, operationCode, shardMap, mapping, default(Guid)) { }
/// <summary> /// Constructs the cached shard map. /// </summary> /// <param name="ssm">Storage representation of shard map.</param> internal CacheShardMap(IStoreShardMap ssm) : base() { this.StoreShardMap = ssm; switch (ssm.MapType) { case ShardMapType.List: this.Mapper = new CacheListMapper(ssm.KeyType); break; case ShardMapType.Range: this.Mapper = new CacheRangeMapper(ssm.KeyType); break; } }
/// <summary> /// Constructs request for replacing the LSM mappings for given shard map with the input mappings. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="location">Location of the LSM.</param> /// <param name="operationName">Operation name.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="shard">Local shard.</param> /// <param name="rangesToRemove">Optional list of ranges to minimize amount of deletions.</param> /// <param name="mappingsToAdd">List of mappings to add.</param> internal ReplaceMappingsLocalOperation( ShardMapManager shardMapManager, ShardLocation location, string operationName, IStoreShardMap shardMap, IStoreShard shard, IEnumerable<ShardRange> rangesToRemove, IEnumerable<IStoreMapping> mappingsToAdd) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, location, operationName) { _shardMap = shardMap; _shard = shard; _rangesToRemove = rangesToRemove; _mappingsToAdd = mappingsToAdd; }
/// <summary> /// Serializes shard map to xml. /// </summary> /// <param name="name">Element name for shard map.</param> /// <param name="shardMap">Shard Map to serialize.</param> /// <returns>XElement representing Shard Map.</returns> internal static XElement WriteIStoreShardMap(string name, IStoreShardMap shardMap) { if (shardMap == null) { return new XElement(name, new XAttribute("Null", 1)); } else { return new XElement(name, new XAttribute("Null", 0), new XElement("Id", shardMap.Id), new XElement("Name", shardMap.Name), new XElement("Kind", (int)shardMap.MapType), new XElement("KeyKind", (int)shardMap.KeyType)); } }
/// <summary> /// Creates request to replace mappings within shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to update mapping.</param> /// <param name="mappingsSource">Original mappings.</param> /// <param name="mappingsTarget">Target mappings mapping.</param> protected internal ReplaceMappingsOperation( ShardMapManager shardMapManager, StoreOperationCode operationCode, IStoreShardMap shardMap, Tuple<IStoreMapping, Guid>[] mappingsSource, Tuple<IStoreMapping, Guid>[] mappingsTarget) : this( shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, operationCode, shardMap, mappingsSource, mappingsTarget, default(Guid)) { }
/// <summary> /// Constructs request for obtaining all the shard maps and shards from an LSM. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="location">Location of the LSM.</param> /// <param name="operationName">Operation name.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="shard">Local shard.</param> /// <param name="range">Optional range to get mappings from.</param> /// <param name="ignoreFailure">Ignore shard map not found error.</param> internal GetMappingsByRangeLocalOperation( ShardMapManager shardMapManager, ShardLocation location, string operationName, IStoreShardMap shardMap, IStoreShard shard, ShardRange range, bool ignoreFailure) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, location, operationName) { Debug.Assert(shard != null); _shardMap = shardMap; _shard = shard; _range = range; _ignoreFailure = ignoreFailure; }
/// <summary> /// Constructs the cached shard map. /// </summary> /// <param name="ssm">Storage representation of shard map.</param> internal CacheShardMap(IStoreShardMap ssm) : base() { this.StoreShardMap = ssm; switch (ssm.MapType) { case ShardMapType.List: this.Mapper = new CacheListMapper(ssm.KeyType); break; case ShardMapType.Range: this.Mapper = new CacheRangeMapper(ssm.KeyType); break; } this._perfCounters = new PerfCounterInstance(ssm.Name); }
/// <summary> /// Creates request to update shard in given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="shardMap">Shard map for which to remove shard.</param> /// <param name="shardOld">Shard to update.</param> /// <param name="shardNew">Updated shard.</param> internal UpdateShardOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, IStoreShardMap shardMap, IStoreShard shardOld, IStoreShard shardNew) : base( shardMapManager, operationId, undoStartState, StoreOperationCode.UpdateShard, default(Guid), default(Guid)) { _shardMap = shardMap; _shardOld = shardOld; _shardNew = shardNew; }
/// <summary> /// Constructs request for obtaining mapping from GSM based on given key. /// </summary> /// <param name="shardMapManager">Shard map manager.</param> /// <param name="operationName">Operation being executed.</param> /// <param name="shardMap">Local shard map.</param> /// <param name="key">Key for lookup operation.</param> /// <param name="policy">Policy for cache update.</param> /// <param name="errorCategory">Error category.</param> /// <param name="cacheResults">Whether to cache the results of the operation.</param> /// <param name="ignoreFailure">Ignore shard map not found error.</param> protected internal FindMappingByKeyGlobalOperation( ShardMapManager shardMapManager, string operationName, IStoreShardMap shardMap, ShardKey key, CacheStoreMappingUpdatePolicy policy, ShardManagementErrorCategory errorCategory, bool cacheResults, bool ignoreFailure) : base(shardMapManager.Credentials, shardMapManager.RetryPolicy, operationName) { _manager = shardMapManager; _shardMap = shardMap; _key = key; _policy = policy; _errorCategory = errorCategory; _cacheResults = cacheResults; _ignoreFailure = ignoreFailure; }
/// <summary> /// Creates request to replace mappings within shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to update mapping.</param> /// <param name="mappingsSource">Original mappings.</param> /// <param name="mappingsTarget">Target mappings mapping.</param> /// <param name="originalShardVersionAdds">Original shard version on source.</param> internal ReplaceMappingsOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, StoreOperationCode operationCode, IStoreShardMap shardMap, Tuple<IStoreMapping, Guid>[] mappingsSource, Tuple<IStoreMapping, Guid>[] mappingsTarget, Guid originalShardVersionAdds) : base( shardMapManager, operationId, undoStartState, operationCode, originalShardVersionAdds, originalShardVersionAdds) { _shardMap = shardMap; _mappingsSource = mappingsSource; _mappingsTarget = mappingsTarget; }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to add mapping.</param> /// <param name="mapping">Mapping to add.</param> /// <param name="originalShardVersionAdds">Original shard version.</param> internal AddMappingOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, StoreOperationCode operationCode, IStoreShardMap shardMap, IStoreMapping mapping, Guid originalShardVersionAdds) : base( shardMapManager, operationId, undoStartState, operationCode, default(Guid), originalShardVersionAdds) { _shardMap = shardMap; _mapping = mapping; _errorCategory = operationCode == StoreOperationCode.AddRangeMapping ? ShardManagementErrorCategory.RangeShardMap : ShardManagementErrorCategory.ListShardMap; }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map for which to update mapping.</param> /// <param name="mappingSource">Mapping to update.</param> /// <param name="mappingTarget">Updated mapping.</param> /// <param name="patternForKill">Pattern for kill commands.</param> /// <param name="lockOwnerId">Id of lock owner.</param> protected internal UpdateMappingOperation( ShardMapManager shardMapManager, StoreOperationCode operationCode, IStoreShardMap shardMap, IStoreMapping mappingSource, IStoreMapping mappingTarget, string patternForKill, Guid lockOwnerId) : this( shardMapManager, Guid.NewGuid(), StoreOperationState.UndoBegin, operationCode, shardMap, mappingSource, mappingTarget, patternForKill, lockOwnerId, default(Guid), default(Guid)) { }
/// <summary> /// Execute the operation against GSM in the current transaction scope. /// </summary> /// <param name="ts">Transaction scope.</param> /// <returns> /// Results of the operation. /// </returns> public override IStoreResults DoGlobalExecute(IStoreTransactionScope ts) { _loadResults.Clear(); IStoreResults result = ts.ExecuteOperation( StoreOperationRequestBuilder.SpGetAllShardMapsGlobal, StoreOperationRequestBuilder.GetAllShardMapsGlobal()); if (result.Result == StoreResult.Success) { foreach (IStoreShardMap ssm in result.StoreShardMaps) { _ssmCurrent = ssm; result = ts.ExecuteOperation( StoreOperationRequestBuilder.SpGetAllShardMappingsGlobal, StoreOperationRequestBuilder.GetAllShardMappingsGlobal(ssm, null, null)); if (result.Result == StoreResult.Success) { _loadResults.Add( new LoadResult { ShardMap = ssm, Mappings = result.StoreMappings }); } else if (result.Result != StoreResult.ShardMapDoesNotExist) { // Ignore some possible failures for Load operation and skip failed // shard map caching operations. break; } } } return result; }
/// <summary> /// Returns the proper ShardManagementException corresponding to given error code in /// <paramref name="result"/> for ShardMapManager operations. /// </summary> /// <param name="result">Operation result object.</param> /// <param name="shardMap">Shard map object.</param> /// <param name="operationName">Operation being performed.</param> /// <param name="storedProcName">Stored procedure being executed.</param> /// <returns>ShardManagementException to be raised.</returns> internal static ShardManagementException OnShardMapManagerErrorGlobal( IStoreResults result, IStoreShardMap shardMap, string operationName, string storedProcName) { switch (result.Result) { case StoreResult.ShardMapExists: Debug.Assert(shardMap != null); return new ShardManagementException( ShardManagementErrorCategory.ShardMapManager, ShardManagementErrorCode.ShardMapAlreadyExists, Errors._Store_ShardMap_AlreadyExistsGlobal, shardMap.Name, storedProcName, operationName); case StoreResult.ShardMapHasShards: Debug.Assert(shardMap != null); return new ShardManagementException( ShardManagementErrorCategory.ShardMapManager, ShardManagementErrorCode.ShardMapHasShards, Errors._Store_ShardMap_ContainsShardsGlobal, shardMap.Name, storedProcName, operationName); case StoreResult.StoreVersionMismatch: case StoreResult.MissingParametersForStoredProcedure: default: return StoreOperationErrorHandler.OnCommonErrorGlobal( result, operationName, storedProcName); } }
/// <summary> /// Creates request to add shard to given shard map. /// </summary> /// <param name="shardMapManager">Shard map manager object.</param> /// <param name="operationId">Operation id.</param> /// <param name="undoStartState">State from which Undo operation starts.</param> /// <param name="operationCode">Store operation code.</param> /// <param name="shardMap">Shard map from which to remove mapping.</param> /// <param name="mapping">Mapping to add.</param> /// <param name="lockOwnerId">Id of lock owner.</param> /// <param name="originalShardVersionRemoves">Original shard version.</param> internal RemoveMappingOperation( ShardMapManager shardMapManager, Guid operationId, StoreOperationState undoStartState, StoreOperationCode operationCode, IStoreShardMap shardMap, IStoreMapping mapping, Guid lockOwnerId, Guid originalShardVersionRemoves) : base( shardMapManager, operationId, undoStartState, operationCode, originalShardVersionRemoves, default(Guid)) { _shardMap = shardMap; _mapping = mapping; _lockOwnerId = lockOwnerId; _errorCategory = operationCode == StoreOperationCode.RemoveRangeMapping ? ShardManagementErrorCategory.RangeShardMap : ShardManagementErrorCategory.ListShardMap; }
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; }
internal AddShardOperationFailAfterLocalSource( ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard) : base(shardMapManager, shardMap, shard) { }