Skip to content

Commit

Permalink
PR feedback updates, fix build warnings, update CHANGELOG.md, etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
cgillum committed Oct 10, 2024
1 parent 26dedfc commit c4498c4
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 22 deletions.
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
# Changelog

## v1.3.1 (Unreleased)
## v1.4.0

### New

* Support for Azure Functions target-based scaling ([#169](https://github.com/microsoft/durabletask-mssql/pull/169))
* Added `net6.0` TFM to Microsoft.DurableTask.SqlServer.AzureFunctions

### Updates

* Fix SQL retry logic to open a new connection if a previous failure closed the connection ([#221](https://github.com/microsoft/durabletask-mssql/pull/221)) - contributed by [@microrama](https://github.com/microrama)
* Pin Microsoft.Azure.WebJobs.Extensions.DurableTask dependency to 2.13.7 instead of wildcard to avoid accidental build breaks

## v1.3.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@
<Import Project="../common.props" />

<PropertyGroup>
<TargetFrameworks>netstandard2.0;netcoreapp3.1</TargetFrameworks>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
</PropertyGroup>

<PropertyGroup Condition="'$(TargetFramework)' == 'net6.0'">
<DefineConstants>$(DefineConstants);FUNCTIONS_V4</DefineConstants>
</PropertyGroup>

<!-- NuGet package settings -->
Expand All @@ -16,7 +20,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.*" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.13.7" />
</ItemGroup>

<ItemGroup>
Expand Down
22 changes: 17 additions & 5 deletions src/DurableTask.SqlServer.AzureFunctions/SqlDurabilityProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ class SqlDurabilityProvider : DurabilityProvider
readonly SqlOrchestrationService service;

SqlScaleMonitor? scaleMonitor;
#if FUNCTIONS_V4
SqlTargetScaler? targetScaler;
#endif

public SqlDurabilityProvider(
SqlOrchestrationService service,
Expand Down Expand Up @@ -197,22 +200,31 @@ public override bool TryGetScaleMonitor(
string storageConnectionString,
out IScaleMonitor scaleMonitor)
{
SqlMetricsProvider sqlMetricsProvider = new SqlMetricsProvider(this.service);
scaleMonitor = this.scaleMonitor ??= new SqlScaleMonitor(this.service, hubName, sqlMetricsProvider);
if (this.scaleMonitor == null)
{
var sqlMetricsProvider = new SqlMetricsProvider(this.service);
this.scaleMonitor = new SqlScaleMonitor(hubName, sqlMetricsProvider);
}

scaleMonitor = this.scaleMonitor;
return true;
}

#if NETCOREAPP
#if FUNCTIONS_V4
public override bool TryGetTargetScaler(
string functionId,
string functionName,
string hubName,
string connectionName,
out ITargetScaler targetScaler)
{
SqlMetricsProvider sqlMetricsProvider = new SqlMetricsProvider(this.service);
targetScaler = new SqlTargetScaler(functionId, sqlMetricsProvider);
if (this.targetScaler == null)
{
var sqlMetricsProvider = new SqlMetricsProvider(this.service);
this.targetScaler = new SqlTargetScaler(hubName, sqlMetricsProvider);
}

targetScaler = this.targetScaler;
return true;
}
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public DurabilityProvider GetDurabilityProvider(DurableClientAttribute attribute
lock (this.clientProviders)
{
string key = GetDurabilityProviderKey(attribute);
if (this.clientProviders.TryGetValue(key, out DurabilityProvider clientProvider))
if (this.clientProviders.TryGetValue(key, out DurabilityProvider? clientProvider))
{
return clientProvider;
}
Expand Down
14 changes: 10 additions & 4 deletions src/DurableTask.SqlServer.AzureFunctions/SqlScaleMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,21 @@ class SqlScaleMonitor : IScaleMonitor<SqlScaleMetric>
static readonly ScaleStatus NoScaleVote = new ScaleStatus { Vote = ScaleVote.None };
static readonly ScaleStatus ScaleOutVote = new ScaleStatus { Vote = ScaleVote.ScaleOut };

readonly SqlOrchestrationService service;
readonly SqlMetricsProvider metricsProvider;

int? previousWorkerCount = -1;

public SqlScaleMonitor(SqlOrchestrationService service, string taskHubName, SqlMetricsProvider sqlMetricsProvider)
public SqlScaleMonitor(string taskHubName, SqlMetricsProvider sqlMetricsProvider)
{
this.service = service ?? throw new ArgumentNullException(nameof(service));
this.Descriptor = new ScaleMonitorDescriptor($"DurableTask-SqlServer:{taskHubName ?? "default"}");
// Scalers in Durable Functions are shared for all functions in the same task hub.
// So instead of using a function ID, we use the task hub name as the basis for the descriptor ID.
string id = $"DurableTask-SqlServer:{taskHubName ?? "default"}";

#if FUNCTIONS_V4
this.Descriptor = new ScaleMonitorDescriptor(id: id, functionId: id);
#else
this.Descriptor = new ScaleMonitorDescriptor(id);
#endif
this.metricsProvider = sqlMetricsProvider ?? throw new ArgumentNullException(nameof(sqlMetricsProvider));
}

Expand Down
20 changes: 12 additions & 8 deletions src/DurableTask.SqlServer.AzureFunctions/SqlTargetScaler.cs
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#if FUNCTIONS_V4
namespace DurableTask.SqlServer.AzureFunctions
{
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Host.Scale;

#if !NETSTANDARD
public class SqlTargetScaler : ITargetScaler
{
readonly SqlMetricsProvider sqlMetricsProvider;
readonly TargetScalerResult scaleResult;

public SqlTargetScaler(string functionId, SqlMetricsProvider sqlMetricsProvider)
public SqlTargetScaler(string taskHubName, SqlMetricsProvider sqlMetricsProvider)
{
this.sqlMetricsProvider = sqlMetricsProvider;
this.scaleResult = new TargetScalerResult();
this.TargetScalerDescriptor = new TargetScalerDescriptor(functionId);

// Scalers in Durable Functions are shared for all functions in the same task hub.
// So instead of using a function ID, we use the task hub name as the basis for the descriptor ID.
string id = $"DurableTask-SqlServer:{taskHubName ?? "default"}";
this.TargetScalerDescriptor = new TargetScalerDescriptor(id);
}

public TargetScalerDescriptor TargetScalerDescriptor { get; private set; }

public async Task<TargetScalerResult> GetScaleResultAsync(TargetScalerContext context)
{
SqlScaleMetric sqlScaleMetric = await this.sqlMetricsProvider.GetMetricsAsync();
this.scaleResult.TargetWorkerCount = sqlScaleMetric.RecommendedReplicaCount;
return this.scaleResult;
return new TargetScalerResult
{
TargetWorkerCount = sqlScaleMetric.RecommendedReplicaCount,
};
}
}
#endif
}
#endif
2 changes: 1 addition & 1 deletion src/common.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<!-- Version settings: https://andrewlock.net/version-vs-versionsuffix-vs-packageversion-what-do-they-all-mean/ -->
<PropertyGroup>
<MajorVersion>1</MajorVersion>
<MinorVersion>3</MinorVersion>
<MinorVersion>4</MinorVersion>
<PatchVersion>0</PatchVersion>
<VersionPrefix>$(MajorVersion).$(MinorVersion).$(PatchVersion)</VersionPrefix>
<VersionSuffix></VersionSuffix>
Expand Down

0 comments on commit c4498c4

Please sign in to comment.