예제 #1
0
        private void Run()
        {
            AutoReseedManager.Tracer.TraceDebug((long)this.GetHashCode(), "AutoReseedManager: Entering Run()...");
            this.ResetState();
            IMonitoringADConfig config = this.m_adConfigProvider.GetConfig(true);

            if (MountPointUtil.IsConfigureMountPointsEnabled())
            {
                AutoReseedManager.Tracer.TraceDebug((long)this.GetHashCode(), "AutoReseedManager: Skipping running AutoReseedManager because regkey '{0}' is enabled.");
                return;
            }
            if (config.ServerRole == MonitoringServerRole.Standalone)
            {
                AutoReseedManager.Tracer.TraceDebug((long)this.GetHashCode(), "AutoReseedManager: Skipping running AutoReseedManager because local server is not a member of a DAG.");
                return;
            }
            if (!config.Dag.AutoDagAutoReseedEnabled)
            {
                AutoReseedManager.Tracer.TraceDebug <string>((long)this.GetHashCode(), "AutoReseedManager: Skipping running AutoReseedManager because the local DAG '{0}' has AutoDagAutoReseedEnabled set to disabled.", config.Dag.Name);
                return;
            }
            if (DiskReclaimerManager.ShouldSkipDueToServerNotConfigured(config.TargetMiniServer))
            {
                AutoReseedManager.Tracer.TraceDebug <AmServerName>((long)this.GetHashCode(), "AutoReseedManager: Skipping running AutoReseedManager because the local server '{0}' is not yet fully configured in the AD.", config.TargetServerName);
                return;
            }
            this.m_volumeManager.Refresh(config);
            IEnumerable <IADDatabase> enumerable = config.DatabaseMap[config.TargetServerName];

            foreach (IADDatabase db in enumerable)
            {
                this.ProcessDatabase(db, enumerable, config);
            }
        }
예제 #2
0
        // Token: 0x06001D6B RID: 7531 RVA: 0x000854DC File Offset: 0x000836DC
        private bool IsFileBinaryEqual(string filename1, string filename2, out Exception ex)
        {
            bool isEqual = false;

            ex = MountPointUtil.HandleIOExceptions(delegate
            {
                isEqual = IncrementalReseeder.IsFileBinaryEqual(filename1, filename2);
            });
            return(isEqual);
        }
예제 #3
0
        private void UpdateVolumeForNeverMountedActives(IMonitoringADConfig adConfig)
        {
            IEnumerable <IADDatabase> enumerable = adConfig.DatabaseMap[adConfig.TargetServerName];
            IEnumerable <CopyStatusClientCachedEntry> copyStatusesByServer = this.m_statusLookup.GetCopyStatusesByServer(adConfig.TargetServerName, enumerable, CopyStatusClientLookupFlags.None);
            Exception          ex = null;
            List <IADDatabase> neverMountedActives = this.m_volumeManager.GetNeverMountedActives(enumerable, adConfig, copyStatusesByServer);

            if (neverMountedActives != null && neverMountedActives.Count > 0)
            {
                ICollection <string> source = from db in neverMountedActives
                                              select db.Name;
                DiskReclaimerManager.Tracer.TraceDebug <int, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() Number of never mounted active databases missing volume = {0}. Databases: '{1}'", neverMountedActives.Count, string.Join(",", source.ToArray <string>()));
                ReplayCrimsonEvents.DiskReclaimerNeverMountedActives.Log <int, string>(neverMountedActives.Count, string.Join(",", source.ToArray <string>()));
            }
            foreach (IADDatabase iaddatabase in neverMountedActives)
            {
                bool flag = false;
                DatabaseVolumeInfo instance = DatabaseVolumeInfo.GetInstance(iaddatabase.EdbFilePath.PathName, iaddatabase.LogFolderPath.PathName, iaddatabase.Name, adConfig.Dag.AutoDagVolumesRootFolderPath.PathName, adConfig.Dag.AutoDagDatabasesRootFolderPath.PathName, adConfig.Dag.AutoDagDatabaseCopiesPerVolume);
                if (instance.IsValid && MountPointUtil.IsDirectoryAccessibleMountPoint(instance.DatabaseVolumeMountPoint.Path, out ex))
                {
                    flag = true;
                }
                else
                {
                    ReplayCrimsonEvents.DiskReclaimerNeverMountedActiveMissingVolume.Log <string>(iaddatabase.Name);
                    if (this.m_volumeManager.FixActiveDatabaseMountPoint(iaddatabase, enumerable, adConfig, out ex, true))
                    {
                        flag = true;
                        this.m_volumeManager.UpdateVolumeInfoCopyState(iaddatabase.Guid, this.m_replicaInstanceManager);
                    }
                    else
                    {
                        DiskReclaimerManager.Tracer.TraceError <string, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() failed to fix up active database: '{0}' mountpoint. Error: {1}", iaddatabase.Name, AmExceptionHelper.GetExceptionMessageOrNoneString(ex));
                        ReplayCrimsonEvents.DiskReclaimerFixActiveMountPointError.Log <string, string>(iaddatabase.Name, ex.Message);
                    }
                }
                if (flag)
                {
                    ex = this.MountDatabaseWrapper(iaddatabase);
                    if (ex != null)
                    {
                        DiskReclaimerManager.Tracer.TraceError <string, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() failed to mount active database: '{0}' mountpoint. Error: {1}", iaddatabase.Name, ex.Message);
                        ReplayCrimsonEvents.DiskReclaimerMountActiveDatabaseError.Log <string, string>(iaddatabase.Name, ex.Message);
                    }
                }
            }
            ReplayCrimsonEvents.DiskReclaimerFixActiveMountPointCompleted.Log <string>(adConfig.TargetServerName.NetbiosName);
            this.m_volumeManager.Refresh(adConfig);
        }
 private void EnumerateFilesForDirectory(TopNList <DirectorySpaceEnumerator.DirectorySize> topDirsBySize, string dir)
 {
     MountPointUtil.HandleIOExceptions(delegate
     {
         DirectoryInfo path = new DirectoryInfo(dir);
         using (DirectoryEnumerator directoryEnumerator = new DirectoryEnumerator(path, false, false))
         {
             ulong num = 0UL;
             string text;
             NativeMethods.WIN32_FIND_DATA win32_FIND_DATA;
             while (directoryEnumerator.GetNextFileExtendedInfo("*", out text, out win32_FIND_DATA))
             {
                 ulong longFileSize = this.GetLongFileSize(win32_FIND_DATA.FileSizeLow, win32_FIND_DATA.FileSizeHigh);
                 num += longFileSize;
             }
             this.InsertIfNecessary(topDirsBySize, dir, num);
         }
     });
 }
        private IEnumerable <DirectorySpaceEnumerator.DirectorySize> GetTopNDirectories()
        {
            TopNList <DirectorySpaceEnumerator.DirectorySize> topDirsBySize = new TopNList <DirectorySpaceEnumerator.DirectorySize>(this.m_maxDirectories, Dependencies.Assert);

            MountPointUtil.HandleIOExceptions(delegate
            {
                DirectoryInfo path = new DirectoryInfo(this.m_rootDirectory);
                using (DirectoryEnumerator directoryEnumerator = new DirectoryEnumerator(path, true, true))
                {
                    Predicate <NativeMethods.WIN32_FIND_DATA> extendedFilter = (NativeMethods.WIN32_FIND_DATA findData) => (findData.FileAttributes & NativeMethods.FileAttributes.ReparsePoint) == NativeMethods.FileAttributes.None;
                    foreach (string dir in directoryEnumerator.EnumerateDirectories("*", extendedFilter))
                    {
                        this.EnumerateFilesForDirectory(topDirsBySize, dir);
                    }
                    this.EnumerateFilesForDirectory(topDirsBySize, this.m_rootDirectory);
                }
            });
            return(topDirsBySize);
        }
        protected override Exception ExecuteInternal(AutoReseedWorkflowState state)
        {
            Exception         ex                        = null;
            bool              flag                      = false;
            IVolumeManager    volumeManager             = base.Context.VolumeManager;
            IADDatabase       database                  = base.Context.Database;
            MountedFolderPath databaseMountedFolderPath = VolumeManager.GetDatabaseMountedFolderPath(base.Context.Dag.AutoDagDatabasesRootFolderPath, database.Name);

            if (MountPointUtil.IsDirectoryAccessibleMountPoint(databaseMountedFolderPath.Path, out ex))
            {
                flag = true;
            }
            else
            {
                ReplayCrimsonEvents.AutoReseedNeverMountedActiveMissingVolume.Log <string>(database.Name);
                if (volumeManager.FixActiveDatabaseMountPoint(database, base.Context.Databases, base.Context.AdConfig, out ex, true))
                {
                    flag = true;
                    volumeManager.UpdateVolumeInfoCopyState(database.Guid, base.Context.ReplicaInstanceManager);
                    ReplayCrimsonEvents.AutoReseedNeverMountedActiveAllocatedVolume.Log <string, string>(database.Name, base.Context.TargetCopyStatus.CopyStatus.LogVolumeName);
                }
                else
                {
                    AutoReseedWorkflow.Tracer.TraceError <string, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() failed to fix up active database: '{0}' mountpoint. Error: {1}", database.Name, AmExceptionHelper.GetExceptionMessageOrNoneString(ex));
                    ReplayCrimsonEvents.AutoReseedFixActiveMountPointError.Log <string, string>(database.Name, AmExceptionHelper.GetExceptionMessageOrNoneString(ex));
                }
            }
            if (!flag)
            {
                AutoReseedWorkflow.Tracer.TraceError <string, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() active database: '{0}' does not have a mountpoint. Skip issuing Store Mount. Error: {1}", database.Name, AmExceptionHelper.GetExceptionMessageOrNoneString(ex));
                return(ex);
            }
            ex = AmRpcClientHelper.AdminMountDatabaseWrapper(database);
            if (ex != null)
            {
                AutoReseedWorkflow.Tracer.TraceError <string, string>((long)this.GetHashCode(), "DiskReclaimer: UpdateVolumeForNeverMountedActives() failed to mount active database: '{0}' mountpoint. Error: {1}", database.Name, ex.Message);
                ReplayCrimsonEvents.AutoReseedMountActiveDatabaseError.Log <string, string>(database.Name, ex.Message);
            }
            return(ex);
        }
예제 #7
0
        private void Run()
        {
            DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Entering Run()...");
            IMonitoringADConfig config = this.m_adConfigProvider.GetConfig(true);

            if (config.ServerRole == MonitoringServerRole.Standalone)
            {
                DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Skipping running DiskReclaimerManager because local server is not a member of a DAG.");
                return;
            }
            if (!config.Dag.AutoDagDiskReclaimerEnabled)
            {
                DiskReclaimerManager.Tracer.TraceDebug <string>((long)this.GetHashCode(), "DiskReclaimer: Skipping running DiskReclaimerManager because the local DAG '{0}' has AutoDagDiskReclaimerEnabled set to disabled.", config.Dag.Name);
                return;
            }
            if (DiskReclaimerManager.ShouldSkipDueToServerNotConfigured(config.TargetMiniServer))
            {
                DiskReclaimerManager.Tracer.TraceDebug <AmServerName>((long)this.GetHashCode(), "DiskReclaimer: Skipping running DiskReclaimerManager because the local server '{0}' is not yet fully configured in the AD.", config.TargetServerName);
                return;
            }
            this.m_volumeManager.Refresh(config);
            if (MountPointUtil.IsConfigureMountPointsEnabled())
            {
                bool flag = false;
                DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Regkey ConfigureMountPointsPostReInstall is set. Starting mountpoint configuration on all Exchange volumes.");
                ReplayCrimsonEvents.DiskReclaimerPostInstallConfigStarted.LogPeriodic <string>(Environment.MachineName, DiagCore.DefaultEventSuppressionInterval, "ConfigureMountPointsPostReInstall");
                this.ConfigureVolumesPostReInstall(config, out flag);
                this.m_volumeManager.Refresh(config);
                if (flag)
                {
                    DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Database copies might be missing in AD. ConfigureMountPointsPostReInstall will not be disabled to allow DiskReclaimer to run again.");
                    return;
                }
                this.UpdateVolumeForNeverMountedActives(config);
                ReplayCrimsonEvents.DiskReclaimerPostInstallConfigCompleted.LogPeriodic <string>(Environment.MachineName, DiagCore.DefaultEventSuppressionInterval, "ConfigureMountPointsPostReInstall");
                DiskReclaimerManager.m_lastVolumeScanTime = DateTime.MinValue;
                Exception ex;
                if ((ex = MountPointUtil.DisableConfigureMountPoints()) != null)
                {
                    DiskReclaimerManager.Tracer.TraceError <Exception>((long)this.GetHashCode(), "DiskReclaimer: Failed to reset regkey ConfigureMountPointsPostReInstall after configuring mountpoints. Error: {0}", ex);
                    ReplayCrimsonEvents.DiskReclaimerError.LogPeriodic <Exception>(Environment.MachineName, DiagCore.DefaultEventSuppressionInterval, ex);
                }
            }
            this.m_volumeManager.DetermineMisconfiguredVolumes(config);
            if (!this.IsSafeToLookForQuarantinedDisks())
            {
                DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Skip scanning for quarantined volumes...");
                return;
            }
            DiskReclaimerManager.m_lastVolumeScanTime = DateTime.UtcNow;
            ReplayCrimsonEvents.DiskReclaimerInitiated.Log();
            List <ExchangeVolume>[] array = this.m_volumeManager.DetermineVolumeSpareStatuses();
            List <ExchangeVolume>   list  = array[4];

            if (list == null || list.Count == 0)
            {
                DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "Run(): No volumes that need to be reclaimed found. Exiting.");
            }
            else
            {
                DiskReclaimerManager.Tracer.TraceDebug <int>((long)this.GetHashCode(), "DiskReclaimer: Found {0} volumes that can potentially be reclaimed.", list.Count);
                DatabaseHealthValidationRunner databaseHealthValidationRunner = new DatabaseHealthValidationRunner(config.TargetServerName.NetbiosName);
                databaseHealthValidationRunner.Initialize();
                List <string> list2 = new List <string>();
                foreach (IHealthValidationResultMinimal healthValidationResultMinimal in databaseHealthValidationRunner.RunDatabaseRedundancyChecksForCopyRemoval(true, null, true, true, -1))
                {
                    if (!healthValidationResultMinimal.IsValidationSuccessful)
                    {
                        list2.Add(healthValidationResultMinimal.ErrorMessageWithoutFullStatus);
                    }
                }
                if (list2.Count == 0)
                {
                    DiskReclaimerManager.Tracer.TraceDebug((long)this.GetHashCode(), "DiskReclaimer: Passed copy removal redundancy check for this server. Trying to reclaim one quarantined volume...");
                    IEnumerable <IADDatabase> enumerable = config.DatabaseMap[config.TargetServerName];
                    IEnumerable <CopyStatusClientCachedEntry> copyStatusesByServer = this.m_statusLookup.GetCopyStatusesByServer(config.TargetServerName, enumerable, CopyStatusClientLookupFlags.None);
                    using (List <ExchangeVolume> .Enumerator enumerator2 = list.GetEnumerator())
                    {
                        while (enumerator2.MoveNext())
                        {
                            ExchangeVolume             exchangeVolume             = enumerator2.Current;
                            ExchangeVolumeDbStatusInfo filesInformationFromVolume = this.m_volumeManager.GetFilesInformationFromVolume(exchangeVolume, enumerable, copyStatusesByServer);
                            bool      flag2;
                            Exception ex2;
                            if (this.m_volumeManager.TryReclaimVolume(exchangeVolume, filesInformationFromVolume, out flag2, out ex2))
                            {
                                DiskReclaimerManager.Tracer.TraceDebug <MountedFolderPath, MountedFolderPath>((long)this.GetHashCode(), "DiskReclaimer: Successfully reclaimed volume '{0}' mounted at '{1}' as a spare.", exchangeVolume.VolumeName, exchangeVolume.ExchangeVolumeMountPoint);
                                ReplayCrimsonEvents.DiskReclaimerSucceeded.Log <string, string>(exchangeVolume.VolumeName.Path, exchangeVolume.ExchangeVolumeMountPoint.Path);
                                this.m_volumeManager.DetermineVolumeSpareStatuses();
                                break;
                            }
                            if (flag2)
                            {
                                DiskReclaimerManager.Tracer.TraceError <MountedFolderPath, MountedFolderPath, Exception>((long)this.GetHashCode(), "DiskReclaimer: Failed to reclaim volume '{0}' mounted at '{1}' as a spare. However, formatting the volume apparently succeeded. Error: {2}", exchangeVolume.VolumeName, exchangeVolume.ExchangeVolumeMountPoint, ex2);
                                ReplayCrimsonEvents.DiskReclaimerSparingFailed.Log <string, string, bool, string>(exchangeVolume.VolumeName.Path, exchangeVolume.ExchangeVolumeMountPoint.Path, flag2, ex2.Message);
                                this.m_volumeManager.DetermineVolumeSpareStatuses();
                                break;
                            }
                            DiskReclaimerManager.Tracer.TraceError <MountedFolderPath, MountedFolderPath, Exception>((long)this.GetHashCode(), "DiskReclaimer: Failed to format and reclaim volume '{0}' mounted at '{1}' as a spare. Error: {2}", exchangeVolume.VolumeName, exchangeVolume.ExchangeVolumeMountPoint, ex2);
                            ReplayCrimsonEvents.DiskReclaimerSparingFailed.Log <string, string, bool, string>(exchangeVolume.VolumeName.Path, exchangeVolume.ExchangeVolumeMountPoint.Path, flag2, ex2.Message);
                        }
                        goto IL_477;
                    }
                }
                string text = string.Join("\n\n", list2);
                DiskReclaimerManager.Tracer.TraceError <string>((long)this.GetHashCode(), "DiskReclaimer: Skip sparing. One or more databases on this server failed copy removal redundancy check. Reason: {0}", text);
                ReplayCrimsonEvents.DiskReclaimerRedundancyPrereqFailed.LogPeriodic <string>(text.GetHashCode(), DiagCore.DefaultEventSuppressionInterval, text);
            }
IL_477:
            this.RunBitlockerMaintenance(config);
        }
예제 #8
0
        // Token: 0x06001960 RID: 6496 RVA: 0x00069970 File Offset: 0x00067B70
        private LocalizedString RunPrereqsForInPlaceReseed(AutoReseedWorkflowState state)
        {
            this.TraceBeginPrereqs(state);
            int      autoReseedDbFailedReseedRetryCountMax = RegistryParameters.AutoReseedDbFailedReseedRetryCountMax;
            TimeSpan timeSpan = TimeSpan.FromSeconds((double)RegistryParameters.AutoReseedDbFailedSuspendedWorkflowResetIntervalInSecs);

            timeSpan = this.GetWorkflowSuppressionInterval(timeSpan);
            if (state.ReseedRecoveryActionRetryCount >= RegistryParameters.AutoReseedDbFailedReseedRetryCountMax)
            {
                state.WriteWorkflowNextExecutionDueTime(timeSpan);
                base.TraceError("RunPrereqsForInPlaceReseed(): Failing 'InPlaceReseed' prereqs since ReseedRecoveryActionRetryCount ({0}) exceeds AutoReseedDbFailedReseedRetryCountMax ({1}). Workflow will next run after {2}.", new object[]
                {
                    state.ReseedRecoveryActionRetryCount,
                    autoReseedDbFailedReseedRetryCountMax,
                    timeSpan
                });
                ReplayCrimsonEvents.AutoReseedWorkflowDbReseedRetryExceeded.Log <string, Guid, string, string, int, TimeSpan>(base.Context.Database.Name, base.Context.Database.Guid, base.WorkflowName, base.WorkflowLaunchReason, autoReseedDbFailedReseedRetryCountMax, timeSpan);
                return(ReplayStrings.AutoReseedFailedSeedRetryExceeded(autoReseedDbFailedReseedRetryCountMax));
            }
            if (base.Context.TargetCopyStatus.CopyStatus.InPlaceReseedBlocked)
            {
                IEnumerable <CopyStatusClientCachedEntry> enumerable = this.FindTargetDbSetFromDatabaseGroup(base.Context);
                if (enumerable == null)
                {
                    enumerable = this.FindTargetDbSetFromNeighbors(base.Context);
                    if (enumerable == null)
                    {
                        return(ReplayStrings.AutoReseedFailedToFindVolumeName);
                    }
                }
                MountedFolderPath mountedFolderPath;
                if (!this.IsVolumeRecentlyAssigned(enumerable, out mountedFolderPath))
                {
                    string messageOrNoneString = AmExceptionHelper.GetMessageOrNoneString(base.Context.TargetCopyStatus.CopyStatus.ErrorMessage);
                    state.WriteWorkflowNextExecutionDueTime(timeSpan);
                    state.ReseedRecoveryActionRetryCount = RegistryParameters.AutoReseedDbFailedReseedRetryCountMax;
                    base.TraceError("RunPrereqsForInPlaceReseed(): Failing 'InPlaceReseed' prereqs since in-place reseed is blocked. DatabaseCopy has ErrorMessage: {0}. Workflow will next run after {1}.", new object[]
                    {
                        messageOrNoneString,
                        timeSpan
                    });
                    ReplayCrimsonEvents.AutoReseedWorkflowDbInPlaceReseedBlocked.Log <string, Guid, string, string, string>(base.Context.Database.Name, base.Context.Database.Guid, base.WorkflowName, base.WorkflowLaunchReason, messageOrNoneString);
                    return(ReplayStrings.AutoReseedFailedInPlaceReseedBlocked(messageOrNoneString));
                }
            }
            string edbFilePath = base.Context.Database.EdbFilePath.PathName;

            if (File.Exists(edbFilePath) && !state.IgnoreInPlaceOverwriteDelay)
            {
                DateTime  lastWriteTimeUtc = DateTime.MaxValue;
                Exception ex = MountPointUtil.HandleIOExceptions(delegate
                {
                    FileInfo fileInfo = new FileInfo(edbFilePath);
                    lastWriteTimeUtc  = fileInfo.LastWriteTimeUtc;
                });
                if (ex != null)
                {
                    lastWriteTimeUtc = base.Context.TargetCopyStatus.CopyStatus.LastStatusTransitionTime;
                    base.TraceError("RunPrereqsForInPlaceReseed(): Failed to read LastWriteTimeUtc of edb file '{0}'. Using LastStatusTransitionTime of '{1}' instead. Exception: {2}", new object[]
                    {
                        edbFilePath,
                        lastWriteTimeUtc,
                        ex
                    });
                }
                TimeSpan timeSpan2 = DateTime.UtcNow.Subtract(lastWriteTimeUtc);
                TimeSpan timeSpan3 = TimeSpan.FromSeconds((double)RegistryParameters.AutoReseedDbFailedInPlaceReseedDelayInSecs);
                base.TraceDebug("RunPrereqsForInPlaceReseed(): Found EDB file at '{0}'. The copy was last FailedAndSuspended '{1}' duration ago. Configured reseed delay is: '{2}'.", new object[]
                {
                    edbFilePath,
                    timeSpan2,
                    timeSpan3
                });
                if (timeSpan2 <= timeSpan3)
                {
                    TimeSpan workflowSuppressionInterval = this.GetWorkflowSuppressionInterval(timeSpan3);
                    state.WriteWorkflowNextExecutionDueTime(workflowSuppressionInterval);
                    base.TraceError("RunPrereqsForInPlaceReseed(): EDB file exists and Reseed is being attempted too soon. Reseed will be blocked until the configured reseed delay period. Workflow will next run after {0}.", new object[]
                    {
                        workflowSuppressionInterval
                    });
                    ReplayCrimsonEvents.AutoReseedWorkflowInPlaceReseedTooSoon.Log <string, Guid, string, string, string, TimeSpan, TimeSpan, TimeSpan>(base.Context.Database.Name, base.Context.Database.Guid, base.WorkflowName, base.WorkflowLaunchReason, edbFilePath, timeSpan2, timeSpan3, workflowSuppressionInterval);
                    return(ReplayStrings.AutoReseedInPlaceReseedTooSoon(timeSpan2.ToString(), timeSpan3.ToString()));
                }
            }
            int num;

            if (!base.Context.ReseedLimiter.TryStartSeed(out num))
            {
                base.TraceError("RunPrereqsForInPlaceReseed(): Seed is being skipped for now because maximum number of concurrent seeds has been reached: {0}", new object[]
                {
                    num
                });
                return(ReplayStrings.AutoReseedTooManyConcurrentSeeds(num));
            }
            return(LocalizedString.Empty);
        }