From 557e90467dbbac13fd79922dae83af5783d158d0 Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Mon, 5 Oct 2026 20:36:52 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Query=20the=20staging=20retry=20?= =?UTF-8?q?batch=20through=20the=20static=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GetStagingBatch ran a dynamic query on RetryBatches filtered by Status. RavenDB serves that with an Auto/RetryBatches/ByStatus index. The retry processor calls it on every cycle, so the auto index exists on every error database. An auto index has no per-index search engine setting, so the "Error Database Search Engine" custom check keeps failing after all static indexes are migrated to Lucene. RetryBatches_ByStatusAndSession already maps Status. Query through it. --- .../RetryStagingStore.cs | 6 +++-- .../RetryStagingStoreIndexTests.cs | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/ServiceControl.Persistence.Tests.RavenDB/Recoverability/RetryStagingStoreIndexTests.cs diff --git a/src/ServiceControl.Persistence.RavenDB/RetryStagingStore.cs b/src/ServiceControl.Persistence.RavenDB/RetryStagingStore.cs index e6e43b123e..1c64c3bc67 100644 --- a/src/ServiceControl.Persistence.RavenDB/RetryStagingStore.cs +++ b/src/ServiceControl.Persistence.RavenDB/RetryStagingStore.cs @@ -1,4 +1,4 @@ -namespace ServiceControl.Persistence.RavenDB +namespace ServiceControl.Persistence.RavenDB { using System.Collections.Generic; using System.Linq; @@ -22,7 +22,9 @@ class RetryStagingStore( { using var session = await sessionProvider.OpenSession(cancellationToken: cancellationToken); - var batch = await session.Query() + // Query through the static index. A dynamic query makes RavenDB create and keep an + // Auto/RetryBatches/ByStatus index, which has no per-index search engine setting. + var batch = await session.Query() .FirstOrDefaultAsync(b => b.Status == RetryBatchStatus.Staging, cancellationToken); return batch?.ToContract(); diff --git a/src/ServiceControl.Persistence.Tests.RavenDB/Recoverability/RetryStagingStoreIndexTests.cs b/src/ServiceControl.Persistence.Tests.RavenDB/Recoverability/RetryStagingStoreIndexTests.cs new file mode 100644 index 0000000000..14166c62b1 --- /dev/null +++ b/src/ServiceControl.Persistence.Tests.RavenDB/Recoverability/RetryStagingStoreIndexTests.cs @@ -0,0 +1,24 @@ +namespace ServiceControl.Persistence.Tests.RavenDB.Recoverability +{ + using System.Linq; + using System.Threading.Tasks; + using NUnit.Framework; + using Raven.Client.Documents.Operations.Indexes; + + // The staging query must use a static index. A dynamic query makes RavenDB create an + // Auto/RetryBatches/ByStatus index. An auto index has no per-index search engine setting, so it + // keeps the "Error Database Search Engine" custom check failing after all static indexes use Lucene. + [TestFixture] + class RetryStagingStoreIndexTests : RavenPersistenceTestBase + { + [Test] + public async Task Getting_the_staging_batch_creates_no_auto_index() + { + await RetryStagingStore.GetStagingBatch(); + + var indexNames = await DocumentStore.Maintenance.SendAsync(new GetIndexNamesOperation(0, int.MaxValue)); + + Assert.That(indexNames.Where(name => name.StartsWith("Auto/")), Is.Empty); + } + } +}