Example #1
0
 public void TaskFinished([NotNull] string taskId, TaskQueueReason taskQueueReason, bool taskIsBeingTraced, LocalTaskProcessingResult result)
 {
     lock (lockObject)
         hashtable.Remove(taskId);
     localQueueTaskCounter.Decrement(taskQueueReason);
     metricsContext.Meter("TaskIsFinished").Mark();
     if (taskIsBeingTraced)
     {
         InfrastructureTaskTraceContext.Finish();
         RemoteTaskHandlingTraceContext.Finish(result, rtqInternals.GlobalTime.UpdateNowTimestamp().Ticks);
     }
 }
Example #2
0
        public void RunJobIteration()
        {
            var toTicks = Timestamp.Now.Ticks;

            TaskIndexRecord[] taskIndexRecords;
            using (metricsContext.Timer("GetIndexRecords").NewContext())
                taskIndexRecords = handleTasksMetaStorage.GetIndexRecords(toTicks, allTaskIndexShardKeysToRead);
            logger.Info("Number of live minimalStartTicksIndex records for topic '{RtqTaskTopic}': {RecordsCount}",
                        new { RtqTaskTopic = taskTopic, RecordsCount = taskIndexRecords.Length });
            foreach (var taskIndexRecordsBatch in taskIndexRecords.Batch(maxRunningTasksCount, Enumerable.ToArray))
            {
                var taskIds = taskIndexRecordsBatch.Select(x => x.TaskId).ToArray();
                Dictionary <string, TaskMetaInformation> taskMetas;
                using (metricsContext.Timer("GetMetas").NewContext())
                    taskMetas = handleTasksMetaStorage.GetMetas(taskIds);
                foreach (var taskIndexRecord in taskIndexRecordsBatch)
                {
                    if (taskMetas.TryGetValue(taskIndexRecord.TaskId, out var taskMeta) && taskMeta.Id != taskIndexRecord.TaskId)
                    {
                        throw new InvalidOperationException($"taskIndexRecord.TaskId ({taskIndexRecord.TaskId}) != taskMeta.TaskId ({taskMeta.Id})");
                    }
                    using (var taskTraceContext = new RemoteTaskHandlingTraceContext(taskMeta))
                    {
                        LocalTaskQueueingResult result;
                        using (metricsContext.Timer("TryQueueTask").NewContext())
                            result = localTaskQueue.TryQueueTask(taskIndexRecord, taskMeta, TaskQueueReason.PullFromQueue, taskTraceContext.TaskIsBeingTraced);
                        taskTraceContext.Finish(result.TaskIsSentToThreadPool, () => globalTime.UpdateNowTimestamp().Ticks);
                        if (result.QueueIsFull)
                        {
                            metricsContext.Meter("QueueIsFull").Mark();
                            return;
                        }
                        if (result.QueueIsStopped)
                        {
                            metricsContext.Meter("QueueIsStopped").Mark();
                            return;
                        }
                    }
                }
            }
        }