private long ReadDcHighestUSN(PartitionId partitionId, string domainController, bool useConfigNC, out Guid invocationId, out WatermarkMap watermarks) { ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(domainController, true, ConsistencyMode.PartiallyConsistent, null, ADSessionSettings.FromAccountPartitionRootOrgScopeSet(partitionId), 452, "ReadDcHighestUSN", "f:\\15.00.1497\\sources\\dev\\Management\\src\\Management\\Relocation\\RemoveTenantRelocationRequest.cs"); invocationId = topologyConfigurationSession.GetInvocationIdByFqdn(domainController); topologyConfigurationSession.UseConfigNC = useConfigNC; watermarks = SyncConfiguration.GetReplicationCursors(topologyConfigurationSession, useConfigNC, false); return(watermarks[invocationId]); }
public static SyncCookie ResolveSyncCookie(byte[] cookieData, IDirectorySession session, Task.TaskVerboseLoggingDelegate writeVerbose, Task.TaskErrorLoggingDelegate writeError) { if (session == null) { throw new ArgumentNullException("session"); } string text = SyncTaskHelper.GetCurrentServerFromSession(session); ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(text, true, ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 84, "ResolveSyncCookie", "f:\\15.00.1497\\sources\\dev\\Management\\src\\Management\\Common\\recipient\\SyncTaskHelper.cs"); Guid guid = topologyConfigurationSession.GetInvocationIdByFqdn(text); writeVerbose(Strings.VerboseSyncTaskDomainControllerToUse(text, guid)); if (cookieData == null) { writeVerbose(SyncTaskHelper.FormatCookieVerboseString(null)); SyncCookie syncCookie = new SyncCookie(guid, WatermarkMap.Empty, SyncConfiguration.GetReplicationCursors(topologyConfigurationSession), null); writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text, syncCookie.HighWatermark)); return(syncCookie); } SyncCookie syncCookie2 = null; Exception exception = null; if (!SyncCookie.TryFromBytes(cookieData, out syncCookie2, out exception)) { writeError(exception, ErrorCategory.InvalidData, null); } writeVerbose(SyncTaskHelper.FormatCookieVerboseString(syncCookie2)); if (syncCookie2.DomainController != guid) { writeVerbose(Strings.VerboseSyncTaskDomainControllerMismatch(syncCookie2.DomainController, guid)); ADServer adserver = topologyConfigurationSession.FindDCByFqdn(text); if (syncCookie2.PageCookie != null) { writeVerbose(Strings.VerboseSyncTaskCookieHasPageData(syncCookie2.DomainController, guid)); string text2 = SyncTaskHelper.FindAvailableServerByInvocationId(syncCookie2.DomainController, topologyConfigurationSession, adserver.Site); if (text2 != null) { session.DomainController = text2; writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text2, syncCookie2.HighWatermark)); return(syncCookie2); } writeError(new PageCookieInterruptedException(), ErrorCategory.InvalidData, null); } if (!syncCookie2.LowWatermarks.ContainsKey(guid)) { writeVerbose(Strings.VerboseSyncTaskCookieCurrentWatermarksMissingCurrentDC(syncCookie2.DomainController, guid)); string text3 = SyncTaskHelper.FindAvailableServerByInvocationId(syncCookie2.DomainController, topologyConfigurationSession, adserver.Site); if (text3 != null) { session.DomainController = text3; topologyConfigurationSession.DomainController = text3; text = text3; guid = syncCookie2.DomainController; } else { writeVerbose(Strings.VerboseSyncTaskCookieOriginatingDCNotAvailable(syncCookie2.DomainController)); Guid guid2; string text4 = SyncTaskHelper.FindAvailableServerFromWatermarks(syncCookie2.LowWatermarks, topologyConfigurationSession, adserver.Site, out guid2); if (text4 != null) { session.DomainController = text4; topologyConfigurationSession.DomainController = text4; text = text4; guid = guid2; } else { writeError(new CookieExpiredException(syncCookie2.DomainController, guid), ErrorCategory.InvalidData, null); } } } } WatermarkMap lowWatermarks = SyncTaskHelper.FallbackWatermarks(syncCookie2.LowWatermarks, syncCookie2.DomainController, guid); WatermarkMap highWatermarks = SyncTaskHelper.FallbackWatermarks(syncCookie2.HighWatermarks, syncCookie2.DomainController, guid); if (syncCookie2.HighWatermark == 0L) { syncCookie2 = new SyncCookie(guid, lowWatermarks, SyncConfiguration.GetReplicationCursors(topologyConfigurationSession), null); } else { syncCookie2 = new SyncCookie(guid, lowWatermarks, highWatermarks, syncCookie2.PageCookie); } writeVerbose(Strings.VerboseSyncTaskHighestCommittedUSN(text, syncCookie2.HighWatermark)); return(syncCookie2); }
public override IEnumerable <ADRawEntry> GetDataPage() { ExTraceGlobals.TenantRelocationTracer.TraceDebug((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration GetDataPage ..."); WatermarkMap watermarks = SyncConfiguration.GetReplicationCursors(base.RootOrgConfigurationSession); WatermarkMap configNcWatermarks = SyncConfiguration.GetReplicationCursors(base.RootOrgConfigurationSession, true, false); string dcName = base.RootOrgConfigurationSession.DomainController; ExTraceGlobals.TenantRelocationTracer.TraceDebug <string>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration dcName {0}", dcName); base.TenantConfigurationSession.DomainController = dcName; base.RecipientSession.DomainController = dcName; Guid watermarksInvocationId = base.RootOrgConfigurationSession.GetInvocationIdByFqdn(dcName); ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration watermarksInvocationId {0}", watermarksInvocationId); long maxUsn = watermarks[watermarksInvocationId]; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration maxUsn {0}", maxUsn); this.PageToken.IsTenantConfigUnitInConfigNc = !ADSession.IsTenantConfigInDomainNC(base.RecipientSession.SessionSettings.GetAccountOrResourceForestFqdn()); if (this.PageToken.InvocationId == Guid.Empty) { this.PageToken.SetInvocationId(watermarksInvocationId, dcName); ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.InvocationId to {0}", this.PageToken.InvocationId); } this.moreDataForThisPage = true; while (this.ShouldReadMoreData()) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <string>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.State = {0}", this.PageToken.State.ToString()); switch (this.PageToken.State) { case TenantRelocationSyncState.PreSyncAllObjects: if (this.PageToken.PreSyncLdapPagingCookie == null) { this.PageToken.PendingConfigNcWatermarks = configNcWatermarks; this.PageToken.PendingWatermarks = watermarks; this.PageToken.PendingWatermarksInvocationId = watermarksInvocationId; ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.PendingWatermarksInvocationId to {0}", this.PageToken.PendingWatermarksInvocationId); } foreach (ADRawEntry entry in this.PreSyncAllObjects()) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration PreSyncAllObjects yield {0}", entry.Id); yield return(entry); } break; case TenantRelocationSyncState.EnumerateConfigUnitLiveObjects: foreach (ADRawEntry entry2 in this.ReadLiveObjects(maxUsn)) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateConfigUnitLiveObjects yield {0}", entry2.Id); yield return(entry2); } this.PageToken.PendingWatermarksInvocationId = watermarksInvocationId; ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.PendingWatermarksInvocationId to {0}", this.PageToken.PendingWatermarksInvocationId); if (this.PageToken.IsTenantConfigUnitInConfigNc) { this.PageToken.PendingConfigNcWatermarks = configNcWatermarks; } else { this.PageToken.PendingWatermarks = watermarks; } break; case TenantRelocationSyncState.EnumerateConfigUnitLinksInPage: ExTraceGlobals.TenantRelocationTracer.TraceDebug((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateConfigUnitLinksInPage skips"); this.PageToken.SwitchToEnumerateLiveObjectsState(); break; case TenantRelocationSyncState.EnumerateOrganizationalUnitLiveObjects: foreach (ADRawEntry entry3 in this.ReadLiveObjects(maxUsn)) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateOrganizationalUnitLiveObjects yield {0}", entry3.Id); yield return(entry3); } if (this.PageToken.IsTenantConfigUnitInConfigNc) { this.PageToken.PendingWatermarksInvocationId = watermarksInvocationId; ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.PendingWatermarksInvocationId to {0}", this.PageToken.PendingWatermarksInvocationId); this.PageToken.PendingWatermarks = watermarks; } break; case TenantRelocationSyncState.EnumerateOrganizationalUnitLinksInPage: ExTraceGlobals.TenantRelocationTracer.TraceDebug((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateConfigUnitLinksInPage skips"); this.PageToken.SwitchToEnumerateLiveObjectsState(); break; case TenantRelocationSyncState.EnumerateConfigUnitDeletedObjects: foreach (ADRawEntry entry4 in this.ReadDeletedObjects()) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateConfigUnitDeletedObjects yield {0}", entry4.Id); yield return(entry4); } break; case TenantRelocationSyncState.EnumerateOrganizationalUnitDeletedObjects: if (!this.PageToken.IsTenantConfigUnitInConfigNc) { this.PageToken.SwitchToNextState(); } else { foreach (ADRawEntry entry5 in this.ReadDeletedObjects()) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateOrganizationalUnitDeletedObjects yield {0}", entry5.Id); yield return(entry5); } } break; case TenantRelocationSyncState.EnumerateSpecialObjects: foreach (ADRawEntry entry6 in this.ReadSpecialObjects()) { ExTraceGlobals.TenantRelocationTracer.TraceDebug <ADObjectId>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration EnumerateSpecialObjects yield {0}", entry6.Id); yield return(entry6); } if (!this.PageToken.IsTenantConfigUnitInConfigNc) { this.PageToken.PendingWatermarksInvocationId = watermarksInvocationId; ExTraceGlobals.TenantRelocationTracer.TraceDebug <Guid>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.PendingWatermarksInvocationId to {0}", this.PageToken.PendingWatermarksInvocationId); this.PageToken.PendingConfigNcWatermarks = configNcWatermarks; } this.PageToken.SwitchToNextState(); break; default: ExTraceGlobals.TenantRelocationTracer.TraceError <string>((long)SyncConfiguration.TraceId, "Invalid PageToken stat {0}", this.PageToken.State.ToString()); throw new ArgumentException(this.PageToken.State.ToString()); } } ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.OrganizationalUnitObjectUSN = {0}", this.PageToken.OrganizationalUnitObjectUSN); if (this.PageToken.OrganizationalUnitObjectUSN > maxUsn + 1L) { this.PageToken.OrganizationalUnitObjectUSN = maxUsn + 1L; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.OrganizationalUnitObjectUSN to {0}", this.PageToken.OrganizationalUnitObjectUSN); } ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.OrganizationalUnitTombstoneUSN = {0}", this.PageToken.OrganizationalUnitTombstoneUSN); if (this.PageToken.OrganizationalUnitTombstoneUSN > maxUsn + 1L) { this.PageToken.OrganizationalUnitTombstoneUSN = maxUsn + 1L; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.OrganizationalUnitTombstoneUSN to {0}", this.PageToken.OrganizationalUnitTombstoneUSN); } ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.ConfigUnitObjectUSN = {0}", this.PageToken.ConfigUnitObjectUSN); if (this.PageToken.ConfigUnitObjectUSN > maxUsn + 1L) { this.PageToken.ConfigUnitObjectUSN = maxUsn + 1L; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.ConfigUnitObjectUSN = {0}", this.PageToken.ConfigUnitObjectUSN); } ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.ConfigUnitTombstoneUSN = {0}", this.PageToken.ConfigUnitTombstoneUSN); if (this.PageToken.ConfigUnitTombstoneUSN > maxUsn + 1L) { this.PageToken.ConfigUnitTombstoneUSN = maxUsn + 1L; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.ConfigUnitTombstoneUSN = {0}", this.PageToken.ConfigUnitTombstoneUSN); } ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.SpecialObjectsUSN = {0}", this.PageToken.SpecialObjectsUSN); if (this.PageToken.SpecialObjectsUSN > maxUsn + 1L) { this.PageToken.SpecialObjectsUSN = maxUsn + 1L; ExTraceGlobals.TenantRelocationTracer.TraceDebug <long>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration this.PageToken.SpecialObjectsUSN = {0}", this.PageToken.SpecialObjectsUSN); } this.PageToken.LastReadFailureStartTime = DateTime.MinValue; ExTraceGlobals.TenantRelocationTracer.TraceDebug <DateTime>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.LastReadFailureStartTime to {0}", this.PageToken.LastReadFailureStartTime); this.PageToken.Timestamp = DateTime.UtcNow; ExTraceGlobals.TenantRelocationTracer.TraceDebug <DateTime>((long)SyncConfiguration.TraceId, "TenantRelocationSyncConfiguration set this.PageToken.Timestamp to {0}", this.PageToken.Timestamp); yield break; }
private bool CheckReplicationStatus(ITopologyConfigurationSession session, WatermarkMap finishWaterMark, bool useConfigNC) { WatermarkMap replicationCursors = SyncConfiguration.GetReplicationCursors(session, useConfigNC, false); return(replicationCursors.ContainsAllChanges(finishWaterMark)); }