Skip to content

Commit 69a02d8

Browse files
authored
Trying to create sync DB connection synchronously before doing async (#8870)
* Trying sync db context creation * Tests for the CreateDbConnection
1 parent 0d22d92 commit 69a02d8

10 files changed

Lines changed: 70 additions & 25 deletions

File tree

src/DatabaseMigrationTools/DatabaseMigrationTools.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<PrivateAssets>all</PrivateAssets>
6666
</PackageReference>
6767
<PackageReference Include="NuGet.Services.Validation">
68-
<Version>2.90.0</Version>
68+
<Version>2.91.0</Version>
6969
</PackageReference>
7070
</ItemGroup>
7171
<ItemGroup>

src/GitHubVulnerabilities2Db/GitHubVulnerabilities2Db.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<Version>4.3.0-dev-5066115</Version>
9292
</PackageReference>
9393
<PackageReference Include="NuGet.Services.Cursor">
94-
<Version>2.90.0</Version>
94+
<Version>2.91.0</Version>
9595
</PackageReference>
9696
</ItemGroup>
9797
<ItemGroup>

src/NuGetGallery.Core/NuGetGallery.Core.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<Version>5.9.0</Version>
5151
</PackageReference>
5252
<PackageReference Include="NuGet.Services.FeatureFlags">
53-
<Version>2.90.0</Version>
53+
<Version>2.91.0</Version>
5454
</PackageReference>
5555
<PackageReference Include="WindowsAzure.Storage">
5656
<Version>9.3.3</Version>
@@ -59,13 +59,13 @@
5959

6060
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
6161
<PackageReference Include="NuGet.Services.Messaging.Email">
62-
<Version>2.90.0</Version>
62+
<Version>2.91.0</Version>
6363
</PackageReference>
6464
<PackageReference Include="NuGet.Services.Validation">
65-
<Version>2.90.0</Version>
65+
<Version>2.91.0</Version>
6666
</PackageReference>
6767
<PackageReference Include="NuGet.Services.Validation.Issues">
68-
<Version>2.90.0</Version>
68+
<Version>2.91.0</Version>
6969
</PackageReference>
7070
<PackageReference Include="NuGet.StrongName.elmah.corelibrary">
7171
<Version>1.2.2</Version>

src/NuGetGallery.Services/Configuration/ConfigurationService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class ConfigurationService : IGalleryConfigurationService, IConfiguration
3939
SettingPrefix + "SupportRequestSqlServer",
4040
SettingPrefix + "ValidationSqlServer" };
4141

42-
public ISecretInjector SecretInjector { get; set; }
42+
public ICachingSecretInjector SecretInjector { get; set; }
4343

4444
/// <summary>
4545
/// Initializes the configuration service and associates a secret injector based on the configured KeyVault
@@ -52,7 +52,7 @@ public static ConfigurationService Initialize()
5252
var secretReader = secretReaderFactory.CreateSecretReader();
5353
var secretInjector = secretReaderFactory.CreateSecretInjector(secretReader);
5454

55-
configuration.SecretInjector = secretInjector;
55+
configuration.SecretInjector = secretInjector as ICachingSecretInjector ?? throw new InvalidOperationException("Caching secret reader is required to run the service");
5656

5757
return configuration;
5858
}

src/NuGetGallery.Services/NuGetGallery.Services.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,10 @@
317317
<Version>5.9.0</Version>
318318
</PackageReference>
319319
<PackageReference Include="NuGet.Services.Configuration">
320-
<Version>2.90.0</Version>
320+
<Version>2.91.0</Version>
321321
</PackageReference>
322322
<PackageReference Include="NuGet.Services.Logging">
323-
<Version>2.90.0</Version>
323+
<Version>2.91.0</Version>
324324
</PackageReference>
325325
<PackageReference Include="NuGet.StrongName.WebBackgrounder">
326326
<Version>0.2.0</Version>

src/NuGetGallery/App_Start/DefaultDependenciesModule.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -946,22 +946,26 @@ private static ISqlConnectionFactory CreateDbConnectionFactory(
946946
ILoggerFactory loggerFactory,
947947
string name,
948948
string connectionString,
949-
ISecretInjector secretInjector)
949+
ICachingSecretInjector secretInjector)
950950
{
951951
var logger = loggerFactory.CreateLogger($"AzureSqlConnectionFactory-{name}");
952952
return new AzureSqlConnectionFactory(connectionString, secretInjector, logger);
953953
}
954954

955-
private static DbConnection CreateDbConnection(ISqlConnectionFactory connectionFactory)
955+
public static DbConnection CreateDbConnection(ISqlConnectionFactory connectionFactory)
956956
{
957+
if (connectionFactory.TryCreate(out var connection))
958+
{
959+
return connection;
960+
}
957961
return Task.Run(() => connectionFactory.CreateAsync()).Result;
958962
}
959963

960964
private static void ConfigureGalleryReadOnlyReplicaEntitiesContext(
961965
ContainerBuilder builder,
962966
ILoggerFactory loggerFactory,
963967
ConfigurationService configuration,
964-
ISecretInjector secretInjector)
968+
ICachingSecretInjector secretInjector)
965969
{
966970
var galleryDbReadOnlyReplicaConnectionFactory = CreateDbConnectionFactory(
967971
loggerFactory,
@@ -982,7 +986,7 @@ private static void ConfigureValidationEntitiesContext(
982986
ContainerBuilder builder,
983987
ILoggerFactory loggerFactory,
984988
ConfigurationService configuration,
985-
ISecretInjector secretInjector)
989+
ICachingSecretInjector secretInjector)
986990
{
987991
var validationDbConnectionFactory = CreateDbConnectionFactory(
988992
loggerFactory,
@@ -1011,7 +1015,7 @@ private void RegisterAsynchronousValidation(
10111015
ContainerBuilder builder,
10121016
ILoggerFactory loggerFactory,
10131017
ConfigurationService configuration,
1014-
ISecretInjector secretInjector)
1018+
ICachingSecretInjector secretInjector)
10151019
{
10161020
builder
10171021
.RegisterType<NuGet.Services.Validation.ServiceBusMessageSerializer>()

src/NuGetGallery/NuGetGallery.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2254,13 +2254,13 @@
22542254
<Version>5.9.0</Version>
22552255
</PackageReference>
22562256
<PackageReference Include="NuGet.Services.Licenses">
2257-
<Version>2.90.0</Version>
2257+
<Version>2.91.0</Version>
22582258
</PackageReference>
22592259
<PackageReference Include="NuGet.Services.Owin">
2260-
<Version>2.90.0</Version>
2260+
<Version>2.91.0</Version>
22612261
</PackageReference>
22622262
<PackageReference Include="NuGet.Services.Sql">
2263-
<Version>2.90.0</Version>
2263+
<Version>2.91.0</Version>
22642264
</PackageReference>
22652265
<PackageReference Include="Owin">
22662266
<Version>1.0.0</Version>

tests/NuGetGallery.Facts/App_Start/ConfigurationServiceFacts.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public TestableConfigurationService() : base()
2727
StubRequest.Setup(stub => stub.IsLocal).Returns(false);
2828

2929
var secretReaderFactory = new EmptySecretReaderFactory();
30-
SecretInjector = secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader());
30+
SecretInjector = secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader()) as ICachingSecretInjector;
3131
}
3232

3333
public string StubConfiguredSiteRoot { get; set; }
@@ -106,7 +106,7 @@ public class TheReadSettingMethod
106106
{
107107
private class TestableConfigurationService : ConfigurationService
108108
{
109-
public TestableConfigurationService(ISecretInjector secretInjector = null)
109+
public TestableConfigurationService(ICachingSecretInjector secretInjector = null)
110110
{
111111
SecretInjector = secretInjector ?? CreateDefaultSecretInjector();
112112
}
@@ -132,10 +132,10 @@ protected override string GetAppSetting(string settingName)
132132
return AppSettingStub;
133133
}
134134

135-
private static ISecretInjector CreateDefaultSecretInjector()
135+
private static ICachingSecretInjector CreateDefaultSecretInjector()
136136
{
137137
var secretReaderFactory = new EmptySecretReaderFactory();
138-
return secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader());
138+
return secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader()) as ICachingSecretInjector;
139139
}
140140
}
141141

@@ -175,7 +175,7 @@ public async Task WhenCloudSettingIsEmptyAppSettingIsReturned()
175175
public async Task WhenSettingIsNotEmptySecretInjectorIsRan()
176176
{
177177
// Arrange
178-
var secretInjectorMock = new Mock<ISecretInjector>();
178+
var secretInjectorMock = new Mock<ICachingSecretInjector>();
179179
secretInjectorMock.Setup(x => x.InjectAsync(It.IsAny<string>()))
180180
.Returns<string>(s => Task.FromResult(s + "parsed"));
181181

@@ -201,7 +201,7 @@ public async Task WhenSettingIsNotEmptySecretInjectorIsRan()
201201
public async Task GivenNotInjectedSettingNameSecretInjectorIsNotRan(string settingName)
202202
{
203203
// Arrange
204-
var secretInjectorMock = new Mock<ISecretInjector>();
204+
var secretInjectorMock = new Mock<ICachingSecretInjector>();
205205
secretInjectorMock.Setup(x => x.InjectAsync(It.IsAny<string>()))
206206
.Returns<string>(s => Task.FromResult(s + "parsed"));
207207

tests/NuGetGallery.Facts/App_Start/DefaultDependenciesModuleFacts.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Data.SqlClient;
7+
using System.Threading.Tasks;
68
using Microsoft.ApplicationInsights;
79
using Microsoft.ApplicationInsights.DependencyCollector;
810
using Microsoft.ApplicationInsights.Extensibility;
@@ -14,7 +16,9 @@
1416
using Microsoft.ApplicationInsights.Web;
1517
using Microsoft.ApplicationInsights.WindowsServer;
1618
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
19+
using Moq;
1720
using NuGet.Services.Logging;
21+
using NuGet.Services.Sql;
1822
using NuGetGallery.Configuration;
1923
using Xunit;
2024

@@ -189,5 +193,41 @@ private Action<ITelemetryInitializer>[] GetTelemetryInitializerInspectors(string
189193
return elementInspectors.ToArray();
190194
}
191195
}
196+
197+
public class TheCreateDbConnectionMethod
198+
{
199+
[Fact]
200+
public void TriesSyncBeforeAsync()
201+
{
202+
var connectionFactoryMock = new Mock<ISqlConnectionFactory>();
203+
connectionFactoryMock
204+
.Setup(cf => cf.TryCreate(out It.Ref<SqlConnection>.IsAny))
205+
.Returns(true);
206+
207+
DefaultDependenciesModule.CreateDbConnection(connectionFactoryMock.Object);
208+
connectionFactoryMock
209+
.Verify(cf => cf.TryCreate(out It.Ref<SqlConnection>.IsAny), Times.Once);
210+
connectionFactoryMock
211+
.Verify(cf => cf.CreateAsync(), Times.Never);
212+
}
213+
214+
[Fact]
215+
public void FallsBackToAsyncIfSyncFails()
216+
{
217+
var connectionFactoryMock = new Mock<ISqlConnectionFactory>();
218+
connectionFactoryMock
219+
.Setup(cf => cf.TryCreate(out It.Ref<SqlConnection>.IsAny))
220+
.Returns(false);
221+
connectionFactoryMock
222+
.Setup(cf => cf.CreateAsync())
223+
.ReturnsAsync((SqlConnection)null);
224+
225+
DefaultDependenciesModule.CreateDbConnection(connectionFactoryMock.Object);
226+
connectionFactoryMock
227+
.Verify(cf => cf.TryCreate(out It.Ref<SqlConnection>.IsAny), Times.Once);
228+
connectionFactoryMock
229+
.Verify(cf => cf.CreateAsync(), Times.Once);
230+
}
231+
}
192232
}
193233
}

tests/NuGetGallery.Facts/Framework/TestGalleryConfigurationService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System.Collections.Generic;
5+
using NuGet.Services.KeyVault;
56
using NuGetGallery.Configuration;
67
using NuGetGallery.Configuration.SecretReader;
78

@@ -14,7 +15,7 @@ public class TestGalleryConfigurationService : ConfigurationService
1415
public TestGalleryConfigurationService()
1516
{
1617
var secretReaderFactory = new EmptySecretReaderFactory();
17-
SecretInjector = secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader());
18+
SecretInjector = secretReaderFactory.CreateSecretInjector(secretReaderFactory.CreateSecretReader()) as ICachingSecretInjector;
1819
}
1920

2021
protected override string GetAppSetting(string settingName)

0 commit comments

Comments
 (0)