Skip to content

Commit

Permalink
Fix multiple triggers of the same type adding to DI (#38756)
Browse files Browse the repository at this point in the history
* Fix multiple triggers of the same type adding to DI

* Compare with created instance

* Enabling ScaleHostEndToEndTest again

* Adding a comment
  • Loading branch information
alrod authored Sep 19, 2023
1 parent 9864850 commit 907ce40
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License. See License.txt in the project root for license information.

using System;
using System.Linq;
using System.Net;
using Azure.Messaging.EventHubs.Consumer;
using Microsoft.Azure.WebJobs;
Expand Down Expand Up @@ -94,9 +95,16 @@ public static IWebJobsBuilder AddEventHubs(this IWebJobsBuilder builder, Action<

internal static IWebJobsBuilder AddEventHubsScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata)
{
builder.Services.AddSingleton(serviceProvider => new EventHubsScalerProvider(serviceProvider, triggerMetadata));
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetRequiredService<EventHubsScalerProvider>());
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetRequiredService<EventHubsScalerProvider>());
// We need to register an instance of EventHubsScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider.
// Since there can be more than one instance of EventHubsScalerProvider, we have to store a reference to the created instance to filter it out later.
EventHubsScalerProvider eventHubsScalerProvider = null;
builder.Services.AddSingleton(serviceProvider =>
{
eventHubsScalerProvider = new EventHubsScalerProvider(serviceProvider, triggerMetadata);
return eventHubsScalerProvider ;
});
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetServices<EventHubsScalerProvider>().Single(x => x == eventHubsScalerProvider ));
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetServices<EventHubsScalerProvider>().Single(x => x == eventHubsScalerProvider ));

return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ public ScaleHostEndToEndTests() : base()
}

[Test]
[Ignore("Consistently failing in CI; caused by #38673")]
[TestCase(false)]
[TestCase(true)]
public async Task ScaleHostEndToEndTest(bool tbsEnabled)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License. See License.txt in the project root for license information.

using System;
using System.Linq;
using System.Net;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.ServiceBus.Config;
Expand Down Expand Up @@ -108,9 +109,15 @@ public static IWebJobsBuilder AddServiceBus(this IWebJobsBuilder builder, Action

internal static IWebJobsBuilder AddServiceBusScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata)
{
builder.Services.AddSingleton(serviceProvider => new ServiceBusScalerProvider(serviceProvider, triggerMetadata));
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetRequiredService<ServiceBusScalerProvider>());
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetRequiredService<ServiceBusScalerProvider>());
// We need to register an instance of ServiceBusScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider.
// Since there can be more than one instance of ServiceBusScalerProvider, we have to store a reference to the created instance to filter it out later.
ServiceBusScalerProvider serviceBusScalerProvider = null;
builder.Services.AddSingleton(serviceProvider => {
serviceBusScalerProvider = new ServiceBusScalerProvider(serviceProvider, triggerMetadata);
return serviceBusScalerProvider;
});
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetServices<ServiceBusScalerProvider>().Single(x => x == serviceBusScalerProvider));
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetServices<ServiceBusScalerProvider>().Single(x => x == serviceBusScalerProvider));

return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License.

using System;
using System.Linq;
using System.ComponentModel;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Storage.Common;
Expand Down Expand Up @@ -76,9 +77,16 @@ public static IWebJobsBuilder AddAzureStorageQueues(this IWebJobsBuilder builder
[EditorBrowsable(EditorBrowsableState.Never)]
public static IWebJobsBuilder AddAzureStorageQueuesScaleForTrigger(this IWebJobsBuilder builder, TriggerMetadata triggerMetadata)
{
builder.Services.AddSingleton(serviceProvider => new QueueScalerProvider(serviceProvider, triggerMetadata));
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetRequiredService<QueueScalerProvider>());
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetRequiredService<QueueScalerProvider>());
// We need to register an instance of QueueScalerProvider in the DI container and then map it to the interfaces IScaleMonitorProvider and ITargetScalerProvider.
// Since there can be more than one instance of QueueScalerProvider, we have to store a reference to the created instance to filter it out later.
QueueScalerProvider serviceBusScalerProvider = null;
builder.Services.AddSingleton(serviceProvider =>
{
serviceBusScalerProvider = new QueueScalerProvider(serviceProvider, triggerMetadata);
return serviceBusScalerProvider;
});
builder.Services.AddSingleton<IScaleMonitorProvider>(serviceProvider => serviceProvider.GetServices<QueueScalerProvider>().Single(x => x == serviceBusScalerProvider));
builder.Services.AddSingleton<ITargetScalerProvider>(serviceProvider => serviceProvider.GetServices<QueueScalerProvider>().Single(x => x == serviceBusScalerProvider));

return builder;
}
Expand Down

0 comments on commit 907ce40

Please sign in to comment.