private void ReportCleanupFailure(Exception failure) { LocalizedString localizedString = MrsStrings.SourceMailboxCleanupFailed(CommonUtils.FullExceptionMessage(failure)); base.Report.Append(localizedString, failure, ReportEntryFlags.Cleanup); base.Warnings.Add(localizedString); FailureLog.Write(base.RequestJobGuid, failure, false, RequestState.Cleanup, SyncStage.CleanupDeleteSourceMailbox, null, null); }
private static void WriteInternal(Guid requestGuid, Exception failure, bool isFatal, RequestState requestState, SyncStage syncStage, string folderName, string operationType, Guid failureGuid, int failureLevel) { FailureData objectToLog = default(FailureData); objectToLog.FailureGuid = failureGuid; objectToLog.RequestGuid = requestGuid; objectToLog.Failure = failure; objectToLog.FailureLevel = failureLevel; objectToLog.IsFatal = isFatal; objectToLog.RequestState = requestState; objectToLog.SyncStage = syncStage; objectToLog.FolderName = folderName; objectToLog.OperationType = operationType; if (objectToLog.OperationType == null && objectToLog.Failure != null) { string dataContext = ExecutionContext.GetDataContext(failure); objectToLog.OperationType = FailureLog.GetDataContextToPersist(dataContext); } GenericSettingsContext genericSettingsContext = new GenericSettingsContext("FailureType", CommonUtils.GetFailureType(failure), null); using (genericSettingsContext.Activate()) { if (ConfigBase <MRSConfigSchema> .GetConfig <bool>("SendGenericWatson")) { string watsonHash; CommonUtils.SendGenericWatson(failure, CommonUtils.FullFailureMessageWithCallStack(failure, 5), out watsonHash); objectToLog.WatsonHash = watsonHash; } else { objectToLog.WatsonHash = CommonUtils.ComputeCallStackHash(failure, 5); } } FailureLog.instance.LogObject(objectToLog); if (failure.InnerException != null) { FailureLog.WriteInternal(requestGuid, failure.InnerException, isFatal, requestState, syncStage, folderName, operationType, failureGuid, failureLevel + 1); } }
protected override void UpdateSourceMailbox() { ReportEntry[] entries = null; MailboxCopierBase rootCtx = base.GetRootMailboxContext(); ADUser srcUser = rootCtx.SourceMailbox.GetADUser(); ADUser destUser = null; ConfigurableObjectXML configObj; CommonUtils.CatchKnownExceptions(delegate { destUser = rootCtx.DestMailbox.GetADUser(); configObj = ConfigurableObjectXML.Create(destUser); this.Report.Append(MrsStrings.ReportTargetMailboxAfterFinalization2(destUser.ToString(), destUser.OriginatingServer), configObj, ReportEntryFlags.Target | ReportEntryFlags.After); }, delegate(Exception failure) { this.Report.Append(MrsStrings.ReportUnableToLoadDestinationUser(CommonUtils.GetFailureType(failure)), failure, ReportEntryFlags.Cleanup | ReportEntryFlags.Target); FailureLog.Write(this.RequestJobGuid, failure, false, RequestState.Cleanup, SyncStage.CleanupUnableToLoadTargetMailbox, null, null); destUser = (ADUser)srcUser.Clone(); }); if (base.CachedRequestJob.PrimaryIsMoving) { SmtpAddress?smtpAddress = null; foreach (ProxyAddress proxyAddress in destUser.EmailAddresses) { SmtpProxyAddress smtpProxyAddress = proxyAddress as SmtpProxyAddress; if (smtpProxyAddress != null) { SmtpAddress value = new SmtpAddress(smtpProxyAddress.SmtpAddress); if (StringComparer.OrdinalIgnoreCase.Equals(value.Domain, base.CachedRequestJob.TargetDeliveryDomain)) { smtpAddress = new SmtpAddress?(value); break; } } } if (smtpAddress == null) { LocalizedString localizedString = MrsStrings.ReportUnableToComputeTargetAddress(base.CachedRequestJob.TargetDeliveryDomain, destUser.PrimarySmtpAddress.ToString()); base.Report.Append(localizedString); base.Warnings.Add(localizedString); FailureLog.Write(base.RequestJobGuid, new MailboxReplicationTransientException(localizedString), false, RequestState.Cleanup, SyncStage.CleanupUnableToComputeTargetAddress, null, null); smtpAddress = new SmtpAddress?(destUser.PrimarySmtpAddress); } SmtpProxyAddress smtpProxyAddress2 = new SmtpProxyAddress(smtpAddress.Value.ToString(), true); destUser.ExternalEmailAddress = smtpProxyAddress2; List <PropertyUpdateXML> list = new List <PropertyUpdateXML>(); PropertyUpdateXML.Add(list, ADRecipientSchema.ExternalEmailAddress, smtpProxyAddress2, PropertyUpdateOperation.Replace); if (rootCtx.SyncState.ExternalLegacyExchangeDN != null) { PropertyUpdateXML.Add(list, ADRecipientSchema.LegacyExchangeDN, rootCtx.SyncState.ExternalLegacyExchangeDN, PropertyUpdateOperation.Replace); this.AddX500ProxyAddressIfNeeded(list, srcUser, srcUser.LegacyExchangeDN, srcUser.Identity.ToString()); } if (rootCtx.SyncState.InternalLegacyExchangeDN != null) { this.AddX500ProxyAddressIfNeeded(list, srcUser, rootCtx.SyncState.InternalLegacyExchangeDN, destUser.Identity.ToString()); } destUser.LinkedMasterAccount = XMLSerializableBase.Serialize(list.ToArray(), false); } try { Guid?newMailboxContainerGuid = null; CrossTenantObjectId newUnifiedMailboxId = null; MrsTracer.Service.Debug("Updating source mailbox...", new object[0]); UpdateMovedMailboxOperation op; Guid newArchiveDatabaseGuid; ArchiveStatusFlags archiveStatus; string archiveDomain; if (base.CachedRequestJob.PrimaryOnly) { op = UpdateMovedMailboxOperation.MorphToMailUser; newArchiveDatabaseGuid = ((srcUser.ArchiveDatabase != null) ? srcUser.ArchiveDatabase.ObjectGuid : Guid.Empty); archiveStatus = ((srcUser.ArchiveDatabase != null) ? ArchiveStatusFlags.Active : ArchiveStatusFlags.None); archiveDomain = null; } else if (base.CachedRequestJob.ArchiveOnly) { op = UpdateMovedMailboxOperation.UpdateArchiveOnly; newArchiveDatabaseGuid = Guid.Empty; archiveStatus = ArchiveStatusFlags.None; archiveDomain = ((srcUser.Database != null) ? base.CachedRequestJob.ArchiveDomain : null); newMailboxContainerGuid = srcUser.MailboxContainerGuid; newUnifiedMailboxId = srcUser.UnifiedMailbox; } else { op = UpdateMovedMailboxOperation.MorphToMailUser; newArchiveDatabaseGuid = Guid.Empty; archiveDomain = null; archiveStatus = ArchiveStatusFlags.None; } UpdateMovedMailboxFlags updateMovedMailboxFlags = UpdateMovedMailboxFlags.None; if (base.CachedRequestJob.SkipMailboxReleaseCheck) { updateMovedMailboxFlags |= UpdateMovedMailboxFlags.SkipMailboxReleaseCheck; } rootCtx.SourceMailbox.UpdateMovedMailbox(op, destUser, base.CachedRequestJob.SourceDomainControllerToUpdate ?? srcUser.OriginatingServer, out entries, Guid.Empty, newArchiveDatabaseGuid, archiveDomain, archiveStatus, updateMovedMailboxFlags, newMailboxContainerGuid, newUnifiedMailboxId); } finally { base.AppendReportEntries(entries); } CommonUtils.CatchKnownExceptions(delegate { srcUser = rootCtx.SourceMailbox.GetADUser(); configObj = ConfigurableObjectXML.Create(srcUser); this.Report.Append(MrsStrings.ReportSourceMailUserAfterFinalization2(srcUser.ToString(), srcUser.OriginatingServer), configObj, ReportEntryFlags.Source | ReportEntryFlags.After); }, null); }
public static void Write(Guid requestGuid, Exception failure, bool isFatal, RequestState requestState, SyncStage syncStage, string folderName = null, string operationType = null) { FailureLog.WriteInternal(requestGuid, failure, isFatal, requestState, syncStage, folderName, operationType, Guid.NewGuid(), 0); }
public void QuarantineJob(Guid requestGuid, Exception ex) { try { FailureRec failureRec = FailureRec.Create(ex); string subkeyName = string.Format(JobQuarantineProvider.KeyNameFormatQuarantinedJob, requestGuid); RegistryWriter.Instance.CreateSubKey(Registry.LocalMachine, subkeyName); RegistryWriter.Instance.SetValue(Registry.LocalMachine, subkeyName, "FailureType", failureRec.FailureType ?? string.Empty, RegistryValueKind.String); RegistryWriter.Instance.SetValue(Registry.LocalMachine, subkeyName, "Message", failureRec.Message ?? string.Empty, RegistryValueKind.String); RegistryWriter.Instance.SetValue(Registry.LocalMachine, subkeyName, "StackTrace", failureRec.StackTrace ?? string.Empty, RegistryValueKind.String); string dataContext = failureRec.DataContext ?? string.Empty; RegistryWriter.Instance.SetValue(Registry.LocalMachine, subkeyName, "DataContext", FailureLog.GetDataContextToPersist(dataContext), RegistryValueKind.String); string text = string.Empty; if (failureRec.InnerException != null) { text = failureRec.InnerException.StackTrace; } RegistryWriter.Instance.SetValue(Registry.LocalMachine, subkeyName, "InnerException", text ?? string.Empty, RegistryValueKind.String); } catch (ArgumentException) { } }