fix: serialize database activity during playout

This commit is contained in:
2026-07-11 03:43:59 +09:00
parent 8dae7b8e0d
commit f76dbc7272
13 changed files with 327 additions and 46 deletions

View File

@@ -17,6 +17,8 @@ public sealed class DatabaseHealthServiceTests
Assert.Equal(DatabaseHealthState.NotConfigured, status.State);
Assert.Equal(DataSourceKind.Oracle, status.Source);
Assert.Equal(TimeSpan.Zero, status.Elapsed);
Assert.Null(status.IsTransient);
Assert.Null(status.ProviderErrorCode);
Assert.Equal(0, executor.CallCount);
}
@@ -37,6 +39,8 @@ public sealed class DatabaseHealthServiceTests
Assert.Equal(DatabaseHealthState.Healthy, status.State);
Assert.Equal(source, status.Source);
Assert.Null(status.IsTransient);
Assert.Null(status.ProviderErrorCode);
Assert.Equal(1, executor.CallCount);
Assert.Equal(expectedQuery, executor.LastQuery);
}
@@ -48,7 +52,10 @@ public sealed class DatabaseHealthServiceTests
var executor = new StubDataQueryExecutor
{
ExecuteAsyncHandler = (_, _, _, _) => Task.FromException<DataTable>(
new DatabaseQueryException(DataSourceKind.MariaDb, isTransient: true))
new DatabaseQueryException(
DataSourceKind.MariaDb,
isTransient: true,
providerErrorCode: 1042))
};
var service = new DatabaseHealthService(executor, TestOptions.CreateConfigured());
@@ -56,6 +63,8 @@ public sealed class DatabaseHealthServiceTests
Assert.Equal(DatabaseHealthState.Unhealthy, status.State);
Assert.Equal(DataSourceKind.MariaDb, status.Source);
Assert.True(status.IsTransient);
Assert.Equal(1042, status.ProviderErrorCode);
Assert.DoesNotContain(host, status.UserMessage, StringComparison.Ordinal);
}
@@ -73,6 +82,25 @@ public sealed class DatabaseHealthServiceTests
Assert.Equal(DatabaseHealthState.TimedOut, status.State);
Assert.Equal(DataSourceKind.Oracle, status.Source);
Assert.True(status.IsTransient);
Assert.Null(status.ProviderErrorCode);
}
[Fact]
public async Task CheckAsync_NonOperationInfrastructureFailure_DoesNotInventDiagnostics()
{
var executor = new StubDataQueryExecutor
{
ExecuteAsyncHandler = (_, _, _, _) => Task.FromException<DataTable>(
new DatabaseConfigurationException("safe configuration failure"))
};
var service = new DatabaseHealthService(executor, TestOptions.CreateConfigured());
var status = await service.CheckAsync(DataSourceKind.Oracle);
Assert.Equal(DatabaseHealthState.Unhealthy, status.State);
Assert.Null(status.IsTransient);
Assert.Null(status.ProviderErrorCode);
}
}