public void Delete([NotNull] TaskMetaInformation taskMeta)
        {
            if (!taskMeta.IsTimeBased())
            {
                throw new InvalidOperationException(string.Format("TaskMeta is not time-based: {0}", taskMeta));
            }
            var timestamp = Timestamp.Now.Ticks;

            foreach (var blobId in taskMeta.GetTaskExceptionInfoIds())
            {
                timeBasedBlobStorage.Delete(taskMeta.Id, blobId, timestamp);
            }
        }
        public void ProlongExceptionInfosTtl([NotNull] TaskMetaInformation taskMeta)
        {
            if (!taskMeta.IsTimeBased())
            {
                throw new InvalidOperationException(string.Format("TaskMeta is not time-based: {0}", taskMeta));
            }
            var oldExceptionInfos = timeBasedBlobStorage.Read(taskMeta.Id, taskMeta.GetTaskExceptionInfoIds().ToArray());
            var timestamp         = Timestamp.Now.Ticks;

            foreach (var exceptionInfo in oldExceptionInfos)
            {
                timeBasedBlobStorage.Write(taskMeta.Id, exceptionInfo.Key, exceptionInfo.Value, timestamp, taskMeta.GetTtl());
            }
        }
        private TaskExceptionInfo TryGetLastExceptionInfo([NotNull] TaskMetaInformation taskMeta)
        {
            if (!taskMeta.IsTimeBased())
            {
                throw new InvalidOperationException(string.Format("TaskMeta is not time-based: {0}", taskMeta));
            }
            var lastExceptionInfoId = taskMeta.GetTaskExceptionInfoIds().LastOrDefault();

            if (lastExceptionInfoId == null)
            {
                return(null);
            }
            var lastExceptionInfoBytes = timeBasedBlobStorage.Read(taskMeta.Id, lastExceptionInfoId);

            if (lastExceptionInfoBytes == null)
            {
                return(null);
            }
            return(serializer.Deserialize <TaskExceptionInfo>(lastExceptionInfoBytes));
        }