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