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())); } }
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()); } } }
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); }