private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus) { int retries = 5; while (retries > 0) { retries--; try { var obj = RavenJObject.FromObject(localReplicationStatus); Database.Documents.Put(RavenSqlReplicationStatus, null, obj, new RavenJObject(), null); break; } catch (SynchronizationLockException) { // just ignore it, we'll save that next time break; } catch (ConcurrencyException) { Thread.Sleep(50); } } }
private Etag GetLastEtagFor(SqlReplicationStatus replicationStatus, SqlReplicationConfig sqlReplicationConfig) { var lastEtag = Etag.Empty; var lastEtagHolder = replicationStatus.LastReplicatedEtags.FirstOrDefault( x => string.Equals(sqlReplicationConfig.Name, x.Name, StringComparison.InvariantCultureIgnoreCase)); if (lastEtagHolder != null) { lastEtag = lastEtagHolder.LastDocEtag; } return(lastEtag); }
private Guid?GetLeastReplicatedEtag(List <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { Guid?leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) { leastReplicatedEtag = lastEtag; } else if (ByteArrayComparer.Instance.Compare(lastEtag, leastReplicatedEtag.Value) < 0) { leastReplicatedEtag = lastEtag; } } return(leastReplicatedEtag); }
private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus) { int retries = 5; while (retries > 0) { retries--; try { var obj = RavenJObject.FromObject(localReplicationStatus); Database.Documents.Put(RavenSqlReplicationStatus, null, obj, new RavenJObject(), null); break; } catch (ConcurrencyException) { Thread.Sleep(50); } } }
private void UpdateLastReplicatedStatus(SqlReplicationStatus localReplicationStatus, List <SqlReplicationConfig> config) { var lastReplicatedToDelete = new List <LastReplicatedEtag>(); foreach (var lastReplicated in localReplicationStatus.LastReplicatedEtags) { if (config.Exists(x => x.Name.Equals(lastReplicated.Name, StringComparison.InvariantCultureIgnoreCase)) == false) { lastReplicatedToDelete.Add(lastReplicated); } } if (lastReplicatedToDelete.Count == 0) { return; // nothing to do } foreach (var status in lastReplicatedToDelete) { localReplicationStatus.LastReplicatedEtags.Remove(status); } SaveNewReplicationStatus(localReplicationStatus); }
private Guid GetLastEtagFor(SqlReplicationStatus replicationStatus, SqlReplicationConfig sqlReplicationConfig) { var lastEtag = Guid.Empty; var lastEtagHolder = replicationStatus.LastReplicatedEtags.FirstOrDefault( x => string.Equals(sqlReplicationConfig.Name, x.Name, StringComparison.InvariantCultureIgnoreCase)); if (lastEtagHolder != null) lastEtag = lastEtagHolder.LastDocEtag; return lastEtag; }
private Guid? GetLeastReplicatedEtag(List<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { Guid? leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) leastReplicatedEtag = lastEtag; else if (ByteArrayComparer.Instance.Compare(lastEtag, leastReplicatedEtag.Value) < 0) leastReplicatedEtag = lastEtag; } return leastReplicatedEtag; }
private Etag GetLeastReplicatedEtag(IEnumerable<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { var synchronizationEtag = etagSynchronizer.GetSynchronizationEtag(); Etag leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) leastReplicatedEtag = lastEtag; else if (lastEtag.CompareTo(leastReplicatedEtag) < 0) leastReplicatedEtag = lastEtag; } var calculateSynchronizationEtag = etagSynchronizer.CalculateSynchronizationEtag(synchronizationEtag, leastReplicatedEtag); return calculateSynchronizationEtag; }
private void SaveNewReplicationStatus(SqlReplicationStatus localReplicationStatus, Etag latestEtag) { int retries = 5; while (retries > 0) { retries--; try { var obj = RavenJObject.FromObject(localReplicationStatus); Database.Put(RavenSqlreplicationStatus, null, obj, new RavenJObject(), null); lastLatestEtag = latestEtag; break; } catch (ConcurrencyException) { Thread.Sleep(50); } } }
private Etag GetLeastReplicatedEtag(IEnumerable<SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { Etag leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) leastReplicatedEtag = lastEtag; else if (lastEtag.CompareTo(leastReplicatedEtag) < 0) leastReplicatedEtag = lastEtag; } return leastReplicatedEtag; }
private Etag GetLeastReplicatedEtag(IEnumerable <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { var synchronizationEtag = etagSynchronizer.GetSynchronizationEtag(); Etag leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) { leastReplicatedEtag = lastEtag; } else if (lastEtag.CompareTo(leastReplicatedEtag) < 0) { leastReplicatedEtag = lastEtag; } } var calculateSynchronizationEtag = etagSynchronizer.CalculateSynchronizationEtag(synchronizationEtag, leastReplicatedEtag); return(calculateSynchronizationEtag); }
private Etag GetLeastReplicatedEtag(IEnumerable <SqlReplicationConfig> config, SqlReplicationStatus localReplicationStatus) { Etag leastReplicatedEtag = null; foreach (var sqlReplicationConfig in config) { var lastEtag = GetLastEtagFor(localReplicationStatus, sqlReplicationConfig); if (leastReplicatedEtag == null) { leastReplicatedEtag = lastEtag; } else if (lastEtag.CompareTo(leastReplicatedEtag) < 0) { leastReplicatedEtag = lastEtag; } } return(leastReplicatedEtag); }
protected override async Task ExecuteAsync(object parameter) { if(ApplicationModel.Current == null || ApplicationModel.Current.Server.Value == null || ApplicationModel.Current.Server.Value.SelectedDatabase.Value == null) return; if (settingsModel == null) return; var databaseName = ApplicationModel.Current.Server.Value.SelectedDatabase.Value.Name; var session = ApplicationModel.Current.Server.Value.DocumentStore.OpenAsyncSession(databaseName); if(databaseName == Constants.SystemDatabase) { var systemSession = ApplicationModel.Current.Server.Value.DocumentStore.OpenAsyncSession(); await SaveApiKeys(systemSession); var savedWinAuth = SaveWindowsAuth(systemSession); if(needToSaveChanges) await systemSession.SaveChangesAsync(); ApplicationModel.Current.Notifications.Add(savedWinAuth ? new Notification("Api keys and Windows Authentication saved") : new Notification("Only Api keys where saved, something when wrong with Windows Authentication", NotificationLevel.Error)); return; } var periodicBackup = settingsModel.GetSection<PeriodicBackupSettingsSectionModel>(); if (periodicBackup != null) await SavePeriodicBackup(periodicBackup, session); var quotaSettings = settingsModel.GetSection<QuotaSettingsSectionModel>(); if (quotaSettings != null) { settingsModel.DatabaseDocument.Settings[Constants.SizeHardLimitInKB] = (quotaSettings.MaxSize * 1024).ToString(CultureInfo.InvariantCulture); settingsModel.DatabaseDocument.Settings[Constants.SizeSoftLimitInKB] = (quotaSettings.WarnSize * 1024).ToString(CultureInfo.InvariantCulture); settingsModel.DatabaseDocument.Settings[Constants.DocsHardLimit] = (quotaSettings.MaxDocs).ToString(CultureInfo.InvariantCulture); settingsModel.DatabaseDocument.Settings[Constants.DocsSoftLimit] = (quotaSettings.WarnDocs).ToString(CultureInfo.InvariantCulture); if (settingsModel.DatabaseDocument.Id == null) settingsModel.DatabaseDocument.Id = databaseName; await DatabaseCommands.CreateDatabaseAsync(settingsModel.DatabaseDocument); } var replicationSettings = settingsModel.GetSection<ReplicationSettingsSectionModel>(); if (replicationSettings != null) { ReplicationDocument document; try { document = await session.LoadAsync<ReplicationDocument>("Raven/Replication/Destinations") ?? new ReplicationDocument(); } catch { document = new ReplicationDocument(); } document.Destinations.Clear(); foreach (var destination in replicationSettings.ReplicationDestinations.Where(destination => !string.IsNullOrWhiteSpace(destination.Url))) { document.Destinations.Add(destination); } try { if(document.Destinations.Count != 0 && document.Destinations.Any(destination => destination.Disabled == false)) await CheckDestinations(document); session.Store(document); needToSaveChanges = true; } catch (Exception e) { ApplicationModel.Current.AddErrorNotification(e.GetBaseException()); } } var scriptedSettings = settingsModel.GetSection<ScriptedIndexSettingsSectionModel>(); if (scriptedSettings != null) { scriptedSettings.StoreChanges(); foreach (var scriptedIndexResults in scriptedSettings.ScriptedIndexes) { if (scriptedIndexResults.Value != null) { scriptedIndexResults.Value.Id = ScriptedIndexResults.IdPrefix + scriptedIndexResults.Key; session.Store(scriptedIndexResults.Value, scriptedIndexResults.Value.Id); } } foreach (var indexName in scriptedSettings.DeletedIndexes) { var id = ScriptedIndexResults.IdPrefix + indexName; await DatabaseCommands.DeleteDocumentAsync(id); } needToSaveChanges = true; } var sqlReplicationSettings = settingsModel.GetSection<SqlReplicationSettingsSectionModel>(); if (sqlReplicationSettings != null) { if (sqlReplicationSettings.SqlReplicationConfigs.Any(config => string.IsNullOrWhiteSpace(config.Name)) == false) { var problemWithTable = false; foreach (var sqlReplicationConfigModel in sqlReplicationSettings.SqlReplicationConfigs) { var hashset = new HashSet<string>(); foreach (var sqlReplicationTable in sqlReplicationConfigModel.SqlReplicationTables) { var exists = !hashset.Add(sqlReplicationTable.TableName); if (string.IsNullOrWhiteSpace(sqlReplicationTable.DocumentKeyColumn) || string.IsNullOrWhiteSpace(sqlReplicationTable.TableName) || exists) { problemWithTable = true; break; } } if (problemWithTable) break; } if (problemWithTable) { ApplicationModel.Current.AddNotification( new Notification( "Sql Replication settings were not saved, all tables must distinct names and have document keys", NotificationLevel.Error)); } else { var hasChanges = new List<string>(); var documents = await session.Advanced.LoadStartingWithAsync<SqlReplicationConfig>("Raven/SqlReplication/Configuration/"); sqlReplicationSettings.UpdateIds(); if (documents != null) { hasChanges = sqlReplicationSettings.SqlReplicationConfigs.Where(config => HasChanges(config, documents.FirstOrDefault(replicationConfig =>replicationConfig.Name == config.Name))) .Select(config => config.Name).ToList(); foreach (var sqlReplicationConfig in documents) { if (sqlReplicationSettings.SqlReplicationConfigs.All(config => config.Id != sqlReplicationConfig.Id)) { session.Delete(sqlReplicationConfig); } } } if (hasChanges != null && hasChanges.Count > 0) { var resetReplication = new ResetReplication(hasChanges); await resetReplication.ShowAsync(); const string ravenSqlreplicationStatus = "Raven/SqlReplication/Status"; var status = await session.LoadAsync<SqlReplicationStatus>(ravenSqlreplicationStatus); if(status == null) status = new SqlReplicationStatus(); foreach (var name in resetReplication.Selected) { var lastReplicatedEtag = status.LastReplicatedEtags.FirstOrDefault(etag => etag.Name == name); if (lastReplicatedEtag != null) lastReplicatedEtag.LastDocEtag = Etag.Empty; } session.Store(status, ravenSqlreplicationStatus); } // preload all those values, so we only do this in a single request await session.LoadAsync<SqlReplicationConfig>( sqlReplicationSettings.SqlReplicationConfigs.Select( x => "Raven/SqlReplication/Configuration/" + x.Name) ); foreach (var sqlReplicationConfig in sqlReplicationSettings.SqlReplicationConfigs) { var id = "Raven/SqlReplication/Configuration/" + sqlReplicationConfig.Name; var config = await session.LoadAsync<SqlReplicationConfig>(id); config = UpdateConfig(config, sqlReplicationConfig); session.Store(config); } } needToSaveChanges = true; } else { ApplicationModel.Current.AddNotification( new Notification("Sql Replication settings not saved, all replications must have a name", NotificationLevel.Error)); } } var versioningSettings = settingsModel.GetSection<VersioningSettingsSectionModel>(); if (versioningSettings != null) { var versionsToDelete = versioningSettings.OriginalVersioningConfigurations .Where(originalVersioningConfiguration => versioningSettings.VersioningConfigurations.Contains(originalVersioningConfiguration) == false) .ToList(); foreach (var versioningConfiguration in versionsToDelete) { await DatabaseCommands.DeleteDocumentAsync(versioningConfiguration.Id); } foreach (var versioningConfiguration in versioningSettings.VersioningConfigurations) { if (versioningConfiguration.Id.StartsWith("Raven/Versioning/",StringComparison.OrdinalIgnoreCase) == false) versioningConfiguration.Id = "Raven/Versioning/" + versioningConfiguration.Id; session.Store(versioningConfiguration); } if (versioningSettings.DatabaseDocument != null) await DatabaseCommands.CreateDatabaseAsync(versioningSettings.DatabaseDocument); needToSaveChanges = true; } var authorizationSettings = settingsModel.GetSection<AuthorizationSettingsSectionModel>(); if (authorizationSettings != null) { var usersToDelete = authorizationSettings.OriginalAuthorizationUsers .Where(authorizationUser => authorizationSettings.AuthorizationUsers.Contains(authorizationUser) == false) .ToList(); foreach (var authorizationUser in usersToDelete) { await DatabaseCommands.DeleteDocumentAsync(authorizationUser.Id); } var rolesToDelete = authorizationSettings.OriginalAuthorizationRoles .Where(authorizationRole => authorizationSettings.AuthorizationRoles.Contains(authorizationRole) == false) .ToList(); foreach (var authorizationRole in rolesToDelete) { await DatabaseCommands.DeleteDocumentAsync(authorizationRole.Id); } foreach (var authorizationRole in authorizationSettings.AuthorizationRoles) { session.Store(authorizationRole); } foreach (var authorizationUser in authorizationSettings.AuthorizationUsers) { session.Store(authorizationUser); } needToSaveChanges = true; } if(needToSaveChanges) await session.SaveChangesAsync(); foreach (var settingsSectionModel in settingsModel.Sections) { settingsSectionModel.MarkAsSaved(); } ApplicationModel.Current.AddNotification(new Notification("Updated Settings for: " + databaseName)); }
private void UpdateLastReplicatedStatus(SqlReplicationStatus localReplicationStatus, List<SqlReplicationConfig> config) { var lastReplicatedToDelete = new List<LastReplicatedEtag>(); foreach (var lastReplicated in localReplicationStatus.LastReplicatedEtags) { if (config.Exists(x => x.Name.Equals(lastReplicated.Name, StringComparison.InvariantCultureIgnoreCase)) == false) { lastReplicatedToDelete.Add(lastReplicated); } } if (lastReplicatedToDelete.Count == 0) return; // nothing to do foreach (var status in lastReplicatedToDelete) { localReplicationStatus.LastReplicatedEtags.Remove(status); } SaveNewReplicationStatus(localReplicationStatus); }