diff --git a/.github/workflows/smoketest-dotnet-isolated-v4.yml b/.github/workflows/smoketest-dotnet-isolated-v4.yml index 2b5daaadc..f5d45f539 100644 --- a/.github/workflows/smoketest-dotnet-isolated-v4.yml +++ b/.github/workflows/smoketest-dotnet-isolated-v4.yml @@ -86,7 +86,7 @@ jobs: uses: actions/cache@v3 with: path: .azurite - key: ${{ runner.os }}-azurite-v1 + key: ${{ runner.os }}-azurite-v2 - name: Install Azurite if: steps.cache-azurite.outputs.cache-hit != 'true' @@ -100,7 +100,7 @@ jobs: - name: Start Azurite shell: pwsh run: | - Start-Process (Resolve-Path '.azurite\node_modules\.bin\azurite.cmd') -ArgumentList '--silent','--blobPort','10000','--queuePort','10001','--tablePort','10002' + Start-Process (Resolve-Path '.azurite/node_modules/.bin/azurite') -ArgumentList '--silent','--skipApiVersionCheck','--blobPort','10000','--queuePort','10001','--tablePort','10002' $timeout = 30 for ($i = 1; $i -le $timeout; $i++) { try { diff --git a/.github/workflows/validate-build-analyzer.yml b/.github/workflows/validate-build-analyzer.yml index f9e746efe..eaede117b 100644 --- a/.github/workflows/validate-build-analyzer.yml +++ b/.github/workflows/validate-build-analyzer.yml @@ -69,7 +69,7 @@ jobs: - name: Start Azurite shell: pwsh run: | - Start-Process (Resolve-Path '.azurite\node_modules\.bin\azurite.cmd') -ArgumentList '--silent','--blobPort','10000','--queuePort','10001','--tablePort','10002' + Start-Process (Resolve-Path '.azurite\node_modules\.bin\azurite.cmd') -ArgumentList '--silent','--skipApiVersionCheck','--blobPort','10000','--queuePort','10001','--tablePort','10002' $timeout = 30 for ($i = 1; $i -le $timeout; $i++) { try { diff --git a/.github/workflows/validate-build-e2e.yml b/.github/workflows/validate-build-e2e.yml index 814df02d6..edeb5be24 100644 --- a/.github/workflows/validate-build-e2e.yml +++ b/.github/workflows/validate-build-e2e.yml @@ -76,7 +76,7 @@ jobs: - name: Start Azurite shell: pwsh run: | - Start-Process (Resolve-Path '.azurite\node_modules\.bin\azurite.cmd') -ArgumentList '--silent','--blobPort','10000','--queuePort','10001','--tablePort','10002' + Start-Process (Resolve-Path '.azurite\node_modules\.bin\azurite.cmd') -ArgumentList '--silent','--skipApiVersionCheck','--blobPort','10000','--queuePort','10001','--tablePort','10002' $timeout = 30 for ($i = 1; $i -le $timeout; $i++) { try { diff --git a/.github/workflows/validate-build-scale.yml b/.github/workflows/validate-build-scale.yml index b4319d09d..a56cde80b 100644 --- a/.github/workflows/validate-build-scale.yml +++ b/.github/workflows/validate-build-scale.yml @@ -64,7 +64,7 @@ jobs: - name: Run Scale tests run : | - ./.azurite/node_modules/.bin/azurite --silent --blobPort 10000 --queuePort 10001 --tablePort 10002 & + ./.azurite/node_modules/.bin/azurite --silent --skipApiVersionCheck --blobPort 10000 --queuePort 10001 --tablePort 10002 & AZURITE_PID=$! trap "kill $AZURITE_PID || true" EXIT diff --git a/Directory.Packages.props b/Directory.Packages.props index a60daa802..abb15a371 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -13,39 +13,39 @@ - - + + - + - + - - - + + + - + - + - + diff --git a/samples/Directory.Packages.props b/samples/Directory.Packages.props index ca61b8ff8..1ba8b8490 100644 --- a/samples/Directory.Packages.props +++ b/samples/Directory.Packages.props @@ -39,10 +39,10 @@ - + - + diff --git a/src/WebJobs.Extensions.DurableTask/WebJobs.Extensions.DurableTask.csproj b/src/WebJobs.Extensions.DurableTask/WebJobs.Extensions.DurableTask.csproj index e86a35040..2c8214c49 100644 --- a/src/WebJobs.Extensions.DurableTask/WebJobs.Extensions.DurableTask.csproj +++ b/src/WebJobs.Extensions.DurableTask/WebJobs.Extensions.DurableTask.csproj @@ -6,7 +6,7 @@ Microsoft.Azure.WebJobs.Extensions.DurableTask 3 12 - 2 + 3 $(MajorVersion).$(MinorVersion).$(PatchVersion) $(MajorVersion).$(MinorVersion).$(PatchVersion) $(MajorVersion).0.0.0 diff --git a/src/Worker.Extensions.DurableTask/AssemblyInfo.cs b/src/Worker.Extensions.DurableTask/AssemblyInfo.cs index 7e47c04d3..7c1fe013d 100644 --- a/src/Worker.Extensions.DurableTask/AssemblyInfo.cs +++ b/src/Worker.Extensions.DurableTask/AssemblyInfo.cs @@ -5,5 +5,5 @@ using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; // TODO: Find a way to generate this dynamically at build-time -[assembly: ExtensionInformation("Microsoft.Azure.WebJobs.Extensions.DurableTask", "3.12.2")] +[assembly: ExtensionInformation("Microsoft.Azure.WebJobs.Extensions.DurableTask", "3.12.3")] [assembly: InternalsVisibleTo("Worker.Extensions.DurableTask.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd1dabd5a893b40e75dc901fe7293db4a3caf9cd4d3e3ed6178d49cd476969abe74a9e0b7f4a0bb15edca48758155d35a4f05e6e852fff1b319d103b39ba04acbadd278c2753627c95e1f6f6582425374b92f51cca3deb0d2aab9de3ecda7753900a31f70a236f163006beefffe282888f85e3c76d1205ec7dfef7fa472a17b1")] diff --git a/src/Worker.Extensions.DurableTask/TaskOrchestrationContextExtensionMethods.cs b/src/Worker.Extensions.DurableTask/TaskOrchestrationContextExtensionMethods.cs index e40bc6696..b7300a6a2 100644 --- a/src/Worker.Extensions.DurableTask/TaskOrchestrationContextExtensionMethods.cs +++ b/src/Worker.Extensions.DurableTask/TaskOrchestrationContextExtensionMethods.cs @@ -38,7 +38,9 @@ public static async Task CallHttpAsync(this TaskOrchestrati } ILogger logger = context.CreateReplaySafeLogger("Microsoft.Azure.Functions.Worker.Extensions.DurableTask.CallHttp"); +#pragma warning disable DURABLE2003 // BuiltIn::HttpActivity is a reserved framework activity, not user-defined DurableHttpResponse response = await context.CallActivityAsync(Constants.HttpTaskActivityReservedName, request); +#pragma warning restore DURABLE2003 while (response.StatusCode == HttpStatusCode.Accepted && request.AsynchronousPatternEnabled ) { @@ -82,7 +84,9 @@ public static async Task CallHttpAsync(this TaskOrchestrati logger.LogInformation($"Polling HTTP status at location: {locationUrl}"); +#pragma warning disable DURABLE2003 // BuiltIn::HttpActivity is a reserved framework activity, not user-defined response = await context.CallActivityAsync(Constants.HttpTaskActivityReservedName, newHttpRequest); +#pragma warning restore DURABLE2003 } return response; diff --git a/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj b/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj index e29109ba4..1f8094489 100644 --- a/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj +++ b/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj @@ -29,7 +29,7 @@ ..\..\sign.snk - 1.16.2 + 1.16.3 $(VersionPrefix).0 diff --git a/test/Directory.Packages.props b/test/Directory.Packages.props index 803a2b337..221a7128b 100644 --- a/test/Directory.Packages.props +++ b/test/Directory.Packages.props @@ -31,11 +31,11 @@ - + - + diff --git a/test/SmokeTests/OOProcSmokeTests/DotNetIsolated/FaultyOrchestrators.cs b/test/SmokeTests/OOProcSmokeTests/DotNetIsolated/FaultyOrchestrators.cs index 00e7eddd0..fa13b987b 100644 --- a/test/SmokeTests/OOProcSmokeTests/DotNetIsolated/FaultyOrchestrators.cs +++ b/test/SmokeTests/OOProcSmokeTests/DotNetIsolated/FaultyOrchestrators.cs @@ -27,29 +27,13 @@ public static Task OOMOrchestrator( // force the process to run out of memory #if NET10_0_OR_GREATER - // On .NET 10+ / Linux, memory overcommit allows virtual allocations to succeed - // without committing physical RAM. Writing to each page forces the OS to back - // the allocation with real memory, triggering an actual OOM crash. - try - { - List data = new List(); - - for (int i = 0; i < 10000000; i++) - { - var arr = new byte[1024 * 1024 * 1024]; - - for (int j = 0; j < arr.Length; j += 4096) - { - arr[j] = 1; - } - - data.Add(arr); - } - } - catch (OutOfMemoryException) - { - Environment.FailFast("Out of memory!"); - } + // On .NET 10+ / Linux, memory overcommit makes true OOM unreliable: + // virtual allocations succeed without committing physical RAM, and + // writing every page to force commitment is slow and triggers the + // Linux OOM killer (SIGKILL) instead of a .NET OutOfMemoryException. + // Since this test validates orchestration recovery from a process crash, + // use FailFast to simulate the crash directly. + Environment.FailFast("Simulated OOM crash for smoke test"); #else List data = new List(); diff --git a/test/SmokeTests/e2e-test.ps1 b/test/SmokeTests/e2e-test.ps1 index 901a4b026..3a17e054e 100644 --- a/test/SmokeTests/e2e-test.ps1 +++ b/test/SmokeTests/e2e-test.ps1 @@ -1,4 +1,4 @@ - + param( [Parameter(Mandatory=$true)] [string]$DockerfilePath, @@ -73,7 +73,7 @@ function Start-And-Wait-Orchestration { } $ErrorActionPreference = "Stop" -$AzuriteVersion = "3.34.0" +$AzuriteVersion = "3.35.0" if ($NoSetup -eq $false) { # Build the docker image first, since that's the most critical step @@ -100,7 +100,7 @@ if ($NoSetup -eq $false) { Exit-OnError Write-Host "Starting Azurite storage emulator using default ports..." -ForegroundColor Yellow - docker run --name 'azurite' -p 10000:10000 -p 10001:10001 -p 10002:10002 -d "mcr.microsoft.com/azure-storage/azurite:${AzuriteVersion}" + docker run --name 'azurite' -p 10000:10000 -p 10001:10001 -p 10002:10002 -d "mcr.microsoft.com/azure-storage/azurite:${AzuriteVersion}" azurite --skipApiVersionCheck -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 Exit-OnError if ($SetupSQLServer -eq $true) { diff --git a/test/e2e/Tests/start-emulators.ps1 b/test/e2e/Tests/start-emulators.ps1 index ae9f86143..b5a2df930 100644 --- a/test/e2e/Tests/start-emulators.ps1 +++ b/test/e2e/Tests/start-emulators.ps1 @@ -62,13 +62,13 @@ if (!$SkipStorageEmulator) { npm install -g azurite New-Item -Path "./azurite" -ItemType Directory -ErrorAction SilentlyContinue - Start-Process azurite.cmd -WorkingDirectory "./azurite" -ArgumentList "--silent" + Start-Process azurite.cmd -WorkingDirectory "./azurite" -ArgumentList "--silent","--skipApiVersionCheck" } else { sudo npm install -g azurite New-Item -Path "./azurite" -ItemType Directory -ErrorAction SilentlyContinue - sudo azurite --silent --location azurite --debug azurite\debug.log & + sudo azurite --silent --skipApiVersionCheck --location azurite --debug azurite\debug.log & } $startedStorage = $true