public bool TryAddNewExceptionInfo([NotNull] TaskMetaInformation taskMeta, [NotNull] Exception exception, out List <TimeGuid> newExceptionInfoIds) { if (!taskMeta.IsTimeBased()) { throw new InvalidOperationException(string.Format("TaskMeta is not time-based: {0}", taskMeta)); } newExceptionInfoIds = null; var newExceptionInfo = new TaskExceptionInfo(exception); var lastExceptionInfo = TryGetLastExceptionInfo(taskMeta); if (lastExceptionInfo != null && lastExceptionInfo.ExceptionMessageInfo == newExceptionInfo.ExceptionMessageInfo) { return(false); } var newExceptionInfoId = TimeGuid.NowGuid(); var timestamp = newExceptionInfoId.GetTimestamp().Ticks; TimeGuid oldExceptionInfoId; newExceptionInfoIds = taskMeta.AddExceptionInfoId(newExceptionInfoId, out oldExceptionInfoId); var newExceptionInfoBytes = serializer.Serialize(newExceptionInfo); timeBasedBlobStorage.Write(taskMeta.Id, newExceptionInfoId, newExceptionInfoBytes, timestamp, taskMeta.GetTtl()); if (oldExceptionInfoId != null) { timeBasedBlobStorage.Delete(taskMeta.Id, oldExceptionInfoId, timestamp); } return(true); }
public void ExceptionInfoIdsLimit() { Assert.That(TaskMetaInformation.TaskExceptionIfoIdsLimit, Is.EqualTo(201)); var meta = new TaskMetaInformation("TaskName", Guid.NewGuid().ToString()); List <TimeGuid> newExceptionInfoIds; TimeGuid newExceptionInfoId, oldExceptionInfoId; for (ushort i = 0; i < 201; i++) { newExceptionInfoId = NewExceptionInfoId(i); newExceptionInfoIds = meta.AddExceptionInfoId(newExceptionInfoId, out oldExceptionInfoId); Assert.That(oldExceptionInfoId, Is.Null); Assert.That(newExceptionInfoIds.Select(x => (int)x.GetClockSequence()).ToArray(), Is.EqualTo(Enumerable.Range(0, i + 1).ToArray())); meta.TaskExceptionInfoIds = newExceptionInfoIds; } newExceptionInfoId = NewExceptionInfoId(999); newExceptionInfoIds = meta.AddExceptionInfoId(newExceptionInfoId, out oldExceptionInfoId); Assert.That(oldExceptionInfoId.GetClockSequence(), Is.EqualTo(100)); Assert.That(newExceptionInfoIds.Select(x => (int)x.GetClockSequence()).ToArray(), Is.EqualTo(Enumerable.Range(0, 100).Concat(Enumerable.Range(101, 100)).Concat(new[] { 999 }).ToArray())); }