private bool TrySelectDomainController(ITopologyConfigurationSession session, string domainControllerFqdn, PartitionId partitionId, bool checkSuitability, out Guid resultInvocationId) { ExTraceGlobals.ActiveDirectoryTracer.TraceDebug <string>((long)base.TenantExternalDirectoryId.GetHashCode(), "MergePageToken.TrySelectDomainController dc {0}", domainControllerFqdn); resultInvocationId = Guid.Empty; string text; LocalizedString localizedString; if (checkSuitability && !SuitabilityVerifier.IsServerSuitableIgnoreExceptions(domainControllerFqdn, false, null, out text, out localizedString)) { ExTraceGlobals.ActiveDirectoryTracer.TraceWarning <string, string>((long)base.TenantExternalDirectoryId.GetHashCode(), "DC {0} is not available for Tenant Full Backsync, error {1}", domainControllerFqdn, localizedString.ToString()); return(false); } ITopologyConfigurationSession configSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(domainControllerFqdn, true, ConsistencyMode.IgnoreInvalid, null, ADSessionSettings.FromAccountPartitionRootOrgScopeSet(partitionId), 461, "TrySelectDomainController", "f:\\15.00.1497\\sources\\dev\\data\\src\\directory\\Sync\\BackSync\\MergePageToken.cs"); WatermarkMap replicationCursors = SyncConfiguration.GetReplicationCursors(configSession, false, true); if (replicationCursors.ContainsAllChanges(base.Watermarks)) { Guid invocationIdByFqdn = session.GetInvocationIdByFqdn(domainControllerFqdn); long num; if (base.Watermarks.TryGetValue(invocationIdByFqdn, out num)) { base.ObjectUpdateSequenceNumber = num + 1L; base.TombstoneUpdateSequenceNumber = num + 1L; base.InvocationId = invocationIdByFqdn; if (base.UseContainerizedUsnChangedIndex) { base.SoftDeletedObjectUpdateSequenceNumber = num + 1L; } ExTraceGlobals.ActiveDirectoryTracer.TraceDebug((long)base.TenantExternalDirectoryId.GetHashCode(), "DC {0}({1})has all changes reported by the Tenant Full Sync Watermarks for {2} and CAN be used. \r\nFull sync watermarks: \r\n{3}\r\nDC replication cursors: \r\n{4}", new object[] { domainControllerFqdn, base.InvocationId, base.TenantExternalDirectoryId, base.Watermarks.SerializeToString(), replicationCursors.SerializeToString() }); resultInvocationId = invocationIdByFqdn; return(true); } ExTraceGlobals.ActiveDirectoryTracer.TraceDebug((long)base.TenantExternalDirectoryId.GetHashCode(), "DC {0}({1})has all changes reported by the Tenant Full Sync Watermarks for {2} but cannot be used since its invocationId is not part of the TFS watermarks. \r\nFull sync watermarks: \r\n{3}\r\n", new object[] { domainControllerFqdn, base.InvocationId, base.TenantExternalDirectoryId, base.Watermarks.SerializeToString() }); } else { ExTraceGlobals.ActiveDirectoryTracer.TraceDebug((long)base.TenantExternalDirectoryId.GetHashCode(), "DC {0} does not have all changes reported by the Tenant Full Sync Watermarks for {1} and cannot be used. \r\nFull sync watermarks: \r\n{2}\r\nDC replication cursors: \r\n{3}", new object[] { domainControllerFqdn, base.TenantExternalDirectoryId, base.Watermarks.SerializeToString(), replicationCursors.SerializeToString() }); } return(false); }
private bool IsMergeNeeded(PartitionId partitionId) { ADReplicationCursorCollection cursors = this.dirSyncCookie.Cursors; ExTraceGlobals.MergeTracer.TraceDebug <ADReplicationCursorCollection>((long)base.TenantExternalDirectoryId.GetHashCode(), "MergePageToken.IsMergeNeeded original cursors from dirsync cookie = {0}", cursors); WatermarkMap watermarkMap = this.FilterOutNotExistingDCs(cursors, partitionId); ExTraceGlobals.MergeTracer.TraceDebug <string>((long)base.TenantExternalDirectoryId.GetHashCode(), "MergePageToken.IsMergeNeeded cursors from dirsync cookie filtered only for live DCs = {0}", watermarkMap.SerializeToString()); ExTraceGlobals.MergeTracer.TraceDebug <string>((long)base.TenantExternalDirectoryId.GetHashCode(), "MergePageToken.IsMergeNeeded watermarks from token = {0}", base.Watermarks.SerializeToString()); bool flag = watermarkMap.Any((KeyValuePair <Guid, long> dcw) => !base.Watermarks.ContainsKey(dcw.Key) || base.Watermarks[dcw.Key] < dcw.Value); ExTraceGlobals.MergeTracer.TraceDebug <bool>((long)base.TenantExternalDirectoryId.GetHashCode(), "MergePageToken.IsMergeNeeded isMergeNeeded = {0}", flag); return(flag); }