<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ProGet web requests stuck returning 500 &quot;Execution Timeout Expired&quot; while background tasks &amp; &#x2F;health stay healthy — requires restart]]></title><description><![CDATA[<p dir="auto">First I should apologize for any slop in this post, my own knowledge on the subject is limited so I had Opus investigate this.</p>
<p dir="auto">But in short we've had on more than one occasion now experienced that we cannot login to Proget, when we try to access the front page (root url) we only get 500. Buuut the /health endpoint is happy go lucky and returns that everything is ok. This is a little tedious since we show the /health endpoint on our dashboards and also use that for automated restarts :p</p>
<p dir="auto">So this is what Opus found on the issue after we couldn't connect again this morning.</p>
<blockquote>
<p dir="auto">Product/Version: ProGet 2025.25 (Build 11) — <a href="http://proget.inedo.com/productimages/inedo/proget:25.0.25" rel="nofollow">proget.inedo.com/productimages/inedo/proget:25.0.25</a>, Linux container<br />
Hosting: Azure App Service (single instance, Always On)<br />
Database: Azure SQL Database, Standard S0 (10 DTU)</p>
</blockquote>
<p dir="auto"><strong>Summary</strong></p>
<p dir="auto">Intermittently, all web requests start failing with HTTP 500:</p>
<p dir="auto"><em>An error occurred in the web application: Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.</em></p>
<p dir="auto">This affects both the web UI (GET /) and the Docker registry API (GET /v2/...). Once it starts, it does not self-recover; only a container restart fixes it.</p>
<p dir="auto"><strong>Key observation — it's not the database</strong></p>
<p dir="auto">During the outage:</p>
<ul>
<li>ProGet's scheduled background tasks keep completing successfully every ~15s the entire time (Execution Dispatcher, Feed Replication, Drop Path Monitor, Node Message Cleanup, etc.). So DB connectivity clearly works.</li>
<li>/health returns 200 with databaseStatus: OK, serviceStatus: OK, licenseStatus: OK.</li>
<li>The Azure SQL database is idle and healthy: ~0% CPU/DTU, ≤2% workers, 0 deadlocks, 0 failed connections, ~1 session.</li>
<li>The 500s return in ~3–25 ms, not after the 30s command timeout — which suggests a faulted pooled connection is being reused and rejected immediately, rather than an actual query timing out.</li>
</ul>
<p dir="auto">Only the web-request path is affected; background tasks (presumably a separate connection path/pool) are fine.</p>
<p dir="auto"><strong>Timing / pattern</strong></p>
<p dir="auto">Onset is reliably around 00:00–00:05, coinciding with the burst of scheduled tasks firing at midnight. Most nights it produces a few hundred errors and recovers on its own; occasionally it wedges and stays broken for hours until restarted. Example daily 500-count (UTC): 18/6: 361, 19/6: 292, 20/6: 291, 21/6: 305, 22/6: 1177 (never recovered).</p>
<p dir="auto"><strong>Representative log excerpt</strong></p>
<p dir="auto">00:01:01  Request finished GET /health - 200 648 application/json<br />
00:01:09  An error occurred in the web application: Execution Timeout Expired. ...<br />
00:01:09  Request finished GET / - 500 0 - 12.8ms<br />
00:01:10  Execution Dispatcher completed.        &lt;-- background DB query OK at same moment</p>
<p dir="auto"><strong>Opus interpretation</strong></p>
<p dir="auto">A transient SQL connection interruption (possibly during the midnight task burst, or an Azure SQL idle/reconfiguration disconnect) leaves a connection in the web-request pool in a faulted state. ProGet keeps reusing that pool, so every subsequent web request fails instantly with "Execution Timeout Expired," while the separately-pooled background tasks are unaffected. A restart clears the pool and restores service.</p>
<p dir="auto"><strong>Workarounds for now</strong></p>
<ul>
<li>Added ConnectRetryCount=3;ConnectRetryInterval=10 to the SQL connection string.</li>
<li>Azure App Service auto-heal: recycle the app on ≥50 HTTP 500s in 5 minutes.</li>
</ul>
<p dir="auto">If required I can provide more information or logs :)</p>
<p dir="auto">Cheers<br />
Carl</p>
]]></description><link>https://forums.inedo.com/topic/5782/proget-web-requests-stuck-returning-500-execution-timeout-expired-while-background-tasks-health-stay-healthy-requires-restart</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 19:07:50 GMT</lastBuildDate><atom:link href="https://forums.inedo.com/topic/5782.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Jun 2026 11:42:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ProGet web requests stuck returning 500 &quot;Execution Timeout Expired&quot; while background tasks &amp; &#x2F;health stay healthy — requires restart on Mon, 22 Jun 2026 11:42:01 GMT]]></title><description><![CDATA[<p dir="auto">First I should apologize for any slop in this post, my own knowledge on the subject is limited so I had Opus investigate this.</p>
<p dir="auto">But in short we've had on more than one occasion now experienced that we cannot login to Proget, when we try to access the front page (root url) we only get 500. Buuut the /health endpoint is happy go lucky and returns that everything is ok. This is a little tedious since we show the /health endpoint on our dashboards and also use that for automated restarts :p</p>
<p dir="auto">So this is what Opus found on the issue after we couldn't connect again this morning.</p>
<blockquote>
<p dir="auto">Product/Version: ProGet 2025.25 (Build 11) — <a href="http://proget.inedo.com/productimages/inedo/proget:25.0.25" rel="nofollow">proget.inedo.com/productimages/inedo/proget:25.0.25</a>, Linux container<br />
Hosting: Azure App Service (single instance, Always On)<br />
Database: Azure SQL Database, Standard S0 (10 DTU)</p>
</blockquote>
<p dir="auto"><strong>Summary</strong></p>
<p dir="auto">Intermittently, all web requests start failing with HTTP 500:</p>
<p dir="auto"><em>An error occurred in the web application: Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.</em></p>
<p dir="auto">This affects both the web UI (GET /) and the Docker registry API (GET /v2/...). Once it starts, it does not self-recover; only a container restart fixes it.</p>
<p dir="auto"><strong>Key observation — it's not the database</strong></p>
<p dir="auto">During the outage:</p>
<ul>
<li>ProGet's scheduled background tasks keep completing successfully every ~15s the entire time (Execution Dispatcher, Feed Replication, Drop Path Monitor, Node Message Cleanup, etc.). So DB connectivity clearly works.</li>
<li>/health returns 200 with databaseStatus: OK, serviceStatus: OK, licenseStatus: OK.</li>
<li>The Azure SQL database is idle and healthy: ~0% CPU/DTU, ≤2% workers, 0 deadlocks, 0 failed connections, ~1 session.</li>
<li>The 500s return in ~3–25 ms, not after the 30s command timeout — which suggests a faulted pooled connection is being reused and rejected immediately, rather than an actual query timing out.</li>
</ul>
<p dir="auto">Only the web-request path is affected; background tasks (presumably a separate connection path/pool) are fine.</p>
<p dir="auto"><strong>Timing / pattern</strong></p>
<p dir="auto">Onset is reliably around 00:00–00:05, coinciding with the burst of scheduled tasks firing at midnight. Most nights it produces a few hundred errors and recovers on its own; occasionally it wedges and stays broken for hours until restarted. Example daily 500-count (UTC): 18/6: 361, 19/6: 292, 20/6: 291, 21/6: 305, 22/6: 1177 (never recovered).</p>
<p dir="auto"><strong>Representative log excerpt</strong></p>
<p dir="auto">00:01:01  Request finished GET /health - 200 648 application/json<br />
00:01:09  An error occurred in the web application: Execution Timeout Expired. ...<br />
00:01:09  Request finished GET / - 500 0 - 12.8ms<br />
00:01:10  Execution Dispatcher completed.        &lt;-- background DB query OK at same moment</p>
<p dir="auto"><strong>Opus interpretation</strong></p>
<p dir="auto">A transient SQL connection interruption (possibly during the midnight task burst, or an Azure SQL idle/reconfiguration disconnect) leaves a connection in the web-request pool in a faulted state. ProGet keeps reusing that pool, so every subsequent web request fails instantly with "Execution Timeout Expired," while the separately-pooled background tasks are unaffected. A restart clears the pool and restores service.</p>
<p dir="auto"><strong>Workarounds for now</strong></p>
<ul>
<li>Added ConnectRetryCount=3;ConnectRetryInterval=10 to the SQL connection string.</li>
<li>Azure App Service auto-heal: recycle the app on ≥50 HTTP 500s in 5 minutes.</li>
</ul>
<p dir="auto">If required I can provide more information or logs :)</p>
<p dir="auto">Cheers<br />
Carl</p>
]]></description><link>https://forums.inedo.com/post/19808</link><guid isPermaLink="true">https://forums.inedo.com/post/19808</guid><dc:creator><![CDATA[carl.westman_8110]]></dc:creator><pubDate>Mon, 22 Jun 2026 11:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to ProGet web requests stuck returning 500 &quot;Execution Timeout Expired&quot; while background tasks &amp; &#x2F;health stay healthy — requires restart on Mon, 22 Jun 2026 17:26:15 GMT]]></title><description><![CDATA[<p dir="auto">Hi <a class="plugin-mentions-user plugin-mentions-a" href="https://forums.inedo.com/uid/2696">@carl-westman_8110</a> ,</p>
<p dir="auto">Under Admin &gt; Diagnostic Center, you should see some error-level messages logged. Can you share those? That will help us identify what the actual error messages are.</p>
<p dir="auto">Under Admin &gt; Scheduled Jobs, what do you see scheduled at midnight? Are you aware of other external scheduled jobs, for example backup or nightly builds?</p>
<p dir="auto">One thing to be aware of... users with similar symptoms have discovered they were "rate limited" by Azure SQL. This doesn't lead to resource graph spikes or "419 errors" (like an API rate limit), but query throttling; <em>some</em> queries simply take 100x longer.  And this eventually leads to random errors.</p>
<p dir="auto">I think 10DTU is relatively small, so this could be happening? Anyway the error messages will show.</p>
<p dir="auto">This may be a good opportunity to <a href="https://docs.inedo.com/docs/installation/postgresql#migrating-from-sqlserver" rel="nofollow">migrate to PostgreSQL</a>, which will not have any kind of limits.</p>
<p dir="auto">Thanks,<br />
Steve</p>
]]></description><link>https://forums.inedo.com/post/19809</link><guid isPermaLink="true">https://forums.inedo.com/post/19809</guid><dc:creator><![CDATA[stevedennis]]></dc:creator><pubDate>Mon, 22 Jun 2026 17:26:15 GMT</pubDate></item><item><title><![CDATA[Reply to ProGet web requests stuck returning 500 &quot;Execution Timeout Expired&quot; while background tasks &amp; &#x2F;health stay healthy — requires restart on Tue, 23 Jun 2026 11:27:22 GMT]]></title><description><![CDATA[<p dir="auto">Hi Steve!</p>
<p dir="auto">Here are all the error from yesterday</p>
<p dir="auto"><img src="/assets/uploads/files/1782213669507-4e544f78-9d6a-4d1e-a7ae-2d90ad3dc950-image.png" alt="4e544f78-9d6a-4d1e-a7ae-2d90ad3dc950-image.png" class="img-responsive img-markdown" /></p>
<p dir="auto">Here is the log of one of the Execution Timeout Expired messages</p>
<pre><code>An error occurred in the web application: Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

URL: http://mycompanyproget.com/
Referrer: (not set)
User: (unknown)
User Agent: AlwaysOn
IP Address: 127.0.0.1:12450
Stack trace:    at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParserStateObject.ThrowExceptionAndWarning(Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at Microsoft.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at Microsoft.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte&amp; value)
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean&amp; dataReady)
   at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task&amp; task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task&amp; task, Boolean&amp; usedCache, Boolean asyncWrite, Boolean inRetry, String method)
   at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean&amp; usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)
   at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Inedo.Data.SqlServerDatabaseContext.CreateConnection()
   at Inedo.ProGet.Data.VirtualDatabaseContext.SqlContext.CreateConnection() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\Data\VirtualDatabaseContext.cs:line 34
   at Inedo.ProGet.Data.VirtualDatabaseContext.CreateConnection() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\Data\VirtualDatabaseContext.cs:line 24
   at Inedo.Data.DatabaseContext.ExecuteInternal(String storedProcName, GenericDbParameter[] parameters, DatabaseCommandReturnType returnType)
   at Inedo.Data.DatabaseContext.&lt;&gt;c__DisplayClass34_0`1.&lt;EnumerateTable&gt;b__0()
   at Inedo.Data.StrongDataReader.Read[TRow](Func`1 getReader, Boolean disposeReader)+MoveNext()
   at Inedo.ProGet.FeedCache.FeedLookups..ctor(IEnumerable`1 allFeeds) in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\FeedCache.cs:line 82
   at Inedo.ProGet.FeedCache.CreateFeedLookups() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\FeedCache.cs:line 70
   at Inedo.LazyCached`1.GetValue()
   at Inedo.LazyCached`1.get_Value()
   at Inedo.ProGet.FeedCache.GetFeeds(Boolean includeInactive) in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\FeedCache.cs:line 30
   at Inedo.ProGet.Web.Security.TaskChecker..ctor() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\Web\Security\TaskChecker.cs:line 18
   at Inedo.ProGet.ProGetSdkConfig.Config.GetCurrentTaskChecker() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\ProGetSdkConfig.cs:line 81
   at Inedo.Security.UserContext.&lt;&gt;c.&lt;InvalidateCache&gt;b__16_0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
--- End of stack trace from previous location ---
   at System.Lazy`1.CreateValue()
   at Inedo.ProGet.WebApplication.Security.WebUserContext.IsAuthorizedForTask(ProGetSecuredTask task, Nullable`1 feedId) in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\WebApplication\Security\WebUserContext.cs:line 23
   at Inedo.ProGet.WebApplication.Pages.RootPage.CreateChildControlsAsync() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\WebApplication\Pages\RootPage.cs:line 77
   at Inedo.ProGet.WebApplication.Pages.ProGetSimplePage.InitializeAsync() in C:\Users\builds\AppData\Local\Temp\InedoAgent\BuildMaster\192.168.44.60\Temp\_E653823\Src\src\ProGet\WebApplication\Pages\ProGetSimplePage.cs:line 69
   at Inedo.Web.PageFree.SimplePageBase.ExecutePageLifeCycleAsync()
   at Inedo.Web.PageFree.SimplePageBase.ProcessRequestAsync(AhHttpContext context)
   at Inedo.Web.AhWebMiddleware.InvokeAsync(HttpContext context)

::Web Error on 06/22/2026 09:12:17::
</code></pre>
<p dir="auto">But as you're saying, maybe its time to migrate to PostgreSQL :)</p>
]]></description><link>https://forums.inedo.com/post/19810</link><guid isPermaLink="true">https://forums.inedo.com/post/19810</guid><dc:creator><![CDATA[carl.westman_8110]]></dc:creator><pubDate>Tue, 23 Jun 2026 11:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to ProGet web requests stuck returning 500 &quot;Execution Timeout Expired&quot; while background tasks &amp; &#x2F;health stay healthy — requires restart on Tue, 23 Jun 2026 14:22:39 GMT]]></title><description><![CDATA[<p dir="auto">Hi <a class="plugin-mentions-user plugin-mentions-a" href="https://forums.inedo.com/uid/2696">@carl-westman_8110</a> ,</p>
<p dir="auto">Thanks for sharing that. This isn't a symptom of "server overload" that we've seen before.</p>
<p dir="auto">The error you shared is occurring on <code>Feeds_GetFeeds</code>, which is definitely not an intensive query, and I would not expect that to be timing out at all. It's just <code>SELECT * FROM [Feeds]</code>.</p>
<p dir="auto">However, that's a similar symptom to the "AzureSQL resource throttling" that we've seen on other users: another query is being throttled (for example, something that joins on <code>[Feeds]</code>), and that is causing a cascading impact on other queries.</p>
<p dir="auto">We don't have enough information to say that's the case here. But, an easy way to test would be to up your DTUs substantially.</p>
<p dir="auto">Otherwise, the next troubleshooting step is to try to identify the cause of the timeouts, which involves looking at HTTP Access logs and jobs occurring around the same time under Admin &gt; Scheduled Jobs.</p>
<p dir="auto">Thanks,<br />
Steve</p>
]]></description><link>https://forums.inedo.com/post/19811</link><guid isPermaLink="true">https://forums.inedo.com/post/19811</guid><dc:creator><![CDATA[stevedennis]]></dc:creator><pubDate>Tue, 23 Jun 2026 14:22:39 GMT</pubDate></item></channel></rss>