private void CleanupCompletedJob(TransactionalRequestJob requestJob, RequestJobProvider rjProvider) { DateTime t = requestJob.TimeTracker.GetTimestamp(RequestJobTimestamp.DoNotPickUntil) ?? DateTime.MaxValue; if (DateTime.UtcNow < t) { return; } MrsTracer.Service.Debug("Cleaning up expired completed job '{0}' on queue '{1}'", new object[] { requestJob, this.RequestQueueGuid }); rjProvider.Delete(requestJob); CommonUtils.CatchKnownExceptions(delegate { ReportData reportData = new ReportData(requestJob.IdentifyingGuid, requestJob.ReportVersion); reportData.Delete(rjProvider.SystemMailbox); }, null); CommonUtils.CatchKnownExceptions(delegate { rjProvider.DeleteIndexEntries(requestJob); }, null); requestJob.RemoveAsyncNotification(); MailboxReplicationService.LogEvent(MRSEventLogConstants.Tuple_RemovedCompletedRequest, new object[] { requestJob.ToString(), this.RequestGuid.ToString(), requestJob.WorkItemQueueMdbName }); }
public override void Run() { Guid currentQueueGuid = this.CurrentRequestQueue.ObjectGuid; Guid newQueueGuid = this.NewRequestQueue.ObjectGuid; RequestJobObjectId currentId = new RequestJobObjectId(base.RequestGuid, currentQueueGuid, this.MessageId); RequestJobObjectId newId = new RequestJobObjectId(base.RequestGuid, newQueueGuid, null); CommonUtils.CatchKnownExceptions(delegate { DatabaseInformation databaseInformation = MapiUtils.FindServerForMdb(this.NewRequestQueue, null, null, FindServerFlags.None); if (databaseInformation.ServerVersion < Server.E15MinVersion) { throw new UnsupportedRehomeTargetVersionPermanentException(newQueueGuid.ToString(), new ServerVersion(databaseInformation.ServerVersion).ToString()); } this.NewSystemMailbox = MapiUtils.GetSystemMailbox(newQueueGuid); using (RequestJobProvider currentQueueProvider = new RequestJobProvider(currentQueueGuid, this.CurrentSystemMailbox)) { using (RequestJobProvider newQueueProvider = new RequestJobProvider(newQueueGuid, this.NewSystemMailbox)) { using (TransactionalRequestJob requestJob = (TransactionalRequestJob)currentQueueProvider.Read <TransactionalRequestJob>(currentId)) { if (requestJob != null) { RequestJobProvider origProvider = requestJob.Provider; MoveObjectInfo <RequestJobXML> origMO = requestJob.MoveObject; ReportData currentReport = new ReportData(requestJob.IdentifyingGuid, requestJob.ReportVersion); currentReport.Load(currentQueueProvider.SystemMailbox); ReportData newReport = new ReportData(currentReport.IdentifyingGuid, requestJob.ReportVersion); newReport.Append(currentReport.Entries); try { requestJob.Provider = null; requestJob.MoveObject = null; requestJob.RequestQueue = this.NewRequestQueue; requestJob.Identity = newId; requestJob.OriginatingMDBGuid = Guid.Empty; requestJob.RehomeRequest = false; if (requestJob.IndexEntries != null) { foreach (IRequestIndexEntry requestIndexEntry in requestJob.IndexEntries) { requestIndexEntry.StorageMDB = this.NewRequestQueue; } } newQueueProvider.Save(requestJob); CommonUtils.CatchKnownExceptions(delegate { newReport.Append(MrsStrings.ReportJobRehomed(currentQueueGuid.ToString(), newQueueGuid.ToString())); newReport.Flush(newQueueProvider.SystemMailbox); }, null); CommonUtils.CatchKnownExceptions(delegate { requestJob.Provider = origProvider; requestJob.MoveObject = origMO; requestJob.RequestQueue = this.CurrentRequestQueue; requestJob.Identity = currentId; requestJob.OriginatingMDBGuid = currentQueueGuid; requestJob.RehomeRequest = true; MapiUtils.RetryOnObjectChanged(delegate { currentQueueProvider.Delete(requestJob); }); currentReport.Delete(currentQueueProvider.SystemMailbox); }, null); } catch { requestJob.Provider = origProvider; requestJob.MoveObject = origMO; requestJob.RequestQueue = this.CurrentRequestQueue; requestJob.Identity = currentId; requestJob.OriginatingMDBGuid = currentQueueGuid; requestJob.RehomeRequest = true; throw; } } } } } }, delegate(Exception failure) { MrsTracer.Service.Warning("Failed to rehome request.", new object[0]); this.RehomeFailure = failure; }); base.Run(); }
private void ProcessInvalidJob(TransactionalRequestJob requestJob, RequestJobProvider rjProvider) { MrsTracer.Service.Warning("MoveJob '{0}' on queue '{1}' failed validation: {2}.", new object[] { requestJob, this.RequestQueueGuid, requestJob.ValidationMessage }); if (requestJob.IdleTime < MoveJob.MaxADReplicationWaitTime) { MrsTracer.Service.Warning("MoveJob '{0}' on queue '{1}' appears invalid. Waiting for {2} for AD Replication. Already have waited {3}...", new object[] { requestJob, this.RequestQueueGuid, MoveJob.MaxADReplicationWaitTime, requestJob.IdleTime }); return; } if (requestJob.ValidationResult == RequestJobBase.ValidationResultEnum.Orphaned) { MrsTracer.Service.Warning("MoveJob '{0}' on queue '{1}' is orphaned, removing it.", new object[] { requestJob, this.RequestQueueGuid }); rjProvider.Delete(requestJob); CommonUtils.CatchKnownExceptions(delegate { ReportData reportData2 = new ReportData(requestJob.IdentifyingGuid, requestJob.ReportVersion); reportData2.Delete(rjProvider.SystemMailbox); }, null); requestJob.RemoveAsyncNotification(); MailboxReplicationService.LogEvent(MRSEventLogConstants.Tuple_RemovedOrphanedMoveRequest, new object[] { this.RequestQueueGuid.ToString(), this.RequestGuid.ToString(), requestJob.ToString(), requestJob.ValidationMessage }); return; } ReportData reportData = new ReportData(requestJob.IdentifyingGuid, requestJob.ReportVersion); reportData.Append(MrsStrings.ReportFailingInvalidMoveRequest(requestJob.ValidationMessage)); reportData.Flush(rjProvider.SystemMailbox); requestJob.Status = RequestStatus.Failed; requestJob.FailureCode = new int?(-2147024809); requestJob.FailureType = "InvalidRequest"; requestJob.FailureSide = new ExceptionSide?(ExceptionSide.None); requestJob.Message = MrsStrings.MoveRequestMessageError(MrsStrings.MoveRequestDataIsCorrupt(requestJob.ValidationMessage)); requestJob.TimeTracker.SetTimestamp(RequestJobTimestamp.Failure, new DateTime?(DateTime.UtcNow)); requestJob.TimeTracker.CurrentState = RequestState.Failed; rjProvider.Save(requestJob); requestJob.UpdateAsyncNotification(reportData); MailboxReplicationService.LogEvent(MRSEventLogConstants.Tuple_FailedInvalidRequest, new object[] { this.RequestQueueGuid.ToString(), this.RequestGuid.ToString(), requestJob.ToString(), requestJob.ValidationMessage }); }