コード例 #1
0
        /// <summary>
        /// Gets operation data from state providers.
        /// </summary>
        public async Task <OperationData> GetNextAsync(CancellationToken cancellationToken)
        {
            try
            {
                while (this.currentIndex < this.operationDataStreamCollection.Count)
                {
                    StateProviderIdentifier stateProviderIdentifier = this.operationDataStreamCollection[this.currentIndex].Item1;
                    IOperationDataStream    operationDataStream     = this.operationDataStreamCollection[this.currentIndex].Item2;

                    OperationData operationData = await operationDataStream.GetNextAsync(cancellationToken).ConfigureAwait(false);

                    if (operationData == null)
                    {
                        ++this.currentIndex;
                        continue;
                    }

                    // Reserve the List space with expected size: Version, ID, OperationData
                    List <ArraySegment <byte> > namedBytes = new List <ArraySegment <byte> >(2 + operationData.Count);
                    byte[] versionAsBytes = BitConverter.GetBytes(this.version);
                    namedBytes.Add(new ArraySegment <byte>(versionAsBytes));

                    long   stateProviderId = stateProviderIdentifier.StateProviderId;
                    byte[] idAsBytes       = BitConverter.GetBytes(stateProviderId);
                    namedBytes.Add(new ArraySegment <byte>(idAsBytes));

                    foreach (ArraySegment <byte> roll in operationData)
                    {
                        namedBytes.Add(roll);
                    }

                    return(new OperationData(namedBytes));
                }

                FabricEvents.Events.NamedOperationDataCollectionGetNext(this.traceType);

                return(null);
            }
            catch (Exception e)
            {
                string msg = string.Format(
                    CultureInfo.InvariantCulture,
                    "OperationDataStreamCollection Count: {0}, CurrentIndex: {1}.",
                    this.operationDataStreamCollection.Count,
                    this.currentIndex);
                StateManagerStructuredEvents.TraceException(
                    this.traceType,
                    "NamedOperationDataCollection.GetNextAsync.",
                    msg,
                    e);
                throw;
            }
        }
コード例 #2
0
 public static void SerializeRedoData(
     ReplicationMetadata replicationMetadata,
     string traceType,
     InMemoryBinaryWriter writer)
 {
     try
     {
         writer.Write(replicationMetadata.Type);
         writer.WriteNullable(replicationMetadata.InitializationContext);
         writer.Write(replicationMetadata.ParentStateProviderId);
     }
     catch (Exception e)
     {
         StateManagerStructuredEvents.TraceException(traceType, "ReplicationMetadata.Serialize", string.Empty, e);
         throw;
     }
 }
コード例 #3
0
 /// <summary>
 /// Serializes replication metadata.
 /// </summary>
 public static void SerializeMetaData(
     ReplicationMetadata replicationMetadata,
     string traceType,
     InMemoryBinaryWriter writer)
 {
     try
     {
         writer.Write(replicationMetadata.Version);
         writer.Write(replicationMetadata.StateProviderId);
         writer.Write(replicationMetadata.Name);
         writer.Write((byte)replicationMetadata.StateManagerApplyType);
     }
     catch (Exception e)
     {
         StateManagerStructuredEvents.TraceException(traceType, "ReplicationMetadata.Serialize", string.Empty, e);
         throw;
     }
 }
コード例 #4
0
        /// <summary>
        /// Deserializes replication metadata.
        /// </summary>
        public static void DeserializeMetadataForUndoOperation(
            InMemoryBinaryReader metaDataReader,
            string traceType,
            int currentVersion,
            out long stateProviderId,
            out Uri stateProviderName,
            out StateManagerApplyType applyType)
        {
            try
            {
                // Read meta data.
                int version;
                DeserializeMetadata(
                    metaDataReader,
                    traceType,
                    currentVersion,
                    out stateProviderId,
                    out stateProviderName,
                    out applyType,
                    out version);

                Utility.Assert(applyType != StateManagerApplyType.Invalid, "Invalid apply type");
                if (applyType == StateManagerApplyType.Delete)
                {
                    applyType = StateManagerApplyType.Insert;
                }
                else
                {
                    applyType = StateManagerApplyType.Delete;
                }
            }
            catch (Exception e)
            {
                StateManagerStructuredEvents.TraceException(
                    traceType,
                    "ReplicationMetadata.Deserialize",
                    string.Empty,
                    e);
                throw;
            }
        }
コード例 #5
0
        /// <summary>
        /// Gets named operation data from operation data.
        /// </summary>
        public static NamedOperationData Deserialize(
            OperationData operationData,
            string traceType,
            int currentVersion)
        {
            try
            {
                List <ArraySegment <byte> > copiedBytes = new List <ArraySegment <byte> >();

                int deserializedVersion = BitConverter.ToInt32(operationData[0].Array, 0);
                if (deserializedVersion != currentVersion)
                {
                    string errorMessage = string.Format(
                        CultureInfo.InvariantCulture,
                        SR.Error_Unsupported_Version_Deserialization,
                        deserializedVersion,
                        currentVersion);
                    FabricEvents.Events.NamedOperationDataDeserializeError(traceType, errorMessage);
                    throw new NotSupportedException(errorMessage);
                }

                // state provider id
                long stateProviderId = BitConverter.ToInt64(operationData[1].Array, 0);

                for (int i = 2; i < operationData.Count; i++)
                {
                    copiedBytes.Add(operationData[i]);
                }

                return(new NamedOperationData(new OperationData(copiedBytes), stateProviderId, traceType));
            }
            catch (Exception e)
            {
                StateManagerStructuredEvents.TraceException(
                    traceType,
                    "NamedOperationData.Deserialize",
                    string.Empty,
                    e);
                throw;
            }
        }
コード例 #6
0
        /// <summary>
        /// Deserializes replication metadata.
        /// </summary>
        private static void DeserializeMetadata(
            InMemoryBinaryReader metaDataReader,
            string traceType,
            int currentVersion,
            out long stateProviderId,
            out Uri stateProviderName,
            out StateManagerApplyType applyType,
            out int version)
        {
            try
            {
                version = metaDataReader.ReadInt32();
                if (version != currentVersion)
                {
                    var errorMessage = string.Format(
                        CultureInfo.InvariantCulture,
                        SR.Error_Unsupported_Version_Deserialization,
                        version,
                        currentVersion);
                    FabricEvents.Events.ReplicationMetadataDeserializeError(traceType, errorMessage);
                    throw new NotSupportedException(errorMessage);
                }

                stateProviderId   = metaDataReader.ReadInt64();
                stateProviderName = metaDataReader.ReadUri();
                applyType         = (StateManagerApplyType)metaDataReader.ReadByte();
                Utility.Assert(applyType != StateManagerApplyType.Invalid, "Invalid apply type");
            }
            catch (Exception e)
            {
                StateManagerStructuredEvents.TraceException(
                    traceType,
                    "ReplicationMetadata.Deserialize",
                    string.Empty,
                    e);
                throw;
            }
        }
コード例 #7
0
        /// <summary>
        /// Deserializes replication metadata and the redodata.
        /// </summary>
        public static ReplicationMetadata Deserialize(
            InMemoryBinaryReader metaDataReader,
            InMemoryBinaryReader redoDataReader,
            string traceType,
            int currentVersion)
        {
            try
            {
                // Read meta data first
                long stateProviderId;
                Uri  name;
                StateManagerApplyType operationType;
                int version;

                DeserializeMetadata(
                    metaDataReader,
                    traceType,
                    currentVersion,
                    out stateProviderId,
                    out name,
                    out operationType,
                    out version);

                if (redoDataReader == null)
                {
                    return(new ReplicationMetadata(
                               name,
                               stateProviderId,
                               DynamicStateManager.StateManagerId,
                               version,
                               operationType));
                }

                // Read Data Next
                string typeName;
                Type   type = redoDataReader.ReadType(out typeName);
                Utility.Assert(type != null, SR.Assert_SM_TypeNotFound, traceType, typeName, name.ToString());

                byte[] initializationParameters = redoDataReader.ReadNullableBytes();
                long   parentStateProviderId    = redoDataReader.ReadInt64();

                // Since this is used in redo only scenarios, it is safe to assuem apply type is same as the original opeartion type.
                ReplicationMetadata replicationMetadata = new ReplicationMetadata(
                    name,
                    type,
                    initializationParameters,
                    stateProviderId,
                    parentStateProviderId,
                    version,
                    operationType);

                return(replicationMetadata);
            }
            catch (Exception e)
            {
                StateManagerStructuredEvents.TraceException(
                    traceType,
                    "ReplicationMetadata.Deserialize",
                    string.Empty,
                    e);
                throw;
            }
        }