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