예제 #1
0
        async Task VolatileLogicalTimeManager.ISnapshotHandler.OnSnapshotAsync(TimeSpan currentLogicalTime)
        {
            var logicalTimedata = new LogicalTimestamp(currentLogicalTime);
            var data            = LogicalTimestampSerializer.Serialize(logicalTimedata);

            try
            {
                using (var tx = this.stateManager.CreateTransaction())
                {
                    await this.logicalTimeDictionary.AddOrUpdateAsync(tx, LogicalTimestampKey, data, (k, v) => data);

                    await tx.CommitAsync();
                }
            }
            catch (FabricException)
            {
                // Ignore any fabric exception.
            }
            catch (Exception ex)
            {
                ActorTrace.Source.WriteErrorWithId(
                    TraceType,
                    this.traceId,
                    string.Format("OnSnapshotAsync() unexpected exception: {0}.", ex.ToString()));
            }
        }
예제 #2
0
        internal static byte[] Serialize(LogicalTimestamp logicalTimestamp)
        {
            var dataSizeInBytes = ComputeSizeInBytes(logicalTimestamp);

            using (var stream = new MemoryStream(dataSizeInBytes))
            {
                using (var writer = new BinaryWriter(stream, DataEncoding))
                {
                    writer.Write(CurrentDataVersion);

                    if (logicalTimestamp == null)
                    {
                        writer.WriteNullPrefixByte();
                    }
                    else
                    {
                        writer.WriteNotNullPrefixByte();
                        writer.Write(logicalTimestamp.Timestamp);
                    }

                    writer.Flush();
                    return(stream.GetBuffer());
                }
            }
        }
예제 #3
0
        private static int ComputeSizeInBytes(LogicalTimestamp logicalTimestamp)
        {
            int size = sizeof(ushort); // Data version

            size += sizeof(byte);      // Null value indicator prefix

            if (logicalTimestamp != null)
            {
                size += sizeof(long); // TimSpan
            }

            return(size);
        }