public async Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change) { var filter = Builders <JobData> .Filter.And( Builders <JobData> .Filter.Eq(jd => jd.TenantId, tenantId), Builders <JobData> .Filter.Eq(jd => jd.JobId, jobId)); var update = Builders <JobData> .Update .Max(jd => jd.Status.LastIterationStartTime, change.LastIterationStartTime) .Max(jd => jd.Status.LastDequeueAttemptTime, change.LastDequeueAttemptTime) .Max(jd => jd.Status.LastProcessStartTime, change.LastProcessStartTime) .Max(jd => jd.Status.LastProcessFinishTime, change.LastProcessFinishTime) .Max(jd => jd.Status.LastHealthCheckTime, change.LastHealthCheckTime) .Inc(jd => jd.Status.ItemsProcessed, change.ItemsProcessedDelta) .Inc(jd => jd.Status.ItemsRequeued, change.ItemsRequeuedDelta) .Inc(jd => jd.Status.ItemsGeneratedForTargetQueue, change.ItemsGeneratedForTargetQueueDelta) .Inc(jd => jd.Status.ProcessingTimeTakenMillis, change.ProcessingTimeTakenMillisDelta) .Inc(jd => jd.Status.ItemsFailed, change.ItemsFailedDelta); if (change.LastFailTime.HasValue) { update = update.Max(jd => jd.Status.LastFailTime, change.LastFailTime.Value); } if (change.LastFailures != null && change.LastFailures.Length > 0) { update = update.PushEach(jd => jd.Status.LastFailures, change.LastFailures, -NumberOfFailuresToKeep); } await Mongo.Jobs.UpdateOneAsync(filter, update); }
private void FlushInternal() { Interlocked.Exchange(ref _lastFlushTicks, DateTime.UtcNow.Ticks); var lastFailTicks = LastFailTicks; var lastFailTime = lastFailTicks == 0 ? (DateTime?)null : new DateTime(lastFailTicks, DateTimeKind.Utc); var change = new JobStatusUpdateData { LastIterationStartTime = new DateTime(LastIterationStartedTicks, DateTimeKind.Utc), LastDequeueAttemptTime = new DateTime(LastDequeueAttemptTicks, DateTimeKind.Utc), LastProcessStartTime = new DateTime(LastProcessStartedTicks, DateTimeKind.Utc), LastProcessFinishTime = new DateTime(LastProcessFinishedTicks, DateTimeKind.Utc), LastHealthCheckTime = new DateTime(LastHealthCheckTicks, DateTimeKind.Utc), ItemsProcessedDelta = Interlocked.Exchange(ref _unflushedItemsProcessed, 0L), ProcessingTimeTakenMillisDelta = Interlocked.Exchange(ref _unflushedProcessingTimeTakenMillis, 0L), ItemsRequeuedDelta = Interlocked.Exchange(ref _unflushedItemsRequeued, 0L), ItemsGeneratedForTargetQueueDelta = Interlocked.Exchange(ref _unflushedItemsGeneratedForTargetQueue, 0L), ItemsFailedDelta = Interlocked.Exchange(ref _unflushedItemsFailed, 0L), LastFailTime = lastFailTime }; if (!_unflushedProcessingErrorMessages.IsEmpty) { var faults = new List <JobStatusErrorData>(); while (_unflushedProcessingErrorMessages.TryDequeue(out var message)) { faults.Add(new JobStatusErrorData { ErrorMessage = message, Timestamp = DateTime.UtcNow.Ticks }); } if (faults.Count > 0) { change.LastFailures = faults.ToArray(); } } try { _jobStore.UpdateStatus(_tenantId, _jobId, change).GetAwaiter().GetResult(); } catch (Exception e) { Log.Error($"Job runner {_jobId} - Could not flush statistics due to exception", e); } }
public async Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change) { var job = await Load(tenantId, jobId); job.Status.LastIterationStartTime = job.Status.LastIterationStartTime > change.LastIterationStartTime ? job.Status.LastIterationStartTime : change.LastIterationStartTime; job.Status.LastDequeueAttemptTime = job.Status.LastDequeueAttemptTime > change.LastDequeueAttemptTime ? job.Status.LastDequeueAttemptTime : change.LastDequeueAttemptTime; job.Status.LastProcessStartTime = job.Status.LastProcessStartTime > change.LastProcessStartTime ? job.Status.LastProcessStartTime : change.LastProcessStartTime; job.Status.LastProcessFinishTime = job.Status.LastProcessFinishTime > change.LastProcessFinishTime ? job.Status.LastProcessFinishTime : change.LastProcessFinishTime; job.Status.LastHealthCheckTime = job.Status.LastHealthCheckTime > change.LastHealthCheckTime ? job.Status.LastHealthCheckTime : change.LastHealthCheckTime; job.Status.ItemsProcessed += change.ItemsProcessedDelta; job.Status.ItemsRequeued += change.ItemsRequeuedDelta; job.Status.ItemsGeneratedForTargetQueue += change.ItemsGeneratedForTargetQueueDelta; job.Status.ProcessingTimeTakenMillis += change.ProcessingTimeTakenMillisDelta; job.Status.ItemsFailed += change.ItemsFailedDelta; if (change.LastFailTime.HasValue) { job.Status.LastFailTime = job.Status.LastFailTime > change.LastFailTime ? job.Status.LastFailTime : change.LastFailTime.Value; } if (change.LastFailures != null && change.LastFailures.Length > 0) { foreach (var jobStatusErrorData in change.LastFailures) { job.Status.LastFailures.Append(jobStatusErrorData); } } }
public Task UpdateStatus(string tenantId, string jobId, JobStatusUpdateData change) { throw new NotImplementedException(); }