Skip to content

Commit 55dd1fa

Browse files
committed
Stop adding the Corax search engine setting to existing databases
1 parent c4f2d23 commit 55dd1fa

3 files changed

Lines changed: 49 additions & 62 deletions

File tree

‎src/ServiceControl.Audit.Persistence.RavenDB/DatabaseSetup.cs‎

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
using Raven.Client.Exceptions;
1414
using Raven.Client.ServerWide;
1515
using Raven.Client.ServerWide.Operations;
16-
using Raven.Client.ServerWide.Operations.Configuration;
1716
using Indexes;
1817
using ServiceControl.RavenDB;
1918
using SagaAudit;
@@ -24,8 +23,6 @@ public async Task Execute(IDocumentStore documentStore, CancellationToken cancel
2423
{
2524
await CreateDatabase(documentStore, configuration.Name, cancellationToken);
2625

27-
await UpdateDatabaseSettings(documentStore, configuration.Name, cancellationToken);
28-
2926
await CreateIndexes(documentStore, configuration.EnableFullTextSearch, cancellationToken);
3027

3128
await StartupChecks.WarnIfIndexesUseCorax(documentStore, configuration.Name, cancellationToken);
@@ -45,8 +42,10 @@ async Task CreateDatabase(IDocumentStore documentStore, string databaseName, Can
4542
var databaseRecord = new DatabaseRecord(databaseName);
4643

4744
// New databases use Lucene: smaller indexes, lower memory usage and faster for our index definitions.
48-
// Existing databases keep the engine they were created with, see UpdateDatabaseSettings.
49-
SetSearchEngineType(databaseRecord, SearchEngineType.Lucene);
45+
// The settings of an existing database are left to the operator. An index keeps the engine it was
46+
// built with until it is rebuilt, so the database default does not change existing indexes.
47+
databaseRecord.Settings["Indexing.Auto.SearchEngineType"] = nameof(SearchEngineType.Lucene);
48+
databaseRecord.Settings["Indexing.Static.SearchEngineType"] = nameof(SearchEngineType.Lucene);
5049

5150
await documentStore.Maintenance.Server.SendAsync(new CreateDatabaseOperation(databaseRecord), cancellationToken);
5251
}
@@ -57,23 +56,6 @@ async Task CreateDatabase(IDocumentStore documentStore, string databaseName, Can
5756
}
5857
}
5958

60-
async Task UpdateDatabaseSettings(IDocumentStore documentStore, string databaseName, CancellationToken cancellationToken)
61-
{
62-
var databaseRecord = await documentStore.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(databaseName), cancellationToken) ?? throw new InvalidOperationException($"Database '{databaseName}' does not exist.");
63-
64-
// Existing databases keep their configured search engine. Changing it would trigger a full rebuild of all
65-
// indexes, which can take a long time and a lot of resources on large databases. Databases created before the
66-
// search engine was pinned explicitly get Corax, which was the default at the time.
67-
if (!SetSearchEngineType(databaseRecord, SearchEngineType.Corax))
68-
{
69-
return;
70-
}
71-
72-
await documentStore.Maintenance.ForDatabase(databaseName).SendAsync(new PutDatabaseSettingsOperation(databaseName, databaseRecord.Settings), cancellationToken);
73-
await documentStore.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, true), cancellationToken);
74-
await documentStore.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, false), cancellationToken);
75-
}
76-
7759
public static async Task DeleteLegacySagaDetailsIndex(IDocumentStore documentStore, CancellationToken cancellationToken = default)
7860
{
7961
// If the SagaDetailsIndex exists but does not have a .Take(50000), then we remove the current SagaDetailsIndex and
@@ -121,16 +103,6 @@ async Task ConfigureExpiration(IDocumentStore documentStore, CancellationToken c
121103
await documentStore.Maintenance.SendAsync(new ConfigureExpirationOperation(expirationConfig), cancellationToken);
122104
}
123105

124-
bool SetSearchEngineType(DatabaseRecord database, SearchEngineType searchEngineType)
125-
{
126-
var updated = false;
127-
128-
updated |= database.Settings.TryAdd("Indexing.Auto.SearchEngineType", searchEngineType.ToString());
129-
updated |= database.Settings.TryAdd("Indexing.Static.SearchEngineType", searchEngineType.ToString());
130-
131-
return updated;
132-
}
133-
134106
internal const string MessagesViewIndexWithFulltextSearchName = "MessagesViewIndexWithFullTextSearch";
135107
internal const string SagaDetailsIndexName = "SagaDetailsIndex";
136108
internal const string MessagesViewIndexName = "MessagesViewIndex";
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace ServiceControl.Audit.Persistence.Tests;
2+
3+
using System;
4+
using System.Threading.Tasks;
5+
using NUnit.Framework;
6+
using Persistence.RavenDB;
7+
using Raven.Client.Documents.Indexes;
8+
using Raven.Client.ServerWide.Operations;
9+
using Raven.Client.ServerWide.Operations.Configuration;
10+
11+
[TestFixture]
12+
class DatabaseSettingsTests : PersistenceTestFixture
13+
{
14+
[Test]
15+
public async Task New_database_should_use_lucene()
16+
{
17+
var record = await configuration.DocumentStore.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(configuration.DocumentStore.Database), TestTimeoutCancellationToken);
18+
19+
Assert.That(record.Settings, Does.ContainKey("Indexing.Auto.SearchEngineType").WithValue(nameof(SearchEngineType.Lucene)));
20+
Assert.That(record.Settings, Does.ContainKey("Indexing.Static.SearchEngineType").WithValue(nameof(SearchEngineType.Lucene)));
21+
}
22+
23+
[Test]
24+
public async Task Setup_should_not_add_search_engine_settings_to_an_existing_database()
25+
{
26+
var store = configuration.DocumentStore;
27+
var databaseName = store.Database;
28+
29+
// RavenDB Studio removes a database setting whose value equals the server default. Versions 6.20.0 to 6.21.2
30+
// then added Corax back at every start, also in maintenance mode, and undid the operator's choice.
31+
await store.Maintenance.ForDatabase(databaseName).SendAsync(new PutDatabaseSettingsOperation(databaseName, []), TestTimeoutCancellationToken);
32+
await store.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, true), TestTimeoutCancellationToken);
33+
await store.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, false), TestTimeoutCancellationToken);
34+
35+
var databaseConfiguration = new DatabaseConfiguration(databaseName, 60, true, TimeSpan.FromDays(1), 100_000, 20, 20, new ServerConfiguration(store.Urls[0]), TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30));
36+
await new DatabaseSetup(databaseConfiguration).Execute(store, TestTimeoutCancellationToken);
37+
38+
var record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(databaseName), TestTimeoutCancellationToken);
39+
40+
Assert.That(record.Settings, Does.Not.ContainKey("Indexing.Auto.SearchEngineType"));
41+
Assert.That(record.Settings, Does.Not.ContainKey("Indexing.Static.SearchEngineType"));
42+
}
43+
}

‎src/ServiceControl.Persistence.RavenDB/DatabaseSetup.cs‎

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ namespace ServiceControl.Persistence.RavenDB
88
using Raven.Client.Exceptions;
99
using Raven.Client.ServerWide;
1010
using Raven.Client.ServerWide.Operations;
11-
using Raven.Client.ServerWide.Operations.Configuration;
1211
using ServiceControl.RavenDB;
1312

1413
class DatabaseSetup(RavenPersisterSettings settings, IDocumentStore documentStore)
@@ -18,9 +17,6 @@ public async Task Execute(CancellationToken cancellationToken = default)
1817
await CreateDatabase(settings.DatabaseName, cancellationToken);
1918
await CreateDatabase(settings.ThroughputDatabaseName, cancellationToken);
2019

21-
await UpdateDatabaseSettings(settings.DatabaseName, cancellationToken);
22-
await UpdateDatabaseSettings(settings.ThroughputDatabaseName, cancellationToken);
23-
2420
await IndexDeployment.CreateIndexesAsync(typeof(DatabaseSetup).Assembly, documentStore, cancellationToken);
2521

2622
await StartupChecks.WarnIfIndexesUseCorax(documentStore, settings.DatabaseName, cancellationToken);
@@ -41,7 +37,8 @@ async Task CreateDatabase(string databaseName, CancellationToken cancellationTok
4137
var databaseRecord = new DatabaseRecord(databaseName);
4238

4339
// New databases use Lucene: smaller indexes, lower memory usage and faster for our index definitions.
44-
// Existing databases keep the engine they were created with, see UpdateDatabaseSettings.
40+
// The settings of an existing database are left to the operator. An index keeps the engine it was
41+
// built with until it is rebuilt, so the database default does not change existing indexes.
4542
databaseRecord.Settings.Add("Indexing.Auto.SearchEngineType", "Lucene");
4643
databaseRecord.Settings.Add("Indexing.Static.SearchEngineType", "Lucene");
4744

@@ -54,31 +51,6 @@ async Task CreateDatabase(string databaseName, CancellationToken cancellationTok
5451
}
5552
}
5653

57-
async Task UpdateDatabaseSettings(string databaseName, CancellationToken cancellationToken)
58-
{
59-
var dbRecord = await documentStore.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(databaseName), cancellationToken);
60-
61-
if (dbRecord is null)
62-
{
63-
throw new InvalidOperationException($"Database '{databaseName}' does not exist.");
64-
}
65-
66-
// Existing databases keep their configured search engine. Changing it would trigger a full rebuild of all
67-
// indexes, which can take a long time and a lot of resources on large databases. Databases created before the
68-
// search engine was pinned explicitly get Corax, which was the default at the time.
69-
var updated = false;
70-
71-
updated |= dbRecord.Settings.TryAdd("Indexing.Auto.SearchEngineType", "Corax");
72-
updated |= dbRecord.Settings.TryAdd("Indexing.Static.SearchEngineType", "Corax");
73-
74-
if (updated)
75-
{
76-
await documentStore.Maintenance.ForDatabase(databaseName).SendAsync(new PutDatabaseSettingsOperation(databaseName, dbRecord.Settings), cancellationToken);
77-
await documentStore.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, true), cancellationToken);
78-
await documentStore.Maintenance.Server.SendAsync(new ToggleDatabasesStateOperation(databaseName, false), cancellationToken);
79-
}
80-
}
81-
8254
async Task ConfigureExpiration(RavenPersisterSettings settings, CancellationToken cancellationToken)
8355
{
8456
var expirationConfig = new ExpirationConfiguration

0 commit comments

Comments
 (0)