protected override void PerformPickupAccounting(RequestStatus status, JobPickupRec jobPickupRec) { switch (status) { case RequestStatus.Queued: if (jobPickupRec.PickupResult != JobPickupResult.CompletedJobCleanedUp && jobPickupRec.PickupResult != JobPickupResult.CompletedJobSkipped && jobPickupRec.PickupResult != JobPickupResult.InvalidJob) { this.QueuedJobsCount++; return; } break; case RequestStatus.InProgress: if (jobPickupRec.PickupResult == JobPickupResult.JobPickedUp || jobPickupRec.PickupResult == JobPickupResult.JobAlreadyActive) { this.InProgressJobsCount++; } if (jobPickupRec.PickupResult == JobPickupResult.JobIsPostponed) { this.QueuedJobsCount++; } break; default: return; } }
protected override void ProcessPickupResults(JobPickupRec jobPickupRec) { this.ScanResults.Add(jobPickupRec); if (jobPickupRec.NextRecommendedPickup < this.RecommendedNextScan) { this.RecommendedNextScan = jobPickupRec.NextRecommendedPickup; } }
public void ProcessJobsInBatches(Restriction restriction, bool applyManualSort, SortOrder sort, MapiTable contentsTable, MapiStore systemMbx, Func <MoveJob, bool> stoppingCondition) { List <MoveJob> allMoveJobs = SystemMailboxJobs.GetAllMoveJobs(restriction, sort, contentsTable, this.MdbGuid, stoppingCondition); if (allMoveJobs != null) { if (applyManualSort) { allMoveJobs.Sort(); } MrsTracer.Throttling.Debug("Sorted jobs for Mdb: {0}", new object[] { this.MdbGuid }); SystemMailboxJobs.TraceJobs(allMoveJobs); using (List <MoveJob> .Enumerator enumerator = allMoveJobs.GetEnumerator()) { while (enumerator.MoveNext()) { MoveJob moveJob = enumerator.Current; try { using (SettingsContextBase.ActivateContext(moveJob)) { JobPickupRec pickupResult = null; CommonUtils.CatchKnownExceptions(delegate { pickupResult = moveJob.AttemptToPick(systemMbx); this.PerformPickupAccounting(moveJob.Status, pickupResult); }, delegate(Exception failure) { LocalizedString localizedString = CommonUtils.FullExceptionMessage(failure); pickupResult = new JobPickupRec(moveJob, JobPickupResult.PickupFailure, DateTime.UtcNow + MoveJob.JobPickupRetryInterval, localizedString, null); MrsTracer.Service.Error("Unexpected failure occurred trying to pick up MoveJob '{0}' from database '{1}', skipping it. {2}", new object[] { moveJob.RequestGuid, this.MdbGuid, localizedString }); MailboxReplicationService.LogEvent(MRSEventLogConstants.Tuple_UnableToProcessRequest, new object[] { moveJob.RequestGuid.ToString(), this.MdbGuid.ToString(), localizedString }); }); this.ProcessPickupResults(pickupResult); } } catch (Exception exception) { BaseJob.PerformCrashingFailureActions(moveJob.IdentifyingGuid, moveJob.RequestGuid, exception, RequestState.None, SyncStage.None); throw; } } } } }
public static LocalizedString GetJobPickupFailureMessageForRequest(Guid requestGuid) { LocalizedString result = LocalizedString.Empty; List <Guid> list = MRSQueue.GetQueues(); if (!list.IsNullOrEmpty()) { foreach (Guid mdbGuid in list) { MRSQueue mrsqueue = MRSQueue.Get(mdbGuid); List <JobPickupRec> lastScanResults = mrsqueue.LastScanResults; if (!lastScanResults.IsNullOrEmpty()) { JobPickupRec jobPickupRec = lastScanResults.Find((JobPickupRec x) => x.RequestGuid == requestGuid); if (jobPickupRec != null) { result = jobPickupRec.GetPickupFailureMessage(); break; } } } } return(result); }
protected abstract void ProcessPickupResults(JobPickupRec jobPickupRec);
protected abstract void PerformPickupAccounting(RequestStatus status, JobPickupRec jobPickupRec);
public JobPickupRec AttemptToPick(MapiStore systemMailbox) { if (!RequestJobXML.IsKnownRequestType(this.RequestType)) { return(new JobPickupRec(this, JobPickupResult.UnknownJobType, DateTime.MaxValue, MrsStrings.PickupStatusRequestTypeNotSupported(this.RequestType.ToString()), null)); } if (!RequestJobXML.IsKnownJobType(this.JobType)) { return(new JobPickupRec(this, JobPickupResult.UnknownJobType, DateTime.MaxValue, MrsStrings.PickupStatusJobTypeNotSupported(this.JobType.ToString()), null)); } if (this.PoisonCount >= ConfigBase <MRSConfigSchema> .GetConfig <int>("HardPoisonLimit")) { return(new JobPickupRec(this, JobPickupResult.PoisonedJob, DateTime.MaxValue, MrsStrings.PickupStatusJobPoisoned(this.PoisonCount), null)); } if (this.IsActiveOnThisMRSInstance) { return(new JobPickupRec(this, JobPickupResult.JobAlreadyActive, DateTime.MaxValue, LocalizedString.Empty, null)); } DateTime utcNow = DateTime.UtcNow; if (this.Status == RequestStatus.Completed && (!this.DoNotPickUntilHasElapsed || this.DoNotPickUntilTimestamp == DateTime.MinValue) && !this.RehomeRequest) { return(new JobPickupRec(this, JobPickupResult.CompletedJobSkipped, (this.DoNotPickUntilTimestamp == DateTime.MinValue) ? DateTime.MaxValue : this.DoNotPickUntilTimestamp, LocalizedString.Empty, null)); } if (this.CancelRequest && !this.DoNotPickUntilHasElapsed) { return(new JobPickupRec(this, JobPickupResult.PostponeCancel, this.DoNotPickUntilTimestamp, LocalizedString.Empty, null)); } if (!this.isInteractive && !this.IsLightRequest && !this.DoNotPickUntilHasElapsed) { MrsTracer.Service.Debug("Ignoring MoveJob '{0}' on queue '{1}' having DoNotPickUntilTimestamp of {2}.", new object[] { this.RequestGuid, this.RequestQueueGuid, this.DoNotPickUntilTimestamp.ToLocalTime() }); return(new JobPickupRec(this, JobPickupResult.JobIsPostponed, this.DoNotPickUntilTimestamp, LocalizedString.Empty, null)); } if (this.InternalFlags.HasFlag(RequestJobInternalFlags.ExecutedByTransportSync)) { MrsTracer.Service.Debug("Ignoring MoveJob '{0}' since Tranport Sync Owns Execution of the job.", new object[] { this.RequestGuid }); return(new JobPickupRec(this, JobPickupResult.JobOwnedByTransportSync, DateTime.MaxValue, LocalizedString.Empty, null)); } JobPickupRec result; using (DisposeGuard disposeGuard = default(DisposeGuard)) { using (RequestJobProvider requestJobProvider = new RequestJobProvider(this.RequestQueueGuid, systemMailbox)) { using (TransactionalRequestJob transactionalRequestJob = (TransactionalRequestJob)requestJobProvider.Read <TransactionalRequestJob>(new RequestJobObjectId(this.RequestGuid, this.RequestQueueGuid, this.MessageID))) { if (transactionalRequestJob == null) { result = new JobPickupRec(this, JobPickupResult.InvalidJob, DateTime.MaxValue, MrsStrings.PickupStatusCorruptJob, null); } else if (!transactionalRequestJob.IsSupported()) { result = new JobPickupRec(this, JobPickupResult.UnknownJobType, DateTime.MaxValue, MrsStrings.PickupStatusSubTypeNotSupported(transactionalRequestJob.RequestType.ToString()), null); } else if (transactionalRequestJob.ValidationResult != RequestJobBase.ValidationResultEnum.Valid) { this.ProcessInvalidJob(transactionalRequestJob, requestJobProvider); result = new JobPickupRec(this, JobPickupResult.InvalidJob, DateTime.MaxValue, MrsStrings.PickupStatusInvalidJob(transactionalRequestJob.ValidationResult.ToString(), transactionalRequestJob.ValidationMessage), null); } else if (transactionalRequestJob.Status == RequestStatus.Completed && !transactionalRequestJob.RehomeRequest) { this.CleanupCompletedJob(transactionalRequestJob, requestJobProvider); result = new JobPickupRec(this, JobPickupResult.CompletedJobCleanedUp, DateTime.MaxValue, MrsStrings.PickupStatusCompletedJob, null); } else if (!transactionalRequestJob.ShouldProcessJob()) { result = new JobPickupRec(this, JobPickupResult.DisabledJobPickup, DateTime.MaxValue, MrsStrings.PickupStatusDisabled, null); } else { ReservationContext reservationContext = null; if (!this.IsLightRequest && !MoveJob.CacheJobQueues) { reservationContext = new ReservationContext(); disposeGuard.Add <ReservationContext>(reservationContext); try { this.ReserveLocalForestResources(reservationContext, transactionalRequestJob); } catch (LocalizedException ex) { if (CommonUtils.ExceptionIs(ex, new WellKnownException[] { WellKnownException.ResourceReservation })) { return(new JobPickupRec(this, JobPickupResult.ReservationFailure, utcNow + MoveJob.JobPickupRetryInterval, MrsStrings.PickupStatusReservationFailure(CommonUtils.FullExceptionMessage(ex)), ex as ResourceReservationException)); } throw; } } if (!TestIntegration.Instance.DisableRemoteHostNameBlacklisting && transactionalRequestJob.RequestType == MRSRequestType.Move && (transactionalRequestJob.Flags & RequestFlags.CrossOrg) != RequestFlags.None && (transactionalRequestJob.Flags & RequestFlags.RemoteLegacy) == RequestFlags.None && !string.IsNullOrEmpty(transactionalRequestJob.RemoteHostName)) { string key = transactionalRequestJob.RemoteHostName.ToLowerInvariant(); DateTime nextRecommendedPickup; if (MoveJob.RemoteHostsInProxyBackoff.TryGetValue(key, out nextRecommendedPickup)) { return(new JobPickupRec(this, JobPickupResult.ProxyBackoff, nextRecommendedPickup, MrsStrings.PickupStatusProxyBackoff(transactionalRequestJob.RemoteHostName), null)); } } MrsTracer.Service.Debug("Attempting to take over MoveJob '{0}' on queue '{1}', priority={2}", new object[] { transactionalRequestJob, this.RequestQueueGuid, transactionalRequestJob.Priority }); transactionalRequestJob.RequestJobState = JobProcessingState.InProgress; transactionalRequestJob.MRSServerName = CommonUtils.LocalComputerName; if (!this.IsLightRequest) { transactionalRequestJob.PoisonCount++; transactionalRequestJob.LastPickupTime = new DateTime?(DateTime.UtcNow); } if (!transactionalRequestJob.Suspend && !transactionalRequestJob.RehomeRequest && transactionalRequestJob.Status != RequestStatus.Suspended && transactionalRequestJob.Status != RequestStatus.AutoSuspended && transactionalRequestJob.Status != RequestStatus.Failed && transactionalRequestJob.Status != RequestStatus.Completed && transactionalRequestJob.Status != RequestStatus.CompletedWithWarning) { transactionalRequestJob.Status = ((reservationContext == null) ? RequestStatus.Queued : RequestStatus.InProgress); } requestJobProvider.Save(transactionalRequestJob); this.Status = transactionalRequestJob.Status; JobPickupRec jobPickupRec; if (this.IsLightRequest) { jobPickupRec = new JobPickupRec(this, JobPickupResult.JobPickedUp, DateTime.MaxValue, MrsStrings.PickupStatusLightJob(transactionalRequestJob.Suspend, transactionalRequestJob.RehomeRequest, transactionalRequestJob.Priority.ToString()), null); MoveJob.PerformLightJobAction(requestJobProvider.SystemMailbox, RequestJobProvider.CreateRequestStatistics(transactionalRequestJob)); } else { MailboxSyncerJobs.CreateJob(transactionalRequestJob, reservationContext); jobPickupRec = new JobPickupRec(this, JobPickupResult.JobPickedUp, DateTime.MaxValue, MrsStrings.PickupStatusCreateJob(transactionalRequestJob.SyncStage.ToString(), transactionalRequestJob.CancelRequest, transactionalRequestJob.Priority.ToString()), null); } disposeGuard.Success(); result = jobPickupRec; } } } } return(result); }