/// <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>
 /// 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)
 {
 }
Esempio n. 4
0
        /// <summary>
        /// Helper function to obtain a store shard object from given recovery token.
        /// </summary>
        /// <param name="operationName">Operation name.</param>
        /// <param name="token">Token from DetectMappingDifferences.</param>
        /// <param name="ssmLocal">Reference to store shard map corresponding to the token.</param>
        /// <returns>Store shard object corresponding to given token, or null if shard map is default shard map.</returns>
        private DefaultStoreShard GetStoreShardFromToken(string operationName, RecoveryToken token, out IStoreShardMap ssmLocal)
        {
            Tuple <IStoreShardMap, IStoreShard> shardInfoLocal;

            if (!this.StoreShardMaps.TryGetValue(token, out shardInfoLocal))
            {
                throw new ArgumentException(
                          StringUtils.FormatInvariant(
                              Errors._Recovery_InvalidRecoveryToken,
                              token),
                          "token");
            }

            ssmLocal = shardInfoLocal.Item1;

            IStoreShard ssLocal = shardInfoLocal.Item2;

            ShardLocation location = this.GetShardLocation(token);

            using (IStoreOperationLocal op = this.Manager.StoreOperationFactory.CreateCheckShardLocalOperation(
                       operationName,
                       this.Manager,
                       location))
            {
                op.Do();
            }

            return(new DefaultStoreShard(
                       ssLocal.Id,
                       ssLocal.Version,
                       ssLocal.ShardMapId,
                       ssLocal.Location,
                       ssLocal.Status));
        }
Esempio n. 5
0
 /// <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;
 }
Esempio n. 6
0
 /// <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>
 /// 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 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;
 }
Esempio n. 9
0
 internal NTimeFailingRemoveShardOperation(
     int failureCountMax,
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shard) :
     base(shardMapManager, shardMap, shard)
 {
     _failureCountMax     = failureCountMax;
     _currentFailureCount = 0;
 }
Esempio n. 10
0
 internal NTimeFailingUpdateShardOperation(
     int failureCountMax,
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew) :
     base(shardMapManager, shardMap, shardOld, shardNew)
 {
     _failureCountMax     = failureCountMax;
     _currentFailureCount = 0;
 }
 /// <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>
 /// 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;
 }
 /// <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;
 }
Esempio n. 15
0
 /// <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>
 /// 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;
 }
Esempio n. 17
0
 /// <summary>
 /// Serializes shard to xml.
 /// </summary>
 /// <param name="name">Element name for shard.</param>
 /// <param name="shard">Shard to serialize.</param>
 /// <returns>XElement representing Shard.</returns>
 internal static XElement WriteIStoreShard(string name, IStoreShard shard)
 {
     if (shard == null)
     {
         return(new XElement(name, new XAttribute("Null", 1)));
     }
     else
     {
         return(new XElement(name, new XAttribute("Null", 0),
                             new XElement("Id", shard.Id),
                             new XElement("Version", shard.Version),
                             new XElement("ShardMapId", shard.ShardMapId),
                             WriteShardLocation("Location", shard.Location),
                             new XElement("Status", (int)shard.Status)));
     }
 }
 /// <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>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperationGlobal CreateReplaceMappingsGlobalOperation(
     ShardMapManager shardMapManager,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     IEnumerable <IStoreMapping> mappingsToRemove,
     IEnumerable <IStoreMapping> mappingsToAdd)
 {
     return(new ReplaceMappingsGlobalOperation(
                shardMapManager,
                operationName,
                shardMap,
                shard,
                mappingsToRemove,
                mappingsToAdd));
 }
Esempio n. 19
0
        /// <summary>
        /// Internal constructor that uses storage representation.
        /// </summary>
        /// <param name="manager">Owning ShardMapManager.</param>
        /// <param name="shardMap">Owning shard map.</param>
        /// <param name="storeShard">Storage representation of the shard.</param>
        internal Shard(
            ShardMapManager manager,
            ShardMap shardMap,
            IStoreShard storeShard)
        {
            Debug.Assert(manager != null);
            this.Manager = manager;

            Debug.Assert(shardMap != null);
            this.ShardMap = shardMap;

            Debug.Assert(storeShard.ShardMapId != default(Guid));
            this.StoreShard = storeShard;

            _hashCode = this.CalculateHashCode();
        }
 /// <summary>
 /// Serializes shard to xml.
 /// </summary>
 /// <param name="name">Element name for shard.</param>
 /// <param name="shard">Shard to serialize.</param>
 /// <returns>XElement representing Shard.</returns>
 internal static XElement WriteIStoreShard(string name, IStoreShard shard)
 {
     if (shard == null)
     {
         return new XElement(name, new XAttribute("Null", 1));
     }
     else
     {
         return new XElement(name, new XAttribute("Null", 0),
             new XElement("Id", shard.Id),
             new XElement("Version", shard.Version),
             new XElement("ShardMapId", shard.ShardMapId),
             WriteShardLocation("Location", shard.Location),
             new XElement("Status", (int)shard.Status));
     }
 }
        /// <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 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 storage representation from client side objects.
        /// </summary>
        /// <param name="id">Identify of mapping.</param>
        /// <param name="shardMapId">Id of parent shardmap.</param>
        /// <param name="storeShard">IStoreShard</param>
        /// <param name="minValue">Min key value.</param>
        /// <param name="maxValue">Max key value.</param>
        /// <param name="status">Mapping status.</param>
        /// <param name="lockOwnerId">Lock owner id.</param>
        internal DefaultStoreMapping(
            Guid id,
            Guid shardMapId,
            IStoreShard storeShard,
            byte[] minValue,
            byte[] maxValue,
            int status,
            Guid lockOwnerId)
        {
            this.Id          = id;
            this.ShardMapId  = shardMapId;
            this.MinValue    = minValue;
            this.MaxValue    = maxValue;
            this.Status      = status;
            this.LockOwnerId = lockOwnerId;

            this.StoreShard = storeShard;
        }
        /// <summary>
        /// Constructs the storage representation from client side objects.
        /// </summary>
        /// <param name="id">Identify of mapping.</param>
        /// <param name="shardMapId">Id of parent shardmap.</param>
        /// <param name="storeShard">IStoreShard</param>
        /// <param name="minValue">Min key value.</param>
        /// <param name="maxValue">Max key value.</param>
        /// <param name="status">Mapping status.</param>
        /// <param name="lockOwnerId">Lock owner id.</param>
        internal DefaultStoreMapping(
            Guid id,
            Guid shardMapId,
            IStoreShard storeShard,
            byte[] minValue,
            byte[] maxValue,
            int status,
            Guid lockOwnerId)
        {
            this.Id = id;
            this.ShardMapId = shardMapId;
            this.MinValue = minValue;
            this.MaxValue = maxValue;
            this.Status = status;
            this.LockOwnerId = lockOwnerId;

            this.StoreShard = storeShard;
        }
 /// <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>
 public virtual IStoreOperationLocal CreateGetMappingsByRangeLocalOperation(
     ShardMapManager shardMapManager,
     ShardLocation location,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     ShardRange range,
     bool ignoreFailure)
 {
     return(new GetMappingsByRangeLocalOperation(
                shardMapManager,
                location,
                operationName,
                shardMap,
                shard,
                range,
                ignoreFailure));
 }
 /// <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>
 public virtual IStoreOperationLocal CreateReplaceMappingsLocalOperation(
     ShardMapManager shardMapManager,
     ShardLocation location,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     IEnumerable <ShardRange> rangesToRemove,
     IEnumerable <IStoreMapping> mappingsToAdd)
 {
     return(new ReplaceMappingsLocalOperation(
                shardMapManager,
                location,
                operationName,
                shardMap,
                shard,
                rangesToRemove,
                mappingsToAdd));
 }
Esempio n. 27
0
 /// <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>
 /// 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;
 }
Esempio n. 29
0
        public void AttachShard(ShardLocation location, string shardMapName)
        {
            ExceptionUtils.DisallowNullArgument(location, "location");

            IStoreResults result;

            using (IStoreOperationLocal op = this.Manager.StoreOperationFactory.CreateGetShardsLocalOperation(
                       this.Manager,
                       location,
                       "AttachShard"))
            {
                result = op.Do();
            }

            Debug.Assert(result.Result == StoreResult.Success);

            IEnumerable <IStoreShardMap> shardMaps =
                shardMapName == null ?
                result.StoreShardMaps :
                result.StoreShardMaps.Where(s => s.Name == shardMapName);

            shardMaps.ToList <IStoreShardMap>().ForEach((sm) =>
            {
                IStoreShard shard = result.StoreShards.SingleOrDefault(s => s.ShardMapId == sm.Id);

                // construct a new store shard with correct location
                DefaultStoreShard sNew = new DefaultStoreShard(
                    shard.Id,
                    shard.Version,
                    shard.ShardMapId,
                    location,
                    shard.Status);

                using (IStoreOperation op = this.Manager.StoreOperationFactory.CreateAttachShardOperation(
                           this.Manager,
                           sm,
                           sNew))
                {
                    op.Do();
                }
            });
        }
 /// <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>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperationGlobal CreateGetMappingsByRangeGlobalOperation(
     ShardMapManager shardMapManager,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     ShardRange range,
     ShardManagementErrorCategory errorCategory,
     bool cacheResults,
     bool ignoreFailure)
 {
     return(new GetMappingsByRangeGlobalOperation(
                shardMapManager,
                operationName,
                shardMap,
                shard,
                range,
                errorCategory,
                cacheResults,
                ignoreFailure));
 }
Esempio n. 31
0
        /// <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="shard">Shard object.</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 OnRecoveryErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
            case StoreResult.ShardLocationExists:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardLocationAlreadyExists,
                           Errors._Store_Shard_LocationAlreadyExistsGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardMapExists:
                Debug.Assert(shardMap != null);
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardMapAlreadyExists,
                           Errors._Store_ShardMap_AlreadyExistsGlobal,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.StoreVersionMismatch:
            case StoreResult.MissingParametersForStoredProcedure:
            default:
                return(StoreOperationErrorHandler.OnCommonErrorGlobal(
                           result,
                           operationName,
                           storedProcName));
            }
        }
        /// <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="shard">Shard object.</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 OnRecoveryErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
                case StoreResult.ShardLocationExists:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardLocationAlreadyExists,
                        Errors._Store_Shard_LocationAlreadyExistsGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardMapExists:
                    Debug.Assert(shardMap != null);
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardMapAlreadyExists,
                        Errors._Store_ShardMap_AlreadyExistsGlobal,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.StoreVersionMismatch:
                case StoreResult.MissingParametersForStoredProcedure:
                default:
                    return StoreOperationErrorHandler.OnCommonErrorGlobal(
                        result,
                        operationName,
                        storedProcName);
            }
        }
Esempio n. 33
0
        /// <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="shard">Shard object.</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 OnShardMapErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
            case StoreResult.ShardMapDoesNotExist:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardMapDoesNotExist,
                           Errors._Store_ShardMap_DoesNotExistGlobal,
                           shardMap.Name,
                           storedProcName,
                           operationName,
                           shard != null ? shard.Location.ToString() : "*"));

            case StoreResult.ShardExists:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardAlreadyExists,
                           Errors._Store_Shard_AlreadyExistsGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardLocationExists:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardLocationAlreadyExists,
                           Errors._Store_Shard_LocationAlreadyExistsGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardDoesNotExist:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardDoesNotExist,
                           Errors._Store_Shard_DoesNotExistGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardVersionMismatch:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardVersionMismatch,
                           Errors._Store_Shard_VersionMismatchGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardHasMappings:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardHasMappings,
                           Errors._Store_Shard_HasMappingsGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.StoreVersionMismatch:
            case StoreResult.MissingParametersForStoredProcedure:
            default:
                return(StoreOperationErrorHandler.OnCommonErrorGlobal(
                           result,
                           operationName,
                           storedProcName));
            }
        }
 /// <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>
 public virtual IStoreOperationLocal CreateGetMappingsByRangeLocalOperation(
     ShardMapManager shardMapManager,
     ShardLocation location,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     ShardRange range,
     bool ignoreFailure)
 {
     return new GetMappingsByRangeLocalOperation(
         shardMapManager,
         location,
         operationName,
         shardMap,
         shard,
         range,
         ignoreFailure);
 }
Esempio n. 35
0
        /// <summary>
        /// Returns the proper ShardManagementException corresponding to given error code in
        /// <paramref name="result"/> for ShardMapper operations.
        /// </summary>
        /// <param name="result">Operation result object.</param>
        /// <param name="shardMap">Shard map object.</param>
        /// <param name="shard">Shard object.</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 OnShardMapperErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
            case StoreResult.ShardMapDoesNotExist:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardMapDoesNotExist,
                           Errors._Store_ShardMap_DoesNotExistGlobal,
                           shardMap.Name,
                           storedProcName,
                           operationName,
                           shard != null ? shard.Location.ToString() : "*"));

            case StoreResult.ShardDoesNotExist:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardDoesNotExist,
                           Errors._Store_Shard_DoesNotExistGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.ShardVersionMismatch:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.ShardVersionMismatch,
                           Errors._Store_Shard_VersionMismatchGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.MappingDoesNotExist:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingDoesNotExist,
                           Errors._Store_ShardMapper_MappingDoesNotExistGlobal,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.MappingRangeAlreadyMapped:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingRangeAlreadyMapped,
                           Errors._Store_ShardMapper_MappingPointOrRangeAlreadyMapped,
                           shard.Location,
                           shardMap.Name,
                           "Range",
                           storedProcName,
                           operationName));

            case StoreResult.MappingPointAlreadyMapped:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingPointAlreadyMapped,
                           Errors._Store_ShardMapper_MappingPointOrRangeAlreadyMapped,
                           shard.Location,
                           shardMap.Name,
                           "Point",
                           storedProcName,
                           operationName));

            case StoreResult.MappingNotFoundForKey:
                Debug.Fail("MappingNotFoundForKey should not be raised during SqlOperation.");
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingNotFoundForKey,
                           Errors._Store_ShardMapper_MappingNotFoundForKeyGlobal,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.MappingIsAlreadyLocked:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingIsAlreadyLocked,
                           Errors._Store_ShardMapper_LockMappingAlreadyLocked,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.MappingLockOwnerIdDoesNotMatch:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingLockOwnerIdDoesNotMatch,
                           Errors._Store_ShardMapper_LockOwnerDoesNotMatch,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.MappingIsNotOffline:
                return(new ShardManagementException(
                           errorCategory,
                           ShardManagementErrorCode.MappingIsNotOffline,
                           Errors._Store_ShardMapper_MappingIsNotOffline,
                           shard.Location,
                           shardMap.Name,
                           storedProcName,
                           operationName));

            case StoreResult.StoreVersionMismatch:
            case StoreResult.MissingParametersForStoredProcedure:
            default:
                return(StoreOperationErrorHandler.OnCommonErrorGlobal(
                           result,
                           operationName,
                           storedProcName));
            }
        }
 internal UpdateShardOperationFailAfterGlobalPreLocal(
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew)
     : base(shardMapManager,
     shardMap,
     shardOld,
     shardNew)
 {
 }
 internal AddShardOperationFailAfterGlobalPreLocal(
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shard)
     : base(shardMapManager,
     shardMap,
     shard)
 {
 }
 /// <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 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>
 /// Request to attach shard to GSM.
 /// </summary>
 /// <param name="shardMap">Shard map to attach.</param>
 /// <param name="shard">Shard to attach.</param>
 /// <returns>Xml formatted request.</returns>
 internal static XElement AttachShardGlobal(IStoreShardMap shardMap, IStoreShard shard)
 {
     return new XElement(
         @"AttachShardGlobal",
         StoreOperationRequestBuilder.s_gsmVersion,
         StoreObjectFormatterXml.WriteIStoreShardMap("ShardMap", shardMap),
         StoreObjectFormatterXml.WriteIStoreShard("Shard", shard));
 }
        /// <summary>
        /// Returns the proper ShardManagementException corresponding to given error code in 
        /// <paramref name="result"/> for ShardMapper operations.
        /// </summary>
        /// <param name="result">Operation result object.</param>
        /// <param name="shardMap">Shard map object.</param>
        /// <param name="shard">Shard object.</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 OnShardMapperErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
                case StoreResult.ShardMapDoesNotExist:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardMapDoesNotExist,
                        Errors._Store_ShardMap_DoesNotExistGlobal,
                        shardMap.Name,
                        storedProcName,
                        operationName,
                        shard != null ? shard.Location.ToString() : "*");

                case StoreResult.ShardDoesNotExist:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardDoesNotExist,
                        Errors._Store_Shard_DoesNotExistGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardVersionMismatch:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardVersionMismatch,
                        Errors._Store_Shard_VersionMismatchGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.MappingDoesNotExist:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingDoesNotExist,
                        Errors._Store_ShardMapper_MappingDoesNotExistGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.MappingRangeAlreadyMapped:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingRangeAlreadyMapped,
                        Errors._Store_ShardMapper_MappingPointOrRangeAlreadyMapped,
                        shard.Location,
                        shardMap.Name,
                        "Range",
                        storedProcName,
                        operationName);

                case StoreResult.MappingPointAlreadyMapped:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingPointAlreadyMapped,
                        Errors._Store_ShardMapper_MappingPointOrRangeAlreadyMapped,
                        shard.Location,
                        shardMap.Name,
                        "Point",
                        storedProcName,
                        operationName);

                case StoreResult.MappingNotFoundForKey:
                    Debug.Fail("MappingNotFoundForKey should not be raised during SqlOperation.");
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingNotFoundForKey,
                        Errors._Store_ShardMapper_MappingNotFoundForKeyGlobal,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.MappingIsAlreadyLocked:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingIsAlreadyLocked,
                        Errors._Store_ShardMapper_LockMappingAlreadyLocked,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.MappingLockOwnerIdDoesNotMatch:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingLockOwnerIdDoesNotMatch,
                        Errors._Store_ShardMapper_LockOwnerDoesNotMatch,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.MappingIsNotOffline:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.MappingIsNotOffline,
                        Errors._Store_ShardMapper_MappingIsNotOffline,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.StoreVersionMismatch:
                case StoreResult.MissingParametersForStoredProcedure:
                default:
                    return StoreOperationErrorHandler.OnCommonErrorGlobal(
                        result,
                        operationName,
                        storedProcName);
            }
        }
 /// <summary>
 /// Request to update shard in given shard map in LSM.
 /// </summary>
 /// <param name="operationId">Operation Id.</param>
 /// <param name="shardMap">Shard map to remove shard from.</param>
 /// <param name="shard">Shard to update.</param>
 /// <returns>Xml formatted request.</returns>
 internal static XElement UpdateShardLocal(
     Guid operationId,
     IStoreShardMap shardMap,
     IStoreShard shard)
 {
     return new XElement(
         "UpdateShardLocal",
         StoreOperationRequestBuilder.OperationId(operationId),
         StoreOperationRequestBuilder.s_lsmVersion,
         StoreObjectFormatterXml.WriteIStoreShardMap("ShardMap", shardMap),
         StoreObjectFormatterXml.WriteIStoreShard("Shard", shard));
 }
Esempio n. 43
0
        public IEnumerable <RecoveryToken> DetectMappingDifferences(ShardLocation location, string shardMapName)
        {
            ExceptionUtils.DisallowNullArgument(location, "location");

            IList <RecoveryToken> listOfTokens = new List <RecoveryToken>();

            IStoreResults getShardsLocalResult;

            using (IStoreOperationLocal op = this.Manager.StoreOperationFactory.CreateGetShardsLocalOperation(
                       this.Manager,
                       location,
                       "DetectMappingDifferences"))
            {
                getShardsLocalResult = op.Do();
            }

            Debug.Assert(getShardsLocalResult.Result == StoreResult.Success);

            IEnumerable <IStoreShardMap> shardMaps =
                shardMapName == null ?
                getShardsLocalResult.StoreShardMaps :
                getShardsLocalResult.StoreShardMaps.Where(s => s.Name == shardMapName);

            IEnumerable <Tuple <IStoreShardMap, IStoreShard> > shardInfos =
                shardMaps
                .Select(sm => new Tuple <IStoreShardMap, IStoreShard>(
                            sm,
                            getShardsLocalResult.StoreShards.SingleOrDefault(s => s.ShardMapId == sm.Id)));

            foreach (Tuple <IStoreShardMap, IStoreShard> shardInfo in shardInfos)
            {
                IStoreShardMap ssmLocal = shardInfo.Item1;
                IStoreShard    ssLocal  = shardInfo.Item2;

                RecoveryToken token = new RecoveryToken();

                listOfTokens.Add(token);
                this.StoreShardMaps[token] = shardInfo;
                this.Locations[token]      = location;

                this.Inconsistencies[token] = new Dictionary <ShardRange, MappingDifference>();

                DefaultStoreShard dss = new DefaultStoreShard(
                    ssLocal.Id,
                    ssLocal.Version,
                    ssLocal.ShardMapId,
                    ssLocal.Location,
                    ssLocal.Status);

                // First get all local mappings.
                IStoreResults lsmMappings;

                using (IStoreOperationLocal op = this.Manager.StoreOperationFactory.CreateGetMappingsByRangeLocalOperation(
                           this.Manager,
                           location,
                           "DetectMappingDifferences",
                           ssmLocal,
                           dss,
                           null,
                           true))
                {
                    lsmMappings = op.Do();

                    if (lsmMappings.Result == StoreResult.ShardMapDoesNotExist)
                    {
                        // The shard needs to be re-attached. We are ignoring these errors in
                        // DetectMappingDifferences, since corruption is more profound than
                        // just inconsistent mappings.
                        // Alternatively, this shard belongs to a different shard map manager.
                        // Either way, we can't do anything about it here.
                        continue;
                    }
                }

                // Next build up a set of relevant global mappings.
                // This is the union of those mappings that are associated with this local shard
                // and those mappings which intersect with mappings found in the local shard.
                // We will partition these mappings based on ranges.
                IDictionary <ShardRange, IStoreMapping> relevantGsmMappings = new Dictionary <ShardRange, IStoreMapping>();

                IStoreResults gsmMappingsByMap;

                using (IStoreOperationGlobal op = this.Manager.StoreOperationFactory.CreateGetMappingsByRangeGlobalOperation(
                           this.Manager,
                           "DetectMappingDifferences",
                           ssmLocal,
                           dss,
                           null,
                           ShardManagementErrorCategory.Recovery,
                           false,
                           true /* ignore failures */))
                {
                    gsmMappingsByMap = op.Do();
                }

                if (gsmMappingsByMap.Result == StoreResult.ShardMapDoesNotExist)
                {
                    // The shard map is not properly attached to this GSM.
                    // This is beyond what we can handle resolving mappings.
                    continue;
                }

                foreach (IStoreMapping gsmMapping in gsmMappingsByMap.StoreMappings)
                {
                    ShardKey min = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MinValue);

                    ShardKey max = null;

                    switch (ssmLocal.MapType)
                    {
                    case ShardMapType.Range:
                        max = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MaxValue);
                        break;

                    default:
                        Debug.Assert(ssmLocal.MapType == ShardMapType.List);
                        max = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MinValue).GetNextKey();
                        break;
                    }

                    ShardRange range = new ShardRange(min, max);

                    relevantGsmMappings[range] = gsmMapping;
                }

                // Next, for each of the mappings in lsmMappings, we need to augment
                // the gsmMappingsByMap by intersecting ranges.
                foreach (IStoreMapping lsmMapping in lsmMappings.StoreMappings)
                {
                    ShardKey min = ShardKey.FromRawValue(ssmLocal.KeyType, lsmMapping.MinValue);

                    IStoreResults gsmMappingsByRange;

                    if (ssmLocal.MapType == ShardMapType.Range)
                    {
                        ShardKey max = ShardKey.FromRawValue(ssmLocal.KeyType, lsmMapping.MaxValue);

                        ShardRange range = new ShardRange(min, max);

                        using (IStoreOperationGlobal op = this.Manager.StoreOperationFactory.CreateGetMappingsByRangeGlobalOperation(
                                   this.Manager,
                                   "DetectMappingDifferences",
                                   ssmLocal,
                                   null,
                                   range,
                                   ShardManagementErrorCategory.Recovery,
                                   false,
                                   true /* ignore failures */))
                        {
                            gsmMappingsByRange = op.Do();
                        }

                        if (gsmMappingsByRange.Result == StoreResult.ShardMapDoesNotExist)
                        {
                            // The shard was not properly attached.
                            // This is more than we can deal with in mapping resolution.
                            continue;
                        }
                    }
                    else
                    {
                        Debug.Assert(ssmLocal.MapType == ShardMapType.List);
                        using (IStoreOperationGlobal op = this.Manager.StoreOperationFactory.CreateFindMappingByKeyGlobalOperation(
                                   this.Manager,
                                   "DetectMappingDifferences",
                                   ssmLocal,
                                   min,
                                   CacheStoreMappingUpdatePolicy.OverwriteExisting,
                                   ShardManagementErrorCategory.Recovery,
                                   false,
                                   true /* ignore failures */))
                        {
                            gsmMappingsByRange = op.Do();

                            if (gsmMappingsByRange.Result == StoreResult.MappingNotFoundForKey ||
                                gsmMappingsByRange.Result == StoreResult.ShardMapDoesNotExist)
                            {
                                // * No intersections being found is fine. Skip to the next mapping.
                                // * The shard was not properly attached.
                                // This is more than we can deal with in mapping resolution.
                                continue;
                            }
                        }
                    }

                    foreach (IStoreMapping gsmMapping in gsmMappingsByRange.StoreMappings)
                    {
                        ShardKey retrievedMin = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MinValue);

                        ShardRange retrievedRange = null;

                        switch (ssmLocal.MapType)
                        {
                        case ShardMapType.Range:
                            ShardKey retrievedMax = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MaxValue);
                            retrievedRange = new ShardRange(retrievedMin, retrievedMax);
                            break;

                        default:
                            Debug.Assert(ssmLocal.MapType == ShardMapType.List);
                            retrievedMax   = ShardKey.FromRawValue(ssmLocal.KeyType, gsmMapping.MinValue).GetNextKey();
                            retrievedRange = new ShardRange(retrievedMin, retrievedMax);
                            break;
                        }

                        relevantGsmMappings[retrievedRange] = gsmMapping;
                    }
                }

                IList <MappingComparisonResult> comparisonResults = null;

                switch (ssmLocal.MapType)
                {
                case ShardMapType.Range:
                    comparisonResults = MappingComparisonUtils.CompareRangeMappings(
                        ssmLocal,
                        relevantGsmMappings.Values,
                        lsmMappings.StoreMappings);
                    break;

                default:
                    Debug.Assert(ssmLocal.MapType == ShardMapType.List);
                    comparisonResults = MappingComparisonUtils.ComparePointMappings(
                        ssmLocal,
                        relevantGsmMappings.Values,
                        lsmMappings.StoreMappings);
                    break;
                }

                // Now we have 2 sets of mappings. Each submapping generated from this function is
                //  1.) in the GSM only: report.
                //  2.) in the LSM only: report.
                //  3.) in both but with different version number: report.
                //  4.) in both with the same version number: skip.
                foreach (MappingComparisonResult r in comparisonResults)
                {
                    switch (r.MappingLocation)
                    {
                    case MappingLocation.MappingInShardMapOnly:
                    case MappingLocation.MappingInShardOnly:
                        break;

                    default:
                        Debug.Assert(r.MappingLocation == MappingLocation.MappingInShardMapAndShard);

                        if (r.ShardMapManagerMapping.Id == r.ShardMapping.Id)
                        {
                            // No conflict found, skip to the next range.
                            continue;
                        }
                        break;
                    }

                    // Store the inconsistency for later reporting.
                    this.Inconsistencies[token][r.Range] = new MappingDifference(
                        type: MappingDifferenceType.Range,
                        location: r.MappingLocation,
                        shardMap: r.ShardMap,
                        mappingForShard: r.ShardMapping,
                        mappingForShardMap: r.ShardMapManagerMapping);
                }
            }

            return(listOfTokens);
        }
 /// <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>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperationGlobal CreateReplaceMappingsGlobalOperation(
     ShardMapManager shardMapManager,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     IEnumerable<IStoreMapping> mappingsToRemove,
     IEnumerable<IStoreMapping> mappingsToAdd)
 {
     return new ReplaceMappingsGlobalOperation(
         shardMapManager,
         operationName,
         shardMap,
         shard,
         mappingsToRemove,
         mappingsToAdd);
 }
 /// <summary>
 /// Request to get all shard mappings from LSM for a particular shard map
 /// and optional shard and range.
 /// </summary>
 /// <param name="shardMap">Shard map whose mappings are being requested.</param>
 /// <param name="shard">Optional shard for which mappings are being requested.</param>
 /// <param name="range">Optional range for which mappings are being requested.</param>
 /// <returns>Xml formatted request.</returns>
 internal static XElement GetAllShardMappingsLocal(
     IStoreShardMap shardMap,
     IStoreShard shard,
     ShardRange range)
 {
     return new XElement(
         @"GetAllShardMappingsLocal",
         StoreOperationRequestBuilder.s_lsmVersion,
         StoreObjectFormatterXml.WriteIStoreShardMap("ShardMap", shardMap),
         StoreObjectFormatterXml.WriteIStoreShard("Shard", shard),
         StoreObjectFormatterXml.WriteShardRange(range));
 }
 /// <summary>
 /// Initializes a new instance
 /// </summary>
 public StubUpdateShardOperation(ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shardOld, IStoreShard shardNew)
     : base(shardMapManager, shardMap, shardOld, shardNew)
 {
     this.InitializeStub();
 }
        /// <summary>
        /// Asynchronously performs validation that the local representation is as
        /// up-to-date as the representation on the backing data store.
        /// </summary>
        /// <param name="conn">Connection used for validation.</param>
        /// <param name="manager">ShardMapManager reference.</param>
        /// <param name="shardMap">Shard map for the shard.</param>
        /// <param name="shard">Shard to validate.</param>
        /// <returns>A task to await validation completion</returns>
        internal static async Task ValidateShardAsync(
            SqlConnection conn,
            ShardMapManager manager,
            IStoreShardMap shardMap,
            IStoreShard shard
            )
        {
            Stopwatch stopwatch = Stopwatch.StartNew();

            SqlResults lsmResult = new SqlResults();

            XElement xeValidate = StoreOperationRequestBuilder.ValidateShardLocal(shardMap.Id, shard.Id, shard.Version);

            using (SqlCommand cmd = conn.CreateCommand())
                using (XmlReader input = xeValidate.CreateReader())
                {
                    cmd.CommandText = StoreOperationRequestBuilder.SpValidateShardLocal;
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlUtils.AddCommandParameter(
                        cmd,
                        "@input",
                        SqlDbType.Xml,
                        ParameterDirection.Input,
                        0,
                        new SqlXml(input));

                    SqlParameter resultParam = SqlUtils.AddCommandParameter(
                        cmd,
                        "@result",
                        SqlDbType.Int,
                        ParameterDirection.Output,
                        0,
                        0);

                    using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
                    {
                        await lsmResult.FetchAsync(reader);
                    }

                    // Output parameter will be used to specify the outcome.
                    lsmResult.Result = (StoreResult)resultParam.Value;
                }

            stopwatch.Stop();

            Tracer.TraceInfo(
                TraceSourceConstants.ComponentNames.Shard,
                "ValidateShardAsync",
                "Complete; Shard: {0}; Connection: {1}; Result: {2}; Duration: {3}",
                shard.Location,
                conn.ConnectionString,
                lsmResult.Result,
                stopwatch.Elapsed);

            if (lsmResult.Result != StoreResult.Success)
            {
                if (lsmResult.Result == StoreResult.ShardMapDoesNotExist)
                {
                    manager.Cache.DeleteShardMap(shardMap);
                }

                // Possible errors are:
                // StoreResult.ShardMapDoesNotExist
                // StoreResult.ShardDoesNotExist
                // StoreResult.ShardVersionMismatch
                // StoreResult.StoreVersionMismatch
                // StoreResult.MissingParametersForStoredProcedure
                throw StoreOperationErrorHandler.OnValidationErrorLocal(
                          lsmResult,
                          shardMap,
                          shard.Location,
                          "ValidateShardAsync",
                          StoreOperationRequestBuilder.SpValidateShardLocal);
            }
        }
 /// <summary>
 /// Initializes a new instance
 /// </summary>
 public StubAddShardOperation(ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard)
     : base(shardMapManager, shardMap, shard)
 {
     this.InitializeStub();
 }
 /// <summary>
 /// Initializes a new instance
 /// </summary>
 public StubAddShardOperation(ShardMapManager shardMapManager, IStoreShardMap shardMap, IStoreShard shard)
     : base(shardMapManager, shardMap, shard)
 {
     this.InitializeStub();
 }
 /// <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>
 public virtual IStoreOperationLocal CreateReplaceMappingsLocalOperation(
     ShardMapManager shardMapManager,
     ShardLocation location,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     IEnumerable<ShardRange> rangesToRemove,
     IEnumerable<IStoreMapping> mappingsToAdd)
 {
     return new ReplaceMappingsLocalOperation(
         shardMapManager,
         location,
         operationName,
         shardMap,
         shard,
         rangesToRemove,
         mappingsToAdd);
 }
Esempio n. 51
0
 internal NTimeFailingUpdateShardOperation(
     int failureCountMax,
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew) :
     base(shardMapManager, shardMap, shardOld, shardNew)
 {
     _failureCountMax = failureCountMax;
     _currentFailureCount = 0;
 }
 /// <summary>
 /// Request to update shard in given shard map in GSM.
 /// </summary>
 /// <param name="operationId">Operation Id</param>
 /// <param name="operationCode">Operation code.</param>
 /// <param name="undo">Whether this is an undo request.</param>
 /// <param name="shardMap">Shard map for which operation is being requested.</param>
 /// <param name="shardOld">Shard to update.</param>
 /// <param name="shardNew">Updated shard.</param>
 /// <returns>Xml formatted request.</returns>
 internal static XElement UpdateShardGlobal(
     Guid operationId,
     StoreOperationCode operationCode,
     bool undo,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew)
 {
     return new XElement(
         "BulkOperationShardsGlobal",
         StoreOperationRequestBuilder.OperationId(operationId),
         StoreOperationRequestBuilder.OperationCode(operationCode),
         StoreOperationRequestBuilder.Undo(undo),
         StoreOperationRequestBuilder.StepsCount(1),
         StoreOperationRequestBuilder.s_gsmVersion,
         StoreObjectFormatterXml.WriteIStoreShardMap("ShardMap", shardMap),
         new XElement("Steps",
             new XElement("Step",
                 StoreOperationRequestBuilder.StepKind(StoreOperationStepKind.Update),
                 new XAttribute("Id", 1),
                 StoreObjectFormatterXml.WriteIStoreShard("Shard", shardOld),
                 new XElement("Update",
                     StoreObjectFormatterXml.WriteIStoreShard("Shard", shardNew)))));
 }
 internal RemoveShardOperationFailAfterLocalTarget(
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shard)
     : base(shardMapManager,
     shardMap,
     shard)
 {
 }
        /// <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="shard">Shard object.</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 OnShardMapErrorGlobal(
            IStoreResults result,
            IStoreShardMap shardMap,
            IStoreShard shard,
            ShardManagementErrorCategory errorCategory,
            string operationName,
            string storedProcName)
        {
            switch (result.Result)
            {
                case StoreResult.ShardMapDoesNotExist:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardMapDoesNotExist,
                        Errors._Store_ShardMap_DoesNotExistGlobal,
                        shardMap.Name,
                        storedProcName,
                        operationName,
                        shard != null ? shard.Location.ToString() : "*");

                case StoreResult.ShardExists:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardAlreadyExists,
                        Errors._Store_Shard_AlreadyExistsGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardLocationExists:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardLocationAlreadyExists,
                        Errors._Store_Shard_LocationAlreadyExistsGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardDoesNotExist:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardDoesNotExist,
                        Errors._Store_Shard_DoesNotExistGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardVersionMismatch:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardVersionMismatch,
                        Errors._Store_Shard_VersionMismatchGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.ShardHasMappings:
                    return new ShardManagementException(
                        errorCategory,
                        ShardManagementErrorCode.ShardHasMappings,
                        Errors._Store_Shard_HasMappingsGlobal,
                        shard.Location,
                        shardMap.Name,
                        storedProcName,
                        operationName);

                case StoreResult.StoreVersionMismatch:
                case StoreResult.MissingParametersForStoredProcedure:
                default:
                    return StoreOperationErrorHandler.OnCommonErrorGlobal(
                        result,
                        operationName,
                        storedProcName);
            }
        }
 internal UpdateShardOperationFailAfterLocalTarget(
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shardOld,
     IStoreShard shardNew)
     : base(shardMapManager,
     shardMap,
     shardOld,
     shardNew)
 {
 }
        /// <summary>
        /// Asynchronously performs validation that the local representation is as 
        /// up-to-date as the representation on the backing data store.
        /// </summary>
        /// <param name="conn">Connection used for validation.</param>
        /// <param name="manager">ShardMapManager reference.</param>
        /// <param name="shardMap">Shard map for the shard.</param>
        /// <param name="shard">Shard to validate.</param>
        /// <returns>A task to await validation completion</returns>
        internal static async Task ValidateShardAsync(
            SqlConnection conn,
            ShardMapManager manager,
            IStoreShardMap shardMap,
            IStoreShard shard
            )
        {
            Stopwatch stopwatch = Stopwatch.StartNew();

            SqlResults lsmResult = new SqlResults();

            XElement xeValidate = StoreOperationRequestBuilder.ValidateShardLocal(shardMap.Id, shard.Id, shard.Version);

            using (SqlCommand cmd = conn.CreateCommand())
            using (XmlReader input = xeValidate.CreateReader())
            {
                cmd.CommandText = StoreOperationRequestBuilder.SpValidateShardLocal;
                cmd.CommandType = CommandType.StoredProcedure;

                SqlUtils.AddCommandParameter(
                    cmd,
                    "@input",
                    SqlDbType.Xml,
                    ParameterDirection.Input,
                    0,
                    new SqlXml(input));

                SqlParameter resultParam = SqlUtils.AddCommandParameter(
                    cmd,
                    "@result",
                    SqlDbType.Int,
                    ParameterDirection.Output,
                    0,
                    0);

                using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
                {
                    await lsmResult.FetchAsync(reader);
                }

                // Output parameter will be used to specify the outcome.
                lsmResult.Result = (StoreResult)resultParam.Value;
            }

            stopwatch.Stop();

            Tracer.TraceInfo(
                TraceSourceConstants.ComponentNames.Shard,
                "ValidateShardAsync",
                "Complete; Shard: {0}; Connection: {1}; Result: {2}; Duration: {3}",
                shard.Location,
                conn.ConnectionString,
                lsmResult.Result,
                stopwatch.Elapsed);

            if (lsmResult.Result != StoreResult.Success)
            {
                if (lsmResult.Result == StoreResult.ShardMapDoesNotExist)
                {
                    manager.Cache.DeleteShardMap(shardMap);
                }

                // Possible errors are:
                // StoreResult.ShardMapDoesNotExist
                // StoreResult.ShardDoesNotExist
                // StoreResult.ShardVersionMismatch
                // StoreResult.StoreVersionMismatch
                // StoreResult.MissingParametersForStoredProcedure
                throw StoreOperationErrorHandler.OnValidationErrorLocal(
                    lsmResult,
                    shardMap,
                    shard.Location,
                    "ValidateShardAsync",
                    StoreOperationRequestBuilder.SpValidateShardLocal);
            }
        }
 internal AddShardOperationFailAfterLocalSource(
     ShardMapManager shardMapManager,
     IStoreShardMap shardMap,
     IStoreShard shard)
     : base(shardMapManager,
     shardMap,
     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>
 /// <returns>The store operation.</returns>
 public virtual IStoreOperationGlobal CreateGetMappingsByRangeGlobalOperation(
     ShardMapManager shardMapManager,
     string operationName,
     IStoreShardMap shardMap,
     IStoreShard shard,
     ShardRange range,
     ShardManagementErrorCategory errorCategory,
     bool cacheResults,
     bool ignoreFailure)
 {
     return new GetMappingsByRangeGlobalOperation(
         shardMapManager,
         operationName,
         shardMap,
         shard,
         range,
         errorCategory,
         cacheResults,
         ignoreFailure);
 }