public override IList <TopologyVersion> GetTopologyVersions(IList <string> partitionFqdns) { if (partitionFqdns == null) { throw new ArgumentNullException("partitionFqdns"); } ExTraceGlobals.TopologyProviderTracer.Information <int>((long)this.GetHashCode(), "GetTopologyVersions. Partitions {0}", partitionFqdns.Count); TopologyVersion[] array = new TopologyVersion[partitionFqdns.Count]; LdapTopologyProvider.MiniTopology miniTopology = null; for (int i = 0; i < partitionFqdns.Count; i++) { TopologyProvider.EnforceNonEmptyPartition(partitionFqdns[i]); int version = 1; if (this.topologies.TryGetValue(partitionFqdns[i], out miniTopology)) { version = miniTopology.Version; } array[i] = new TopologyVersion(partitionFqdns[i], version); } if (ExTraceGlobals.TopologyProviderTracer.IsTraceEnabled(TraceType.InfoTrace)) { ExTraceGlobals.TopologyProviderTracer.Information <string>((long)this.GetHashCode(), "GetTopologyVersions. Partitions {0}", string.Join(",", (object[])array)); } return(array); }
protected override IList <ADServerInfo> InternalGetServersForRole(string partitionFqdn, IList <string> currentlyUsedServers, ADServerRole role, int serversRequested, bool forestWideAffinityRequested = false) { LdapTopologyProvider.MiniTopology miniTopology = new LdapTopologyProvider.MiniTopology(partitionFqdn); miniTopology = this.topologies.GetOrAdd(partitionFqdn, miniTopology); if (ExTraceGlobals.TopologyProviderTracer.IsTraceEnabled(TraceType.DebugTrace)) { ExTraceGlobals.TopologyProviderTracer.TraceDebug((long)this.GetHashCode(), "PartitionFqdn {0}. GetServersForRole {1}, {2} current: [{3}], need {4} servers", new object[] { partitionFqdn, role, currentlyUsedServers.Count, string.Join(",", currentlyUsedServers ?? Enumerable.Empty <string>()), serversRequested }); } ADServerInfo adserverInfo = null; if (miniTopology.DCInfo == null) { adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.DomainController); miniTopology.SetServerInfo(adserverInfo, ADServerRole.DomainController); miniTopology.IncrementTopologyVersion(); adserverInfo = null; } switch (role) { case ADServerRole.GlobalCatalog: adserverInfo = miniTopology.GCInfo; if (adserverInfo == null) { adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.GlobalCatalog); miniTopology.SetServerInfo(adserverInfo, role); miniTopology.IncrementTopologyVersion(); } break; case ADServerRole.DomainController: case ADServerRole.ConfigurationDomainController: adserverInfo = ((ADServerRole.DomainController == role) ? miniTopology.DCInfo : miniTopology.CDCInfo); if (adserverInfo == null) { adserverInfo = this.GetDirectoryServer(partitionFqdn, ADRole.DomainController); miniTopology.SetServerInfo(adserverInfo, role); miniTopology.IncrementTopologyVersion(); } break; } ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, string>((long)this.GetHashCode(), "PartitionFqdn {0}. GetServerForRole returning 1 server {1}", partitionFqdn, adserverInfo.FqdnPlusPort); ADProviderPerf.AddDCInstance(adserverInfo.Fqdn); ADServerInfo adserverInfo2 = (ADServerInfo)adserverInfo.Clone(); adserverInfo2.Mapping = (adserverInfo2.Fqdn.Equals((currentlyUsedServers == null || currentlyUsedServers.Count == 0) ? string.Empty : currentlyUsedServers[0], StringComparison.OrdinalIgnoreCase) ? 0 : -1); return(new List <ADServerInfo> { adserverInfo2 }); }
public override void SetConfigDC(string partitionFqdn, string serverName, int port) { base.SetConfigDC(partitionFqdn, serverName, port); ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, string, int>((long)this.GetHashCode(), "PartitionFqdn {0} setting Config DC to {1}:{2}", partitionFqdn, serverName, port); LdapTopologyProvider.MiniTopology miniTopology = new LdapTopologyProvider.MiniTopology(partitionFqdn); miniTopology = this.topologies.GetOrAdd(partitionFqdn, miniTopology); miniTopology.SetServerInfo(new ADServerInfo(serverName, partitionFqdn, port, null, 100, AuthType.Kerberos, true), ADServerRole.ConfigurationDomainController); miniTopology.IncrementTopologyVersion(); ADProviderPerf.AddDCInstance(serverName); }
public override void ReportServerDown(string partitionFqdn, string serverName, ADServerRole role) { if (string.IsNullOrEmpty(serverName)) { ExTraceGlobals.TopologyProviderTracer.TraceWarning <string>((long)this.GetHashCode(), "PartitionFqdn {0}. ServerName is null or empty", partitionFqdn); return; } ArgumentValidator.ThrowIfNullOrEmpty("partitionFqdn", partitionFqdn); ArgumentValidator.ThrowIfNullOrEmpty("serverName", serverName); ExTraceGlobals.TopologyProviderTracer.TraceWarning <string, string, ADServerRole>((long)this.GetHashCode(), "PartitionFqdn {0}. {1} is down for role {2}. If this server is part of topology we will bump topology version.", partitionFqdn, serverName, role); LdapTopologyProvider.MiniTopology miniTopology = null; if (!this.topologies.TryGetValue(partitionFqdn, out miniTopology)) { ExTraceGlobals.TopologyProviderTracer.TraceWarning <string>((long)this.GetHashCode(), "PartitionFqdn {0} NOT FOUND.", partitionFqdn); return; } ADServerInfo dcinfo = miniTopology.DCInfo; ADServerInfo cdcinfo = miniTopology.CDCInfo; ADServerInfo gcinfo = miniTopology.GCInfo; ADServerRole adserverRole = ADServerRole.None; if (dcinfo != null && serverName.Equals(dcinfo.Fqdn, StringComparison.OrdinalIgnoreCase)) { miniTopology.ResetServerInfoForRole(ADServerRole.DomainController); adserverRole |= ADServerRole.DomainController; } if (cdcinfo != null && serverName.Equals(cdcinfo.Fqdn, StringComparison.OrdinalIgnoreCase)) { miniTopology.ResetServerInfoForRole(ADServerRole.ConfigurationDomainController); adserverRole |= ADServerRole.ConfigurationDomainController; } if (gcinfo != null && gcinfo.Fqdn.Equals(serverName, StringComparison.OrdinalIgnoreCase)) { miniTopology.ResetServerInfoForRole(ADServerRole.GlobalCatalog); adserverRole |= ADServerRole.GlobalCatalog; } if (adserverRole != ADServerRole.None) { miniTopology.IncrementTopologyVersion(); } ExTraceGlobals.TopologyProviderTracer.TraceDebug <string, ADServerRole, int>((long)this.GetHashCode(), "PartitionFqdn {0}. Role(s) {1} were reported as down. Topology version change {2}.", partitionFqdn, adserverRole, miniTopology.Version); }