From dbf4a74de9c16d4b96cb94cd3ab8023a21d79027 Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Wed, 9 Aug 2023 16:10:01 -0400 Subject: [PATCH 1/6] init servicefactory --- build/common.props | 2 +- .../Trigger/CosmosDbScalerProvider.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build/common.props b/build/common.props index 465fec94..dbdf9ac8 100644 --- a/build/common.props +++ b/build/common.props @@ -3,7 +3,7 @@ 3.0.0$(VersionSuffix) 5.0.0$(VersionSuffix) - 4.3.0$(VersionSuffix) + 4.3.0-alpha 3.2.0$(VersionSuffix) 3.0.0$(VersionSuffix) 3.0.3$(VersionSuffix) diff --git a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs index b05bd599..c009c572 100644 --- a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs +++ b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs @@ -6,6 +6,7 @@ using Microsoft.Azure.WebJobs.Host; using Microsoft.Azure.WebJobs.Host.Scale; using Microsoft.Extensions.Azure; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -31,11 +32,12 @@ public CosmosDbScalerProvider(IServiceProvider serviceProvider, TriggerMetadata azureComponentFactory = serviceProvider.GetService(); } + IConfiguration config = serviceProvider.GetService(); ILoggerFactory loggerFactory = serviceProvider.GetService(); CosmosDbMetadata cosmosDbMetadata = JsonConvert.DeserializeObject(triggerMetadata.Metadata.ToString()); cosmosDbMetadata.ResolveProperties(serviceProvider.GetService()); IOptions options = serviceProvider.GetService>(); - ICosmosDBServiceFactory serviceFactory = serviceProvider.GetService(); + ICosmosDBServiceFactory serviceFactory = new DefaultCosmosDBServiceFactory(config, azureComponentFactory); CosmosClient cosmosClient = serviceFactory.CreateService(cosmosDbMetadata.Connection, options.Value); var monitoredContainer = cosmosClient.GetContainer(cosmosDbMetadata.DatabaseName, cosmosDbMetadata.ContainerName); var leaseContainer = cosmosClient.GetContainer(string.IsNullOrEmpty(cosmosDbMetadata.LeaseDatabaseName) ? cosmosDbMetadata.DatabaseName : cosmosDbMetadata.LeaseDatabaseName, string.IsNullOrEmpty(cosmosDbMetadata.LeaseContainerName) ? CosmosDBTriggerConstants.DefaultLeaseCollectionName : cosmosDbMetadata.LeaseContainerName); From 72a6c81f8fc623edf86064a661b079bcf5572165 Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Wed, 9 Aug 2023 16:31:31 -0400 Subject: [PATCH 2/6] revert to use versionsuffix again --- build/common.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/common.props b/build/common.props index dbdf9ac8..465fec94 100644 --- a/build/common.props +++ b/build/common.props @@ -3,7 +3,7 @@ 3.0.0$(VersionSuffix) 5.0.0$(VersionSuffix) - 4.3.0-alpha + 4.3.0$(VersionSuffix) 3.2.0$(VersionSuffix) 3.0.0$(VersionSuffix) 3.0.3$(VersionSuffix) From 4c33999821331f42fb8c13a47f7cdc61de07d071 Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Wed, 9 Aug 2023 17:30:39 -0400 Subject: [PATCH 3/6] add ws --- .../Trigger/CosmosDbScalerProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs index c009c572..1330d13e 100644 --- a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs +++ b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs @@ -37,7 +37,7 @@ public CosmosDbScalerProvider(IServiceProvider serviceProvider, TriggerMetadata CosmosDbMetadata cosmosDbMetadata = JsonConvert.DeserializeObject(triggerMetadata.Metadata.ToString()); cosmosDbMetadata.ResolveProperties(serviceProvider.GetService()); IOptions options = serviceProvider.GetService>(); - ICosmosDBServiceFactory serviceFactory = new DefaultCosmosDBServiceFactory(config, azureComponentFactory); + ICosmosDBServiceFactory serviceFactory = new DefaultCosmosDBServiceFactory(config, azureComponentFactory); CosmosClient cosmosClient = serviceFactory.CreateService(cosmosDbMetadata.Connection, options.Value); var monitoredContainer = cosmosClient.GetContainer(cosmosDbMetadata.DatabaseName, cosmosDbMetadata.ContainerName); var leaseContainer = cosmosClient.GetContainer(string.IsNullOrEmpty(cosmosDbMetadata.LeaseDatabaseName) ? cosmosDbMetadata.DatabaseName : cosmosDbMetadata.LeaseDatabaseName, string.IsNullOrEmpty(cosmosDbMetadata.LeaseContainerName) ? CosmosDBTriggerConstants.DefaultLeaseCollectionName : cosmosDbMetadata.LeaseContainerName); From c890cc982db59e68e73cc8680d48e0a396a08143 Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Wed, 9 Aug 2023 17:30:52 -0400 Subject: [PATCH 4/6] remove ws --- .../Trigger/CosmosDbScalerProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs index 1330d13e..c009c572 100644 --- a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs +++ b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDbScalerProvider.cs @@ -37,7 +37,7 @@ public CosmosDbScalerProvider(IServiceProvider serviceProvider, TriggerMetadata CosmosDbMetadata cosmosDbMetadata = JsonConvert.DeserializeObject(triggerMetadata.Metadata.ToString()); cosmosDbMetadata.ResolveProperties(serviceProvider.GetService()); IOptions options = serviceProvider.GetService>(); - ICosmosDBServiceFactory serviceFactory = new DefaultCosmosDBServiceFactory(config, azureComponentFactory); + ICosmosDBServiceFactory serviceFactory = new DefaultCosmosDBServiceFactory(config, azureComponentFactory); CosmosClient cosmosClient = serviceFactory.CreateService(cosmosDbMetadata.Connection, options.Value); var monitoredContainer = cosmosClient.GetContainer(cosmosDbMetadata.DatabaseName, cosmosDbMetadata.ContainerName); var leaseContainer = cosmosClient.GetContainer(string.IsNullOrEmpty(cosmosDbMetadata.LeaseDatabaseName) ? cosmosDbMetadata.DatabaseName : cosmosDbMetadata.LeaseDatabaseName, string.IsNullOrEmpty(cosmosDbMetadata.LeaseContainerName) ? CosmosDBTriggerConstants.DefaultLeaseCollectionName : cosmosDbMetadata.LeaseContainerName); From 52d7d6d2168ce20b3f502bb8a4320f862fba8f9e Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Tue, 24 Oct 2023 14:29:31 -0400 Subject: [PATCH 5/6] add unit tests and catch overflow exception --- .../Trigger/CosmosDBTargetScaler.cs | 11 ++++++++++- .../Trigger/CosmosDBTargetScalerTests.cs | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs index 6b3f56cc..77d9fe5a 100644 --- a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs +++ b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs @@ -57,7 +57,16 @@ internal TargetScalerResult GetScaleResultInternal(TargetScalerContext context, concurrency = DefaultMaxItemsPerInvocation; } - int targetWorkerCount = (int)Math.Ceiling(remainingWork / (decimal)concurrency); + int targetWorkerCount; + + try + { + targetWorkerCount = (int)Math.Ceiling(remainingWork / (decimal)concurrency); + } + catch (OverflowException) + { + targetWorkerCount = int.MaxValue; + } string targetScaleMessage = $"Target worker count for function '{_functionId}' is '{targetWorkerCount}' (MonitoredContainerId='{_monitoredContainer.Id}', MonitoredContainerDatabaseId='{_monitoredContainer.Database.Id}', RemainingWork ='{remainingWork}', Concurrency='{concurrency}')."; diff --git a/test/WebJobs.Extensions.CosmosDB.Tests/Trigger/CosmosDBTargetScalerTests.cs b/test/WebJobs.Extensions.CosmosDB.Tests/Trigger/CosmosDBTargetScalerTests.cs index 8ca69b2e..626e458d 100644 --- a/test/WebJobs.Extensions.CosmosDB.Tests/Trigger/CosmosDBTargetScalerTests.cs +++ b/test/WebJobs.Extensions.CosmosDB.Tests/Trigger/CosmosDBTargetScalerTests.cs @@ -71,6 +71,9 @@ public CosmosDBTargetScalerTests() [InlineData(null, 0, 3, 0)] [InlineData(50, 200, 0, 4)] [InlineData(-50, 200, 0, 2)] + [InlineData(1, 2147483650, 1, 1)] + [InlineData(1, 2147483650, 2147483647, 2147483647)] + [InlineData(2, 2147483650, 1073741825, 1073741825)] public void GetScaleResultInternal(int? concurrency, long remainingWork, int partitionCount, int expectedTargetWorkerCount) { TargetScalerContext targetScalerContext = new TargetScalerContext From 31d85a0dad11b664f6df99b67e60686f0836edf7 Mon Sep 17 00:00:00 2001 From: Vincent Chiang Date: Wed, 25 Oct 2023 11:03:26 -0400 Subject: [PATCH 6/6] add chcked block --- .../Trigger/CosmosDBTargetScaler.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs index 77d9fe5a..1432d1d3 100644 --- a/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs +++ b/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTargetScaler.cs @@ -61,7 +61,10 @@ internal TargetScalerResult GetScaleResultInternal(TargetScalerContext context, try { - targetWorkerCount = (int)Math.Ceiling(remainingWork / (decimal)concurrency); + checked + { + targetWorkerCount = (int)Math.Ceiling(remainingWork / (decimal)concurrency); + } } catch (OverflowException) {