public void RemoveRecord([NotNull] TaskIndexRecord taskIndexRecord, long timestamp)
        {
            var rowKey     = CassandraNameHelper.GetRowKey(taskIndexRecord.TaskIndexShardKey, taskIndexRecord.MinimalStartTicks);
            var columnName = CassandraNameHelper.GetColumnName(taskIndexRecord.MinimalStartTicks, taskIndexRecord.TaskId);

            RetrieveColumnFamilyConnection().DeleteColumn(rowKey, columnName, timestamp);
        }
Exemplo n.º 2
0
        public TaskIndexRecord AddMeta([NotNull] TaskMetaInformation taskMeta, [CanBeNull] TaskIndexRecord oldTaskIndexRecord)
        {
            var metricsContext = MetricsContext.For(taskMeta).SubContext("HandleTasksMetaStorage.AddMeta");
            var globalNowTicks = globalTime.UpdateNowTimestamp().Ticks;
            var nowTicks       = Math.Max((taskMeta.LastModificationTicks ?? 0) + PreciseTimestampGenerator.TicksPerMicrosecond, globalNowTicks);

            taskMeta.LastModificationTicks = nowTicks;
            using (metricsContext.Timer("EventLogRepository_AddEvent").NewContext())
                eventLogRepository.AddEvent(taskMeta, eventTimestamp: new Timestamp(nowTicks), eventId: Guid.NewGuid());
            var newIndexRecord = FormatIndexRecord(taskMeta);

            using (metricsContext.Timer("MinimalStartTicksIndex_AddRecord").NewContext())
                minimalStartTicksIndex.AddRecord(newIndexRecord, globalNowTicks, taskMeta.GetTtl());
            if (taskMeta.State == TaskState.New)
            {
                using (metricsContext.Timer("ChildTaskIndex_WriteIndexRecord").NewContext())
                    childTaskIndex.WriteIndexRecord(taskMeta, globalNowTicks);
            }
            using (metricsContext.Timer("TaskMetaStorage_Write").NewContext())
                taskMetaStorage.Write(taskMeta, globalNowTicks);
            if (oldTaskIndexRecord != null)
            {
                using (metricsContext.Timer("MinimalStartTicksIndex_RemoveRecord").NewContext())
                    minimalStartTicksIndex.RemoveRecord(oldTaskIndexRecord, globalNowTicks);
            }
            return(newIndexRecord);
        }
Exemplo n.º 3
0
 public LocalTaskQueueingResult TryQueueTask([NotNull] TaskIndexRecord taskIndexRecord, [CanBeNull] TaskMetaInformation taskMeta, TaskQueueReason taskQueueReason, bool taskIsBeingTraced)
 {
     using (var infrastructureTraceContext = new InfrastructureTaskTraceContext(taskIsBeingTraced))
     {
         var result = DoTryQueueTask(taskIndexRecord, taskMeta, taskQueueReason, taskIsBeingTraced);
         infrastructureTraceContext.Finish(result.TaskIsSentToThreadPool);
         return(result);
     }
 }
        private void DoWriteRecord([NotNull] TaskIndexRecord taskIndexRecord, long timestamp, TimeSpan?ttl)
        {
            var rowKey     = CassandraNameHelper.GetRowKey(taskIndexRecord.TaskIndexShardKey, taskIndexRecord.MinimalStartTicks);
            var columnName = CassandraNameHelper.GetColumnName(taskIndexRecord.MinimalStartTicks, taskIndexRecord.TaskId);

            RetrieveColumnFamilyConnection().AddColumn(rowKey, new Column
            {
                Name      = columnName,
                Timestamp = timestamp,
                Value     = serializer.Serialize(taskIndexRecord.TaskId),
                TTL       = ttl.HasValue ? (int)ttl.Value.TotalSeconds : (int?)null,
            });
        }
Exemplo n.º 5
0
        private LocalTaskQueueingResult DoTryQueueTask([NotNull] TaskIndexRecord taskIndexRecord, [CanBeNull] TaskMetaInformation taskMeta, TaskQueueReason taskQueueReason, bool taskIsBeingTraced)
        {
            var taskIsSentToThreadPool = false;

            if (taskMeta != null && !taskHandlerRegistry.ContainsHandlerFor(taskMeta.Name))
            {
                return(LocalTaskQueueingResult.TaskIsSkippedResult);
            }
            if (taskMeta == null && taskIndexRecord.MinimalStartTicks > (Timestamp.Now - HandlerTask.MaxAllowedIndexInconsistencyDuration).Ticks)
            {
                logger.Debug("Мета для задачи TaskId = {RtqTaskId} еще не записана, ждем {MaxAllowedIndexInconsistencyDuration}",
                             new { HandlerTask.MaxAllowedIndexInconsistencyDuration, RtqTaskId = taskIndexRecord.TaskId });
                return(LocalTaskQueueingResult.TaskIsSkippedResult);
            }
            if (!localQueueTaskCounter.TryIncrement(taskQueueReason))
            {
                return(LocalTaskQueueingResult.QueueIsFullResult);
            }
            try
            {
                var handlerTask = new HandlerTask(taskIndexRecord, taskQueueReason, taskMeta, taskHandlerRegistry, rtqInternals);
                lock (lockObject)
                {
                    if (stopped)
                    {
                        return(LocalTaskQueueingResult.QueueIsStoppedResult);
                    }
                    if (hashtable.ContainsKey(taskIndexRecord.TaskId))
                    {
                        return(LocalTaskQueueingResult.TaskIsSkippedResult);
                    }
                    var taskWrapper = new TaskWrapper(taskIndexRecord.TaskId, taskQueueReason, taskIsBeingTraced, handlerTask, this, logger);
                    var asyncTask   = Task.Factory.StartNew(taskWrapper.Run);
                    taskIsSentToThreadPool = true;
                    metricsContext.Meter("TaskIsSentToThreadPool").Mark();
                    if (!taskWrapper.Finished)
                    {
                        hashtable.Add(taskIndexRecord.TaskId, asyncTask);
                    }
                }
            }
            finally
            {
                if (!taskIsSentToThreadPool)
                {
                    localQueueTaskCounter.Decrement(taskQueueReason);
                }
            }
            return(LocalTaskQueueingResult.SuccessResult);
        }
Exemplo n.º 6
0
 public HandlerTask(
     [NotNull] TaskIndexRecord taskIndexRecord,
     TaskQueueReason reason,
     [CanBeNull] TaskMetaInformation taskMeta,
     IRtqTaskHandlerRegistry taskHandlerRegistry,
     IRtqInternals rtqInternals)
 {
     this.taskIndexRecord     = taskIndexRecord;
     this.reason              = reason;
     this.taskMeta            = taskMeta;
     this.taskHandlerRegistry = taskHandlerRegistry;
     serializer                 = rtqInternals.Serializer;
     taskProducer               = rtqInternals.TaskProducer;
     handleTaskCollection       = rtqInternals.HandleTaskCollection;
     remoteLockCreator          = rtqInternals.RemoteLockCreator;
     taskExceptionInfoStorage   = rtqInternals.TaskExceptionInfoStorage;
     handleTasksMetaStorage     = rtqInternals.HandleTasksMetaStorage;
     taskMinimalStartTicksIndex = rtqInternals.TaskMinimalStartTicksIndex;
     rtqProfiler                = rtqInternals.Profiler;
     globalTime                 = rtqInternals.GlobalTime;
     taskTtl = rtqInternals.TaskTtl;
     logger  = rtqInternals.Logger.ForContext(nameof(HandlerTask));
     taskShardMetricsContext = MetricsContext.For($"Shards.{taskIndexRecord.TaskIndexShardKey.TaskTopic}.{taskIndexRecord.TaskIndexShardKey.TaskState}.Tasks");
 }
 public void WriteRecord([NotNull] TaskIndexRecord taskIndexRecord, long timestamp, TimeSpan?ttl)
 {
     DoWriteRecord(taskIndexRecord, timestamp, ttl);
 }
 public void AddRecord([NotNull] TaskIndexRecord taskIndexRecord, long timestamp, TimeSpan?ttl)
 {
     oldestLiveRecordTicksHolder.MoveMarkerBackwardIfNecessary(taskIndexRecord.TaskIndexShardKey, taskIndexRecord.MinimalStartTicks);
     DoWriteRecord(taskIndexRecord, timestamp, ttl);
 }
Exemplo n.º 9
0
        private TaskMetaInformation TryUpdateTaskState([NotNull] TaskMetaInformation oldMeta, [NotNull] TaskIndexRecord oldTaskIndexRecord, long newMinimalStartTicks, long?startExecutingTicks, long?finishExecutingTicks, int attempts, TaskState newState, [CanBeNull] List <TimeGuid> newExceptionInfoIds)
        {
            var newMeta = allFieldsSerializer.Copy(oldMeta);

            if (newState == oldMeta.State)
            {
                newMinimalStartTicks = Math.Max(newMinimalStartTicks, oldMeta.MinimalStartTicks + PreciseTimestampGenerator.TicksPerMicrosecond);
            }
            newMeta.MinimalStartTicks    = newMinimalStartTicks;
            newMeta.StartExecutingTicks  = startExecutingTicks;
            newMeta.FinishExecutingTicks = finishExecutingTicks;
            newMeta.Attempts             = attempts;
            newMeta.State = newState;
            if (newExceptionInfoIds != null && newExceptionInfoIds.Any())
            {
                newMeta.TaskExceptionInfoIds = newExceptionInfoIds;
            }
            try
            {
                handleTasksMetaStorage.AddMeta(newMeta, oldTaskIndexRecord);
                logger.Debug("Changed task state. NewMeta: {RtqTaskMeta}", new { RtqTaskMeta = newMeta });
                return(newMeta);
            }
            catch (Exception e)
            {
                logger.Error(e, "Can't update task state. OldMeta: {RtqTaskMeta}", new { RtqTaskMeta = oldMeta });
                return(null);
            }
        }