public static IClusterDB OpenClusterDatabase(ITopologyConfigurationSession taskSession, Task.TaskVerboseLoggingDelegate writeLog, Task.TaskWarningLoggingDelegate writeWarning, Task.TaskErrorLoggingDelegate writeError, Database database, bool allowNoOwningServer, out DatabaseAvailabilityGroup dag) { string machineName = database.Server.ToString(); try { ADObjectId server = database.Server; MiniServer miniServer = taskSession.ReadMiniServer(server, DatabaseTasksHelper.MiniserverProperties); if (miniServer == null) { writeWarning(Strings.ErrorDBOwningServerNotFound(database.Identity.ToString())); if (allowNoOwningServer) { dag = null; return(null); } writeError(new InvalidOperationException(Strings.ErrorDBOwningServerNotFound(database.Name)), ErrorCategory.InvalidOperation, database); } machineName = miniServer.Fqdn; ADObjectId databaseAvailabilityGroup = miniServer.DatabaseAvailabilityGroup; if (databaseAvailabilityGroup != null) { dag = DagTaskHelper.ReadDag(databaseAvailabilityGroup, taskSession); if (dag != null) { AmServerName amServerName = new AmServerName(miniServer); writeLog(Strings.OpeningClusterDatabase(amServerName.ToString())); return(ClusterDB.Open(amServerName)); } } } catch (ClusterException ex) { writeWarning(Strings.CouldNotConnectToClusterError(machineName, ex.Message)); } catch (DataSourceTransientException) { writeWarning(Strings.CouldNotConnectToCluster(machineName)); } catch (DataSourceOperationException) { writeWarning(Strings.CouldNotConnectToCluster(machineName)); } dag = null; return(null); }
public void ChangeActiveServerForThirdParty(string newActiveServerName, TimeSpan lockTimeout) { using (AmDatabaseOperationLock.Lock(base.DatabaseGuid, AmDbLockReason.Move, new TimeSpan?(lockTimeout))) { if (!base.State.IsAdminDismounted) { throw new ChangeActiveServerException(base.DatabaseGuid, newActiveServerName, ReplayStrings.TPRChangeFailedBecauseNotDismounted); } AmServerName activeServer = base.State.ActiveServer; AmServerName amServerName = new AmServerName(newActiveServerName); if (activeServer.Equals(amServerName)) { throw new ChangeActiveServerException(base.DatabaseGuid, newActiveServerName, ReplayStrings.TPRChangeFailedBecauseAlreadyActive(activeServer.ToString())); } IAmBcsErrorLogger errorLogger = new AmBcsSingleCopyFailureLogger(); AmBcsServerChecks checks = AmBcsServerChecks.DebugOptionDisabled | AmBcsServerChecks.ClusterNodeUp | AmBcsServerChecks.DatacenterActivationModeStarted | AmBcsServerChecks.AutoActivationAllowed; LocalizedString empty = LocalizedString.Empty; AmBcsServerValidation amBcsServerValidation = new AmBcsServerValidation(amServerName, activeServer, base.Database, base.Config, errorLogger, null); if (!amBcsServerValidation.RunChecks(checks, ref empty)) { AmTrace.Error("ChangeActiveServerForThirdParty: DB {0}: ValidateServer() returned error: {1}", new object[] { base.DatabaseName, empty }); throw new ChangeActiveServerException(base.DatabaseGuid, newActiveServerName, ReplayStrings.TPRChangeFailedServerValidation(base.DatabaseName, newActiveServerName, empty)); } base.WriteStateMountSkipped(amServerName); this.UpdateAdProperties(true, activeServer); ReplayCrimsonEvents.TPRChangeActiveServerSucceeded.Log <string, Guid, AmServerName, AmServerName>(base.DatabaseName, base.DatabaseGuid, activeServer, amServerName); } }
public static HungNodesInfo GetNodesHungInClusDbUpdate() { HungNodesInfo result = null; TimeSpan timeout = TimeSpan.FromSeconds((double)RegistryParameters.OpenClusterTimeoutInSec); using (AmCluster amCluster = AmCluster.OpenByName(AmServerName.LocalComputerName, timeout, string.Empty)) { int num = 0; AmServerName currentGumLockOwnerInfo = amCluster.GetCurrentGumLockOwnerInfo(out num); if (!AmServerName.IsNullOrEmpty(currentGumLockOwnerInfo)) { Thread.Sleep(RegistryParameters.ClusdbHungNodesConfirmDurationInMSec); string context = string.Format("GUM={0}", num); using (AmCluster amCluster2 = AmCluster.OpenByName(currentGumLockOwnerInfo, timeout, context)) { using (IAmClusterNode amClusterNode = amCluster2.OpenNode(currentGumLockOwnerInfo)) { int num2 = 0; long hungNodesMask = amClusterNode.GetHungNodesMask(out num2); if (num != num2) { throw new HungDetectionGumIdChangedException(num, num2, currentGumLockOwnerInfo.ToString(), hungNodesMask); } result = new HungNodesInfo(num, currentGumLockOwnerInfo, hungNodesMask); } } } } return(result); }