public DatabaseLocationInfo GetLocationInfo(Guid mdbGuid, bool bypassCache, bool ignoreSiteBoundary)
        {
            GetServerForDatabaseFlags getServerForDatabaseFlags = GetServerForDatabaseFlags.None;

            if (ignoreSiteBoundary)
            {
                getServerForDatabaseFlags |= GetServerForDatabaseFlags.IgnoreAdSiteBoundary;
            }
            if (bypassCache)
            {
                getServerForDatabaseFlags |= GetServerForDatabaseFlags.ReadThrough;
            }
            DatabaseLocationInfo serverForDatabase;

            try
            {
                serverForDatabase = this.activeManager.GetServerForDatabase(mdbGuid, getServerForDatabaseFlags, this.performanceDataLogger);
            }
            catch (DatabaseNotFoundException innerException)
            {
                throw new MailboxInfoStaleException(string.Format("Mailbox database guid: {0}", mdbGuid), innerException);
            }
            if (serverForDatabase == null || serverForDatabase.RequestResult == DatabaseLocationInfoResult.Unknown)
            {
                throw new DatabaseLocationUnavailableException(ServerStrings.DatabaseLocationNotAvailable(mdbGuid));
            }
            ExTraceGlobals.SessionTracer.TraceDebug <GetServerForDatabaseFlags, DatabaseLocationInfoResult, string>((long)this.GetHashCode(), "DatabaseLocationProvider::GetLocationInfo. flags {0}, result {1}, {2}", getServerForDatabaseFlags, serverForDatabase.RequestResult, serverForDatabase.ServerFqdn);
            return(serverForDatabase);
        }
Ejemplo n.º 2
0
        public DatabaseLocationInfo GetServerForDatabase(Guid databaseId, GetServerForDatabaseFlags gsfdFlags, IPerformanceDataLogger perfLogger)
        {
            ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <Guid, int>((long)this.GetHashCode(), "Entering GetServerForDatabase(Guid={0}, Flags={1})", databaseId, (int)gsfdFlags);
            this.DisposeCheck();
            bool                 flag  = (gsfdFlags & GetServerForDatabaseFlags.BasicQuery) != GetServerForDatabaseFlags.None;
            bool                 flag2 = !flag;
            IADDatabase          database;
            DatabaseLocationInfo databaseLocationInfo;

            using (new StopwatchPerformanceTracker("GetServerForDatabaseGetServerNameForDatabase", perfLogger))
            {
                databaseLocationInfo = this.GetServerNameForDatabase(databaseId, gsfdFlags, perfLogger, out database);
            }
            if (databaseLocationInfo == null || string.IsNullOrEmpty(databaseLocationInfo.ServerFqdn))
            {
                ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <Guid>((long)this.GetHashCode(), "Performing a BasicQuery for Database {0} failed! Falling back to a full query, which performs AD operations", databaseId);
                flag2 = true;
            }
            if (flag2)
            {
                using (new StopwatchPerformanceTracker("GetServerForDatabaseGetServerInformationForDatabase", perfLogger))
                {
                    databaseLocationInfo = this.GetServerInformationForDatabase(databaseId, database, databaseLocationInfo, gsfdFlags, perfLogger);
                }
            }
            return(databaseLocationInfo);
        }
Ejemplo n.º 3
0
        public DatabaseLocationInfo GetServerForDatabase(Guid databaseId, bool ignoreAdSiteBoundary)
        {
            GetServerForDatabaseFlags getServerForDatabaseFlags = GetServerForDatabaseFlags.None;

            if (ignoreAdSiteBoundary)
            {
                getServerForDatabaseFlags |= GetServerForDatabaseFlags.IgnoreAdSiteBoundary;
            }
            return(this.GetServerForDatabase(databaseId, getServerForDatabaseFlags, NullPerformanceDataLogger.Instance));
        }
        // Token: 0x0600003B RID: 59 RVA: 0x00002568 File Offset: 0x00000768
        public string GetDatabaseServerFqdn(Guid mdbGuid, bool forceRediscovery)
        {
            GetServerForDatabaseFlags gsfdFlags = forceRediscovery ? GetServerForDatabaseFlags.ReadThrough : GetServerForDatabaseFlags.None;
            string serverFqdn;

            try
            {
                DatabaseLocationInfo serverForDatabase = ActiveManager.GetCachingActiveManagerInstance().GetServerForDatabase(mdbGuid, gsfdFlags);
                if (serverForDatabase == null)
                {
                    throw new MigrationMailboxDatabaseInfoNotAvailableException(mdbGuid.ToString());
                }
                serverFqdn = serverForDatabase.ServerFqdn;
            }
            catch (ObjectNotFoundException ex)
            {
                string text = string.Format("Server for mailbox with Guid {0} not found in ActiveManager using forceDiscovery set to {1}", mdbGuid, forceRediscovery);
                this.Context.Logger.Log(MigrationEventType.Error, ex, text, new object[0]);
                throw new AnchorDatabaseNotFoundTransientException(mdbGuid.ToString(), ex)
                      {
                          InternalError = text
                      };
            }
            catch (StoragePermanentException exception)
            {
                this.Context.Logger.Log(MigrationEventType.Error, exception, "Server for mailbox with Guid {0} not found in ActiveManager using forceDiscovery set to {1}", new object[]
                {
                    mdbGuid,
                    forceRediscovery
                });
                throw;
            }
            catch (StorageTransientException exception2)
            {
                this.Context.Logger.Log(MigrationEventType.Error, exception2, "Server for mailbox with Guid {0} not found in ActiveManager using forceDiscovery set to {1}", new object[]
                {
                    mdbGuid,
                    forceRediscovery
                });
                throw;
            }
            catch (ServerForDatabaseNotFoundException ex2)
            {
                string text2 = string.Format("Server for mailbox with Guid {0} not found in ActiveManager using forceDiscovery set to {1}", mdbGuid, forceRediscovery);
                this.Context.Logger.Log(MigrationEventType.Error, ex2, text2, new object[0]);
                throw new AnchorServerNotFoundTransientException(mdbGuid.ToString(), ex2)
                      {
                          InternalError = text2
                      };
            }
            return(serverFqdn);
        }
Ejemplo n.º 5
0
        // Token: 0x060007CD RID: 1997 RVA: 0x0001EE80 File Offset: 0x0001D080
        private static bool TryGetActiveServerForDatabase(Guid databaseGuid, GetServerForDatabaseFlags flag, out DatabaseLocationInfo databaseLocationInfo, out Exception activeManagerOperationException)
        {
            databaseLocationInfo            = null;
            activeManagerOperationException = null;
            ActiveManagerOperationResult activeManagerOperationResult = ActiveManager.TryGetCachedServerForDatabaseBasic(databaseGuid, flag, out databaseLocationInfo);

            if (activeManagerOperationResult.Succeeded)
            {
                return(true);
            }
            activeManagerOperationException = activeManagerOperationResult.Exception;
            return(false);
        }
Ejemplo n.º 6
0
        private DatabaseLocationInfo GetServerInformationForDatabase(Guid databaseId, IADDatabase database, DatabaseLocationInfo dbLocationInfo, GetServerForDatabaseFlags gsfdFlags, IPerformanceDataLogger perfLogger)
        {
            if (database != null && databaseId != database.Guid)
            {
                throw new ArgumentException("When passing in database, its GUID must match databaseId.", "database");
            }
            ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <Guid, DatabaseLocationInfo, int>((long)this.GetHashCode(), "Entering GetServerInformationForDatabase(Guid={0}, minimalLocationInfo={1}, Flags={2})", databaseId, dbLocationInfo, (int)gsfdFlags);
            this.DisposeCheck();
            bool flag  = (gsfdFlags & GetServerForDatabaseFlags.IgnoreAdSiteBoundary) != GetServerForDatabaseFlags.None;
            bool flag2 = (gsfdFlags & GetServerForDatabaseFlags.ReadThrough) != GetServerForDatabaseFlags.None;

            if (flag2 || dbLocationInfo.ServerLegacyDN == null)
            {
                if (database == null)
                {
                    AdObjectLookupFlags flags = flag2 ? AdObjectLookupFlags.ReadThrough : AdObjectLookupFlags.None;
                    using (new StopwatchPerformanceTracker("GetServerInformationForDatabaseGetDatabaseByGuidEx", perfLogger))
                    {
                        database = this.GetDatabaseByGuidEx(databaseId, flags, perfLogger);
                    }
                }
                ActiveManagerImplementation.GetServerInformationForDatabaseInternal(database, dbLocationInfo, this.m_miniServerLookup);
            }
            if (dbLocationInfo != null)
            {
                DatabaseLocationInfoResult databaseLocationInfoResult = dbLocationInfo.RequestResult;
                bool flag3 = false;
                if (flag && databaseLocationInfoResult == DatabaseLocationInfoResult.SiteViolation)
                {
                    databaseLocationInfoResult = DatabaseLocationInfoResult.Success;
                    flag3 = true;
                }
                if (flag && databaseLocationInfoResult == DatabaseLocationInfoResult.InTransitCrossSite)
                {
                    databaseLocationInfoResult = DatabaseLocationInfoResult.InTransitSameSite;
                    flag3 = true;
                }
                ExTraceGlobals.FaultInjectionTracer.TraceTest <DatabaseLocationInfoResult>(3831901501U, ref databaseLocationInfoResult);
                ExTraceGlobals.FaultInjectionTracer.TraceTest <bool>(2221288765U, ref flag3);
                if (flag3)
                {
                    ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <DatabaseLocationInfoResult, DatabaseLocationInfoResult>((long)this.GetHashCode(), "GetServerForDatabase(): At the caller's request, changing the location info's result from {0} to {1}.", dbLocationInfo.RequestResult, databaseLocationInfoResult);
                    dbLocationInfo = DatabaseLocationInfo.CloneDatabaseLocationInfo(dbLocationInfo, databaseLocationInfoResult);
                }
            }
            if (ExTraceGlobals.ActiveManagerClientTracer.IsTraceEnabled(TraceType.DebugTrace))
            {
                ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <Guid, DatabaseLocationInfo>((long)this.GetHashCode(), "Database Location Info ({0}) = {1}", databaseId, dbLocationInfo);
            }
            ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <Guid>((long)this.GetHashCode(), "Exiting GetServerInformationForDatabase(Guid={0})", databaseId);
            return(dbLocationInfo);
        }
Ejemplo n.º 7
0
        private DatabaseLocationInfo GetServerNameForDatabase(Guid databaseId, GetServerForDatabaseFlags gsfdFlags, IPerformanceDataLogger perfLogger, out IADDatabase database)
        {
            ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <Guid, GetServerForDatabaseFlags>((long)this.GetHashCode(), "Entering GetServerNameForDatabase. databaseId = {0}, gsfdFlags = {1}", databaseId, gsfdFlags);
            this.DisposeCheck();
            database = null;
            DatabaseLocationInfo databaseLocationInfo;

            if (!this.GetDbLocationInfoByRegistry(databaseId, out databaseLocationInfo))
            {
                bool throwOnErrors = (gsfdFlags & GetServerForDatabaseFlags.ThrowServerForDatabaseNotFoundException) != GetServerForDatabaseFlags.None;
                bool flag          = (gsfdFlags & GetServerForDatabaseFlags.ReadThrough) == GetServerForDatabaseFlags.ReadThrough;
                if (flag)
                {
                    this.m_perfCounters.GetServerForDatabaseClientCallsWithReadThrough.Increment();
                }
                if (this.m_isCacheEnabled && !flag)
                {
                    databaseLocationInfo = this.m_dbCache.Find(databaseId);
                    if (databaseLocationInfo == null)
                    {
                        ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <Guid>((long)this.GetHashCode(), "Database {0} not in the cache.", databaseId);
                        this.m_perfCounters.GetServerForDatabaseClientCacheMisses.Increment();
                    }
                    else
                    {
                        this.m_perfCounters.GetServerForDatabaseClientCacheHits.Increment();
                    }
                }
                this.m_perfCounters.GetServerForDatabaseClientCalls.Increment();
                this.m_perfCounters.GetServerForDatabaseClientCallsPerSec.Increment();
                lock (this.m_uniqueDatabasesSeen)
                {
                    this.m_uniqueDatabasesSeen.Add(databaseId);
                    try
                    {
                        this.m_perfCounters.GetServerForDatabaseClientUniqueDatabases.RawValue = (long)this.m_uniqueDatabasesSeen.Count;
                    }
                    catch (InvalidOperationException)
                    {
                        ExTraceGlobals.ActiveManagerClientTracer.TraceError((long)this.GetHashCode(), "Perf counters are broken. Please use lodctr to add them back");
                    }
                }
                if (databaseLocationInfo == null)
                {
                    using (new StopwatchPerformanceTracker("GetServerNameForDatabaseGetDatabaseByGuidEx", perfLogger))
                    {
                        database = this.GetDatabaseByGuidEx(databaseId, flag ? AdObjectLookupFlags.ReadThrough : AdObjectLookupFlags.None, perfLogger);
                    }
                    using (new StopwatchPerformanceTracker("GetServerNameForDatabaseLookupDatabaseAndPossiblyPopulateCache", perfLogger))
                    {
                        databaseLocationInfo = this.LookupDatabaseAndPossiblyPopulateCache(database, throwOnErrors);
                    }
                }
                ExTraceGlobals.ActiveManagerClientTracer.TraceDebug <Guid, DatabaseLocationInfo>((long)this.GetHashCode(), "Database Location Info ({0}) = {1}", databaseId, databaseLocationInfo);
            }
            lock (this.m_uniqueServersSeen)
            {
                if (databaseLocationInfo != null && databaseLocationInfo.ServerFqdn != null)
                {
                    this.m_uniqueServersSeen.Add(databaseLocationInfo.ServerFqdn);
                }
                try
                {
                    this.m_perfCounters.GetServerForDatabaseClientUniqueServers.RawValue = (long)this.m_uniqueServersSeen.Count;
                }
                catch (InvalidOperationException)
                {
                    ExTraceGlobals.ActiveManagerClientTracer.TraceError((long)this.GetHashCode(), "Perf counters are broken. Please use lodctr to add them back");
                }
            }
            ExTraceGlobals.ActiveManagerClientTracer.TraceFunction <Guid>((long)this.GetHashCode(), "Exiting GetServerNameForDatabase. databaseId = {0}", databaseId);
            return(databaseLocationInfo);
        }
Ejemplo n.º 8
0
 public DatabaseLocationInfo GetServerForDatabase(Guid databaseId, GetServerForDatabaseFlags gsfdFlags)
 {
     return(this.GetServerForDatabase(databaseId, gsfdFlags, NullPerformanceDataLogger.Instance));
 }
Ejemplo n.º 9
0
        public static ActiveManagerOperationResult TryGetCachedServerForDatabaseBasic(Guid mdbGuid, GetServerForDatabaseFlags gsfdFlags, out DatabaseLocationInfo databaseLocationInfo)
        {
            Exception ex = null;

            databaseLocationInfo = null;
            ActiveManager cachingActiveManagerInstance = ActiveManager.GetCachingActiveManagerInstance();

            try
            {
                databaseLocationInfo = cachingActiveManagerInstance.GetServerForDatabase(mdbGuid, gsfdFlags, NullPerformanceDataLogger.Instance);
                return(new ActiveManagerOperationResult(true, ex));
            }
            catch (DatabaseNotFoundException ex2)
            {
                ex = ex2;
            }
            catch (ObjectNotFoundException ex3)
            {
                ex = ex3;
            }
            catch (StoragePermanentException ex4)
            {
                ex = ex4;
            }
            catch (StorageTransientException ex5)
            {
                ex = ex5;
            }
            catch (ServerForDatabaseNotFoundException ex6)
            {
                ex = ex6;
            }
            return(new ActiveManagerOperationResult(false, ex));
        }
Ejemplo n.º 10
0
        public static DatabaseInformation FindServerForMdb(Guid mdbGuid, string dcName, NetworkCredential cred, FindServerFlags flags)
        {
            Guid systemMailboxGuid = Guid.Empty;

            if (flags.HasFlag(FindServerFlags.FindSystemMailbox))
            {
                systemMailboxGuid = MapiUtils.GetSystemMailboxGuid(mdbGuid, dcName, cred, flags);
            }
            if (cred == null)
            {
                try
                {
                    GetServerForDatabaseFlags getServerForDatabaseFlags = GetServerForDatabaseFlags.IgnoreAdSiteBoundary;
                    if (flags.HasFlag(FindServerFlags.ForceRediscovery))
                    {
                        MrsTracer.Common.Debug("Looking up MDB {0} with rediscovery", new object[]
                        {
                            mdbGuid
                        });
                        getServerForDatabaseFlags |= GetServerForDatabaseFlags.ReadThrough;
                    }
                    DatabaseLocationInfo serverForDatabase = ActiveManager.GetCachingActiveManagerInstance().GetServerForDatabase(mdbGuid, getServerForDatabaseFlags);
                    if (serverForDatabase != null)
                    {
                        return(DatabaseInformation.FromDatabaseLocationInfo(mdbGuid, serverForDatabase, systemMailboxGuid));
                    }
                }
                catch (ObjectNotFoundException)
                {
                }
                MrsTracer.Common.Debug("ActiveManager was unable to locate MDB {0}, will search AD instead.", new object[]
                {
                    mdbGuid
                });
            }
            ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(dcName, true, ConsistencyMode.PartiallyConsistent, cred, ADSessionSettings.FromRootOrgScopeSet(), 686, "FindServerForMdb", "f:\\15.00.1497\\sources\\dev\\mrs\\src\\Common\\MapiUtils.cs");
            Database database = topologyConfigurationSession.FindDatabaseByGuid <Database>(mdbGuid);

            if (database == null)
            {
                MrsTracer.Common.Error("Unable to locate MDB by guid {0}", new object[]
                {
                    mdbGuid
                });
                if (!flags.HasFlag(FindServerFlags.AllowMissing))
                {
                    throw new DatabaseNotFoundByGuidPermanentException(mdbGuid);
                }
                return(DatabaseInformation.Missing(mdbGuid, PartitionId.LocalForest.ForestFQDN));
            }
            else
            {
                PropertyDefinition[] properties = new PropertyDefinition[]
                {
                    ServerSchema.ExchangeLegacyDN,
                    ServerSchema.Fqdn,
                    ServerSchema.ServerSite,
                    ServerSchema.VersionNumber,
                    ActiveDirectoryServerSchema.MailboxRelease
                };
                MiniServer miniServer = topologyConfigurationSession.ReadMiniServer(database.Server, properties);
                if (miniServer != null)
                {
                    return(DatabaseInformation.FromAD(database, miniServer, systemMailboxGuid));
                }
                MrsTracer.Common.Error("Unable to locate DB server {0}", new object[]
                {
                    database.Server.DistinguishedName
                });
                if ((flags & FindServerFlags.AllowMissing) == FindServerFlags.None)
                {
                    throw new UnexpectedErrorPermanentException(-2147221233);
                }
                return(DatabaseInformation.Missing(mdbGuid, PartitionId.LocalForest.ForestFQDN));
            }
        }