private void WriteCopyStatusResultIfAppropriate(DatabaseCopyStatusEntry statusEntry) { if (!this.Active || statusEntry.ActiveCopy) { this.WriteResult(statusEntry); } }
private static void UpdateBackupInfo(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus) { entry.m_latestFullBackupTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestFullBackupTime); DateTime?dateTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestIncrementalBackupTime); if (dateTime != null && dateTime.Value >= entry.m_latestFullBackupTime) { entry.m_latestIncrementalBackupTime = dateTime; } dateTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestDifferentialBackupTime); if (dateTime != null && dateTime.Value >= entry.m_latestFullBackupTime) { entry.m_latestDifferentialBackupTime = dateTime; } entry.m_latestCopyBackupTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestCopyBackupTime); if (entry.m_latestFullBackupTime != null) { entry.m_snapshotLatestFullBackup = new bool?(copyStatus.SnapshotLatestFullBackup); entry.m_snapshotBackup = new bool?(copyStatus.SnapshotLatestFullBackup); } if (entry.m_latestIncrementalBackupTime != null) { entry.m_snapshotLatestIncrementalBackup = new bool?(copyStatus.SnapshotLatestIncrementalBackup); } if (entry.m_latestDifferentialBackupTime != null) { entry.m_snapshotLatestDifferentialBackup = new bool?(copyStatus.SnapshotLatestDifferentialBackup); } if (entry.m_latestCopyBackupTime != null) { entry.m_snapshotLatestCopyBackup = new bool?(copyStatus.SnapshotLatestCopyBackup); } }
private static void UpdateDatabaseSeedStatus(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus) { if (copyStatus.CopyStatus == CopyStatusEnum.Seeding) { DatabaseSeedStatus dbSeedStatus = new DatabaseSeedStatus(copyStatus.DbSeedingPercent, copyStatus.DbSeedingKBytesRead, copyStatus.DbSeedingKBytesWritten, copyStatus.DbSeedingKBytesReadPerSec, copyStatus.DbSeedingKBytesWrittenPerSec); entry.m_dbSeedStatus = dbSeedStatus; } }
private static void UpdateReplayLagStatus(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus) { if (copyStatus.ReplayLagEnabled != ReplayLagEnabledEnum.Unknown) { ReplayLagStatus replayLagStatus = new ReplayLagStatus(copyStatus.ReplayLagEnabled == ReplayLagEnabledEnum.Enabled, copyStatus.ConfiguredReplayLagTime, copyStatus.ActualReplayLagTime, copyStatus.ReplayLagPercentage, GetMailboxDatabaseCopyStatus.ConvertLagPlayDownReason(copyStatus.ReplayLagPlayDownReason), copyStatus.ReplayLagDisabledReason); entry.m_replayLagStatus = replayLagStatus; } }
private void UpdateCopyStatusNoReplicaInstance(DatabaseCopyStatusEntry status) { status.Status = CopyStatus.Unknown; Exception ex = new ReplayServiceRpcUnknownInstanceException(); status.m_extendedErrorInfo = new ExtendedErrorInfo(ex); status.m_errorMessage = ex.Message; }
private void UpdateMisconfiguredCopyStatusEntry(DatabaseCopyStatusEntry status, DatabaseCopy databaseCopy) { status.Status = CopyStatus.Misconfigured; ValidationError[] array = databaseCopy.ValidateRead(); if (array.Length > 0) { Exception ex = new DataValidationException(array[0]); status.m_extendedErrorInfo = new ExtendedErrorInfo(ex); status.m_errorMessage = ex.Message; } }
private static void UpdateDumpsterRequests(DatabaseCopyStatusEntry entry, RpcDatabaseCopyStatus2 copyStatus) { List <DumpsterRequestEntry> list = new List <DumpsterRequestEntry>(); if (copyStatus.DumpsterRequired && !string.IsNullOrEmpty(copyStatus.DumpsterServers)) { string[] array = copyStatus.DumpsterServers.Split(new char[] { ',' }); if (array != null && array.Length > 0) { foreach (string server in array) { list.Add(new DumpsterRequestEntry(server, copyStatus.DumpsterStartTime, copyStatus.DumpsterEndTime)); } } } entry.m_outstandingDumpsterRequests = new DumpsterRequestEntry[list.Count]; list.CopyTo(entry.m_outstandingDumpsterRequests); }
internal static void GetEntryFromStatus(RpcDatabaseCopyStatus2 copyStatus, DatabaseCopyStatusEntry entry) { CopyStatusEnum copyStatus2 = copyStatus.CopyStatus; CopyStatus copyStatus3 = GetMailboxDatabaseCopyStatus.TranslateRpcStatusToTaskStatus(copyStatus2); entry.Status = copyStatus3; entry.m_statusRetrievedTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.StatusRetrievedTime); entry.m_lastStatusTransitionTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastStatusTransitionTime); entry.InstanceStartTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.InstanceStartTime); entry.m_errorMessage = copyStatus.ErrorMessage; entry.m_errorEventId = ((copyStatus.ErrorEventId != 0U) ? new uint?(copyStatus.ErrorEventId) : null); entry.m_extendedErrorInfo = copyStatus.ExtendedErrorInfo; if (copyStatus3 == CopyStatus.Suspended || copyStatus3 == CopyStatus.FailedAndSuspended || copyStatus3 == CopyStatus.Seeding) { entry.m_suspendMessage = copyStatus.SuspendComment; } entry.m_singlePageRestore = copyStatus.SinglePageRestoreNumber; entry.m_mailboxServer = copyStatus.MailboxServer; entry.m_activeDatabaseCopy = copyStatus.ActiveDatabaseCopy; entry.m_actionInitiator = copyStatus.ActionInitiator; entry.ActiveCopy = copyStatus.IsActiveCopy(); if (copyStatus.ActivationPreference > 0) { entry.ActivationPreference = new int?(copyStatus.ActivationPreference); } entry.IsLastCopyAvailabilityChecksPassed = new bool?(copyStatus.IsLastCopyAvailabilityChecksPassed); entry.IsLastCopyRedundancyChecksPassed = new bool?(copyStatus.IsLastCopyRedundancyChecksPassed); entry.LastCopyAvailabilityChecksPassedTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyAvailabilityChecksPassedTime); entry.LastCopyRedundancyChecksPassedTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyRedundancyChecksPassedTime); entry.DiskFreeSpacePercent = copyStatus.DiskFreeSpacePercent; entry.DiskFreeSpace = ByteQuantifiedSize.FromBytes(copyStatus.DiskFreeSpaceBytes); entry.DiskTotalSpace = ByteQuantifiedSize.FromBytes(copyStatus.DiskTotalSpaceBytes); entry.ExchangeVolumeMountPoint = copyStatus.ExchangeVolumeMountPoint; entry.DatabaseVolumeMountPoint = copyStatus.DatabaseVolumeMountPoint; entry.DatabaseVolumeName = copyStatus.DatabaseVolumeName; entry.DatabasePathIsOnMountedFolder = new bool?(copyStatus.DatabasePathIsOnMountedFolder); entry.LogVolumeMountPoint = copyStatus.LogVolumeMountPoint; entry.LogVolumeName = copyStatus.LogVolumeName; entry.LogPathIsOnMountedFolder = new bool?(copyStatus.LogPathIsOnMountedFolder); entry.LastDatabaseVolumeName = copyStatus.LastDatabaseVolumeName; entry.LastDatabaseVolumeNameTransitionTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastDatabaseVolumeNameTransitionTime); entry.VolumeInfoError = copyStatus.VolumeInfoLastError; entry.m_activationSuspended = copyStatus.ActivationSuspended; if (copyStatus.ActivationSuspended) { entry.m_suspendMessage = copyStatus.SuspendComment; } entry.m_latestAvailableLogTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LatestAvailableLogTime); entry.m_latestCopyNotificationTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopyNotifiedLogTime); entry.m_latestCopyTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastCopiedLogTime); entry.m_latestInspectorTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastInspectedLogTime); entry.m_latestReplayTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastReplayedLogTime); entry.m_latestLogGenerationNumber = copyStatus.LastLogGenerated; entry.m_copyNotificationGenerationNumber = copyStatus.LastLogCopyNotified; entry.m_copyGenerationNumber = copyStatus.LastLogCopied; entry.m_inspectorGenerationNumber = copyStatus.LastLogInspected; entry.m_replayGenerationNumber = copyStatus.LastLogReplayed; entry.m_contentIndexState = copyStatus.ContentIndexStatus; entry.m_contentIndexErrorMessage = copyStatus.ContentIndexErrorMessage; entry.m_contentIndexErrorCode = copyStatus.ContentIndexErrorCode; entry.m_contentIndexVersion = copyStatus.ContentIndexVersion; entry.m_contentIndexBacklog = copyStatus.ContentIndexBacklog; entry.m_contentIndexRetryQueueSize = copyStatus.ContentIndexRetryQueueSize; entry.m_contentIndexMailboxesToCrawl = copyStatus.ContentIndexMailboxesToCrawl; entry.m_contentIndexSeedingPercent = copyStatus.ContentIndexSeedingPercent; entry.m_contentIndexSeedingSource = copyStatus.ContentIndexSeedingSource; entry.m_logCopyQueueIncreasing = new bool?(copyStatus.CopyQueueNotKeepingUp); entry.m_logReplayQueueIncreasing = new bool?(copyStatus.ReplayQueueNotKeepingUp); entry.m_replaySuspended = new bool?(copyStatus.ReplaySuspended); entry.ResumeBlocked = new bool?(copyStatus.ResumeBlocked); entry.ReseedBlocked = new bool?(copyStatus.ReseedBlocked); if (copyStatus.WorkerProcessId != 0) { entry.m_workerProcessId = new int?(copyStatus.WorkerProcessId); } entry.LastLogInfoIsStale = copyStatus.LastLogInfoIsStale; entry.LastLogInfoFromCopierTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastLogInfoFromCopierTime); entry.LastLogInfoFromClusterTime = DumpsterStatisticsEntry.ToNullableLocalDateTime(copyStatus.LastLogInfoFromClusterTime); entry.LastLogInfoFromClusterGen = copyStatus.LastLogInfoFromClusterGen; entry.LowestLogPresent = copyStatus.LowestLogPresent; entry.m_logsReplayedSinceInstanceStart = new long?(copyStatus.LogsReplayedSinceInstanceStart); entry.m_logsCopiedSinceInstanceStart = new long?(copyStatus.LogsCopiedSinceInstanceStart); entry.ReplicationIsInBlockMode = copyStatus.ReplicationIsInBlockMode; entry.ActivationDisabledAndMoveNow = copyStatus.ActivationDisabledAndMoveNow; entry.AutoActivationPolicy = (DatabaseCopyAutoActivationPolicyType)copyStatus.AutoActivationPolicy; int num = copyStatus.MinimumSupportedDatabaseSchemaVersion; if (num > 0) { entry.MinimumSupportedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535); } num = copyStatus.MaximumSupportedDatabaseSchemaVersion; if (num > 0) { entry.MaximumSupportedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535); } num = copyStatus.RequestedDatabaseSchemaVersion; if (num > 0) { entry.RequestedDatabaseSchemaVersion = string.Format("{0}.{1}", num >> 16, num & 65535); } GetMailboxDatabaseCopyStatus.UpdateReplayLagStatus(entry, copyStatus); GetMailboxDatabaseCopyStatus.UpdateDatabaseSeedStatus(entry, copyStatus); GetMailboxDatabaseCopyStatus.UpdateBackupInfo(entry, copyStatus); GetMailboxDatabaseCopyStatus.UpdateDumpsterRequests(entry, copyStatus); if (copyStatus.OutgoingConnections != null) { entry.m_outgoingConnections = (ConnectionStatus[])Serialization.BytesToObject(copyStatus.OutgoingConnections); } if (copyStatus.IncomingLogCopyingNetwork != null) { entry.m_incomingLogCopyingNetwork = (ConnectionStatus)Serialization.BytesToObject(copyStatus.IncomingLogCopyingNetwork); } if (copyStatus.SeedingNetwork != null) { entry.m_seedingNetwork = (ConnectionStatus)Serialization.BytesToObject(copyStatus.SeedingNetwork); } entry.MaxLogToReplay = copyStatus.MaxLogToReplay; }
private DatabaseCopyStatusEntry[] PrepareStatusEntryFromRpc(Server server, Collection <DatabaseCopy> databaseCopies) { DatabaseCopyStatusEntry[] array = new DatabaseCopyStatusEntry[databaseCopies.Count]; Guid[] array2 = new Guid[databaseCopies.Count]; for (int i = 0; i < databaseCopies.Count; i++) { DatabaseCopy databaseCopy3 = databaseCopies[i]; Database database = databaseCopy3.GetDatabase <Database>(); array2[i] = database.Guid; array[i] = this.ConstructNewSatusEntry(databaseCopy3); } RpcGetDatabaseCopyStatusFlags2 rpcGetDatabaseCopyStatusFlags = RpcGetDatabaseCopyStatusFlags2.None; if (!this.UseServerCache) { rpcGetDatabaseCopyStatusFlags |= RpcGetDatabaseCopyStatusFlags2.ReadThrough; } try { IEnumerable <string> source = from databaseCopy in databaseCopies select databaseCopy.DatabaseName; base.WriteVerbose(Strings.GetDbcsRpcQuery(server.Fqdn, string.Join(",", source.ToArray <string>()))); RpcDatabaseCopyStatus2[] copyStatus = ReplayRpcClientHelper.GetCopyStatus(server.Fqdn, rpcGetDatabaseCopyStatusFlags, array2); if (copyStatus != null && copyStatus.Length > 0) { base.WriteVerbose(Strings.GetDbcsRpcQueryAllDone(copyStatus.Length)); Dictionary <Guid, RpcDatabaseCopyStatus2> dictionary = new Dictionary <Guid, RpcDatabaseCopyStatus2>(copyStatus.Length); for (int j = 0; j < copyStatus.Length; j++) { dictionary[copyStatus[j].DBGuid] = copyStatus[j]; } for (int k = 0; k < array2.Length; k++) { RpcDatabaseCopyStatus2 copyStatus2; if (dictionary.TryGetValue(array2[k], out copyStatus2)) { GetMailboxDatabaseCopyStatus.GetEntryFromStatus(copyStatus2, array[k]); } else if (!databaseCopies[k].IsValid) { ExTraceGlobals.CmdletsTracer.TraceDebug <Guid, string>((long)this.GetHashCode(), "GetCopyStatus() didn't find replica instance for database {0} on server {1}. The DatabaseCopy is misconfigured in the Active Directory!", array2[k], server.Fqdn); this.UpdateMisconfiguredCopyStatusEntry(array[k], databaseCopies[k]); } else { ExTraceGlobals.CmdletsTracer.TraceDebug <Guid, string>((long)this.GetHashCode(), "GetCopyStatus() didn't find replica instance for database {0} on server {1}.", array2[k], server.Fqdn); this.UpdateCopyStatusNoReplicaInstance(array[k]); } } } } catch (ArgumentException ex) { ExTraceGlobals.CmdletsTracer.TraceError <ArgumentException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ArgumentException: {0}", ex); this.WriteError(ex, ErrorCategory.ReadError, null, false); } catch (TaskServerTransientException ex2) { ExTraceGlobals.CmdletsTracer.TraceError <TaskServerTransientException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ArgumentException: {0}", ex2); this.WriteError(ex2, ErrorCategory.ReadError, null, false); } catch (TaskServerException ex3) { ExTraceGlobals.CmdletsTracer.TraceError <TaskServerException>((long)this.GetHashCode(), "GetMailboxDatabaseCopyStatus: ReplayServiceRpcException: {0}", ex3); if (ex3 is ReplayServiceDownException) { base.WriteVerbose(Strings.GetDbcsDetectReplayServiceDown(server.Fqdn, ex3.Message)); for (int l = 0; l < array.Length; l++) { DatabaseCopyStatusEntry databaseCopyStatusEntry = array[l]; DatabaseCopy databaseCopy2 = databaseCopies[l]; if (!databaseCopy2.IsValid) { this.UpdateMisconfiguredCopyStatusEntry(databaseCopyStatusEntry, databaseCopy2); } else { databaseCopyStatusEntry.Status = CopyStatus.ServiceDown; databaseCopyStatusEntry.m_errorMessage = ex3.Message; databaseCopyStatusEntry.m_extendedErrorInfo = new ExtendedErrorInfo(ex3); } } } else if (ex3 is ReplayServiceRpcUnknownInstanceException) { ExTraceGlobals.CmdletsTracer.TraceDebug <string>((long)this.GetHashCode(), "GetCopyStatus() was not able to find any replica instances on server {0}.", server.Fqdn); for (int m = 0; m < array.Length; m++) { if (!databaseCopies[m].IsValid) { this.UpdateMisconfiguredCopyStatusEntry(array[m], databaseCopies[m]); } else { this.UpdateCopyStatusNoReplicaInstance(array[m]); } } } else { this.WriteError(ex3, ErrorCategory.ReadError, null, false); } } return(array); }
protected override void WriteResult <T>(IEnumerable <T> dataObjects) { TaskLogger.LogEnter(new object[] { dataObjects }); Dictionary <string, Collection <DatabaseCopy> > dictionary = new Dictionary <string, Collection <DatabaseCopy> >(); foreach (T t in dataObjects) { IConfigurable configurable = t; DatabaseCopy databaseCopy = configurable as DatabaseCopy; string key; if (this.m_server != null) { key = this.m_server.Name; } else { key = databaseCopy.HostServerName; } Collection <DatabaseCopy> collection; if (!dictionary.TryGetValue(key, out collection)) { collection = new Collection <DatabaseCopy>(); dictionary.Add(key, collection); } collection.Add(databaseCopy); } using (Dictionary <string, Collection <DatabaseCopy> > .KeyCollection.Enumerator enumerator2 = dictionary.Keys.GetEnumerator()) { while (enumerator2.MoveNext()) { string dbCopyServerName = enumerator2.Current; Collection <DatabaseCopy> collection2 = dictionary[dbCopyServerName]; Server server2; if (this.m_server != null) { server2 = this.m_server; } else { MailboxServerIdParameter mailboxServerIdParameter = MailboxServerIdParameter.Parse(dbCopyServerName); IEnumerable <Server> objects = mailboxServerIdParameter.GetObjects <Server>(this.RootId, this.ConfigurationSession); server2 = objects.FirstOrDefault((Server server) => server.Name.Equals(dbCopyServerName, StringComparison.OrdinalIgnoreCase)); } if (server2 != null) { if (ReplayRpcVersionControl.IsGetCopyStatusEx2RpcSupported(server2.AdminDisplayVersion)) { DatabaseCopyStatusEntry[] array = this.PrepareStatusEntryFromRpc(server2, collection2); for (int i = 0; i < array.Length; i++) { this.WriteCopyStatusResultIfAppropriate(array[i]); } } else { this.WriteError(new InvalidOperationException(Strings.GetDbcsRpcNotSupported(server2.Name, server2.AdminDisplayVersion.ToString(), ReplayRpcVersionControl.GetCopyStatusEx2SupportVersion.ToString())), ErrorCategory.InvalidOperation, server2.Identity, false); } } else { foreach (DatabaseCopy databaseCopy2 in collection2) { DatabaseCopyStatusEntry databaseCopyStatusEntry = this.ConstructNewSatusEntry(databaseCopy2); this.UpdateMisconfiguredCopyStatusEntry(databaseCopyStatusEntry, databaseCopy2); this.WriteCopyStatusResultIfAppropriate(databaseCopyStatusEntry); } } } } TaskLogger.LogExit(); }