private static IEnumerable <OngoingTask> CollectExternalReplicationTasks(List <ExternalReplication> watchers, DatabaseTopology dbTopology, ClusterTopology clusterTopology, ServerStore store) { if (dbTopology == null) { yield break; } foreach (var watcher in watchers) { NodeId responsibale = null; var tag = dbTopology.WhoseTaskIsIt(watcher, store.IsPassive()); if (tag != null) { responsibale = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }; } yield return(new OngoingTaskReplication { TaskId = watcher.TaskId, TaskName = watcher.Name, ResponsibleNode = responsibale, DestinationDatabase = watcher.Database, TaskState = watcher.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled, DestinationUrl = watcher.Url }); } }
private static IEnumerable <OngoingTask> CollectExternalReplicationTasks(string name, List <ExternalReplication> watchers, DatabaseTopology dbTopology, ClusterTopology clusterTopology, ServerStore store) { if (dbTopology == null) { yield break; } foreach (var watcher in watchers) { NodeId responsibale = null; var tag = dbTopology.WhoseTaskIsIt(watcher, store.IsPassive()); if (tag != null) { responsibale = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }; } (string Url, OngoingTaskReplication.ReplicationStatus Status)res = (null, OngoingTaskReplication.ReplicationStatus.None); string error = null; if (tag == store.NodeTag) { try { store.DatabasesLandlord.DatabasesCache.TryGetValue(name, out var task); res = task.Result.ReplicationLoader.GetExternalReplicationDestination(watcher.TaskId); } catch (Exception e) { // failed to retrive the destination url error = e.ToString(); } } else { res.Status = OngoingTaskReplication.ReplicationStatus.NotOnThisNode; } yield return(new OngoingTaskReplication { TaskId = watcher.TaskId, TaskName = watcher.Name, ResponsibleNode = responsibale, DestinationDatabase = watcher.Database, TaskState = watcher.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled, DestinationUrl = res.Url, Status = res.Status, Error = error }); } }
private static IEnumerable <OngoingTask> CollectBackupTasks( DatabaseRecord databaseRecord, DatabaseTopology dbTopology, ClusterTopology clusterTopology, ServerStore store) { if (dbTopology == null) { yield break; } if (databaseRecord.PeriodicBackups == null) { yield break; } if (databaseRecord.PeriodicBackups.Count == 0) { yield break; } var database = store.DatabasesLandlord.TryGetOrCreateResourceStore(databaseRecord.DatabaseName).Result; foreach (var backupConfiguration in databaseRecord.PeriodicBackups) { var tag = dbTopology.WhoseTaskIsIt(backupConfiguration, store.IsPassive()); var backupDestinations = GetBackupDestinations(backupConfiguration); var backupStatus = database.PeriodicBackupRunner.GetBackupStatus(backupConfiguration.TaskId); var nextBackup = database.PeriodicBackupRunner.GetNextBackupDetails(databaseRecord, backupConfiguration, backupStatus); yield return(new OngoingTaskBackup { TaskId = backupConfiguration.TaskId, BackupType = backupConfiguration.BackupType, TaskName = backupConfiguration.Name, TaskState = backupConfiguration.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled, LastFullBackup = backupStatus.LastFullBackup, LastIncrementalBackup = backupStatus.LastIncrementalBackup, NextBackup = nextBackup, ResponsibleNode = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }, BackupDestinations = backupDestinations }); } }
private bool TryGetMentorNode(string dbName, DatabaseTopology topology, ClusterTopology clusterTopology, string promotable, out string mentorNode) { var url = clusterTopology.GetUrlFromTag(promotable); var task = new PromotableTask(promotable, url, dbName); mentorNode = topology.WhoseTaskIsIt(task, _server.IsPassive()); if (mentorNode == null) { // We are in passive mode and were kicked out of the cluster. return(false); } return(true); }
private bool TryGetMentorNode(string dbName, DatabaseTopology topology, ClusterTopology clusterTopology, string promotable, out string mentorNode) { var url = clusterTopology.GetUrlFromTag(promotable); topology.PredefinedMentors.TryGetValue(promotable, out var mentor); var task = new PromotableTask(promotable, url, dbName, mentor); mentorNode = topology.WhoseTaskIsIt(_server.Engine.CurrentState, task, null); if (mentorNode == null) { // We are in passive mode and were kicked out of the cluster. return(false); } return(true); }
private List <string> GetResponsibleNodes(DatabaseTopology topology, string databaseGroupId, PullReplicationDefinition pullReplication) { var list = new List <string>(); // we distribute connections to have load balancing when many sinks are connected. // this is the hub cluster, so we make the decision which node will do the pull replication only once and only here, // for that we create a dummy IDatabaseTask. var mentorNodeTask = new PullNodeTask { Mentor = pullReplication.MentorNode, DatabaseGroupId = databaseGroupId }; while (topology.Members.Count > 0) { var next = topology.WhoseTaskIsIt(ServerStore.CurrentRachisState, mentorNodeTask, null); list.Add(next); topology.Members.Remove(next); } return(list); }
private OngoingTaskReplication GetExternalReplicationInfo(DatabaseTopology dbTopology, ClusterTopology clusterTopology, ExternalReplication watcher) { NodeId responsibale = null; var tag = dbTopology.WhoseTaskIsIt(watcher, ServerStore.Engine.CurrentState); if (tag != null) { responsibale = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }; } (string Url, OngoingTaskConnectionStatus Status)res = (null, OngoingTaskConnectionStatus.None); if (tag == ServerStore.NodeTag) { res = Database.ReplicationLoader.GetExternalReplicationDestination(watcher.TaskId); } else { res.Status = OngoingTaskConnectionStatus.NotOnThisNode; } var taskInfo = new OngoingTaskReplication { TaskId = watcher.TaskId, TaskName = watcher.Name, ResponsibleNode = responsibale, DestinationDatabase = watcher.Database, TaskState = watcher.Disabled ? OngoingTaskState.Disabled : OngoingTaskState.Enabled, DestinationUrl = res.Url, TaskConnectionStatus = res.Status, }; return(taskInfo); }
public string WhoseTaskIsIt( DatabaseTopology databaseTopology, IDatabaseTask configuration, IDatabaseTaskStatus taskStatus, bool useLastResponsibleNodeIfNoAvailableNodes = false) { var whoseTaskIsIt = databaseTopology.WhoseTaskIsIt( ServerStore.Engine.CurrentState, configuration, getLastReponsibleNode: () => ServerStore.LicenseManager.GetLastResponsibleNodeForTask( taskStatus, databaseTopology, configuration, NotificationCenter)); if (whoseTaskIsIt == null && useLastResponsibleNodeIfNoAvailableNodes) { return(taskStatus.NodeTag); } return(whoseTaskIsIt); }
private IEnumerable <OngoingTask> CollectEtlTasks(DatabaseRecord databaseRecord, DatabaseTopology dbTopology, ClusterTopology clusterTopology) { if (dbTopology == null) { yield break; } if (databaseRecord.RavenEtls != null) { foreach (var ravenEtl in databaseRecord.RavenEtls) { var tag = dbTopology.WhoseTaskIsIt(ravenEtl, ServerStore.Engine.CurrentState); var taskState = GetEtlTaskState(ravenEtl); if (databaseRecord.RavenConnectionStrings.TryGetValue(ravenEtl.ConnectionStringName, out var connection) == false) { throw new InvalidOperationException( $"Could not find connection string named '{ravenEtl.ConnectionStringName}' in the database record for '{ravenEtl.Name}' ETL"); } (string Url, OngoingTaskConnectionStatus Status)res = (null, OngoingTaskConnectionStatus.None); string error = null; if (tag == ServerStore.NodeTag) { foreach (var process in Database.EtlLoader.Processes) { if (process is RavenEtl etlProcess) { if (etlProcess.Name == ravenEtl.Name) { res.Url = etlProcess.Url; res.Status = OngoingTaskConnectionStatus.Active; break; } } } if (res.Status == OngoingTaskConnectionStatus.None) { error = $"The raven etl process'{ravenEtl.Name}' was not found."; } } else { res.Status = OngoingTaskConnectionStatus.NotOnThisNode; } yield return(new OngoingTaskRavenEtlListView() { TaskId = ravenEtl.TaskId, TaskName = ravenEtl.Name, // TODO arek TaskConnectionStatus = TaskState = taskState, ResponsibleNode = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }, DestinationUrl = res.Url, TaskConnectionStatus = res.Status, DestinationDatabase = connection.Database, ConnectionStringName = ravenEtl.ConnectionStringName, Error = error }); } } if (databaseRecord.SqlEtls != null) { foreach (var sqlEtl in databaseRecord.SqlEtls) { var tag = dbTopology.WhoseTaskIsIt(sqlEtl, ServerStore.Engine.CurrentState); var taskState = GetEtlTaskState(sqlEtl); if (databaseRecord.SqlConnectionStrings.TryGetValue(sqlEtl.ConnectionStringName, out var sqlConnection) == false) { throw new InvalidOperationException( $"Could not find connection string named '{sqlEtl.ConnectionStringName}' in the database record for '{sqlEtl.Name}' ETL"); } var(database, server) = SqlConnectionStringParser.GetDatabaseAndServerFromConnectionString(sqlEtl.FactoryName, sqlConnection.ConnectionString); yield return(new OngoingTaskSqlEtlListView() { TaskId = sqlEtl.TaskId, TaskName = sqlEtl.Name, // TODO arek TaskConnectionStatus = TaskState = taskState, ResponsibleNode = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }, DestinationServer = server, DestinationDatabase = database, ConnectionStringName = sqlEtl.ConnectionStringName }); } } }
private static IEnumerable <OngoingTask> CollectEtlTasks(DatabaseRecord databaseRecord, DatabaseTopology dbTopology, ClusterTopology clusterTopology, ServerStore store) { if (dbTopology == null) { yield break; } if (databaseRecord.RavenEtls != null) { foreach (var ravenEtl in databaseRecord.RavenEtls) { var tag = dbTopology.WhoseTaskIsIt(ravenEtl, store.IsPassive()); var taskState = OngoingTaskState.Enabled; if (ravenEtl.Disabled || ravenEtl.Transforms.All(x => x.Disabled)) { taskState = OngoingTaskState.Disabled; } else if (ravenEtl.Transforms.Any(x => x.Disabled)) { taskState = OngoingTaskState.PartiallyEnabled; } if (databaseRecord.RavenConnectionStrings.TryGetValue(ravenEtl.ConnectionStringName, out var connection) == false) { throw new InvalidOperationException( $"Could not find connection string named '{ravenEtl.ConnectionStringName}' in the database record for '{ravenEtl.Name}' ETL"); } yield return(new OngoingTaskRavenEtl { TaskId = ravenEtl.TaskId, TaskName = ravenEtl.Name, // TODO arek TaskConnectionStatus = TaskState = taskState, ResponsibleNode = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }, DestinationUrl = connection.Url, DestinationDatabase = connection.Database }); } } if (databaseRecord.SqlEtls != null) { foreach (var sqlEtl in databaseRecord.SqlEtls) { var tag = dbTopology.WhoseTaskIsIt(sqlEtl, store.IsPassive()); var taskState = OngoingTaskState.Enabled; if (sqlEtl.Disabled || sqlEtl.Transforms.All(x => x.Disabled)) { taskState = OngoingTaskState.Disabled; } else if (sqlEtl.Transforms.Any(x => x.Disabled)) { taskState = OngoingTaskState.PartiallyEnabled; } if (databaseRecord.SqlConnectionStrings.TryGetValue(sqlEtl.ConnectionStringName, out var sqlConnection) == false) { throw new InvalidOperationException( $"Could not find connection string named '{sqlEtl.ConnectionStringName}' in the database record for '{sqlEtl.Name}' ETL"); } var(database, server) = SqlConnectionStringParser.GetDatabaseAndServerFromConnectionString(sqlEtl.FactoryName, sqlConnection.ConnectionString); yield return(new OngoingTaskSqlEtl { TaskId = sqlEtl.TaskId, TaskName = sqlEtl.Name, // TODO arek TaskConnectionStatus = TaskState = taskState, ResponsibleNode = new NodeId { NodeTag = tag, NodeUrl = clusterTopology.GetUrlFromTag(tag) }, DestinationServer = server, DestinationDatabase = database }); } } }