Skip to content

Commit 69139b5

Browse files
authored
Log StartupTimeoutLimit failure to response (#10661)
1 parent 62c190d commit 69139b5

4 files changed

Lines changed: 32 additions & 16 deletions

File tree

src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,13 @@ CreateApplication(
122122

123123
std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER> inProcessApplication;
124124

125-
// TODO not sure how easy it will be to untangle errors here
126-
// ErrorContext errorContext;
125+
ErrorContext errorContext;
126+
errorContext.statusCode = 500;
127+
errorContext.subStatusCode = 30;
128+
errorContext.generalErrorType = "ANCM In-Process Start Failure";
129+
errorContext.errorReason = "<ul><li>The application failed to start</li><li>The application started but then stopped</li><li>The application started but threw an exception during startup</li></ul>";
127130

128-
if (!FAILED_LOG(hr = IN_PROCESS_APPLICATION::Start(*pServer, pSite, *pHttpApplication, pParameters, nParameters, inProcessApplication)))
131+
if (!FAILED_LOG(hr = IN_PROCESS_APPLICATION::Start(*pServer, pSite, *pHttpApplication, pParameters, nParameters, inProcessApplication, errorContext)))
129132
{
130133
*ppApplication = inProcessApplication.release();
131134
}
@@ -138,19 +141,19 @@ CreateApplication(
138141
g_errorPageContent :
139142
FILE_UTILITY::GetHtml(g_hServerModule,
140143
IN_PROCESS_RH_STATIC_HTML,
141-
500i16,
142-
30i16,
143-
"ANCM In-Process Start Failure",
144-
"<ul><li>The application failed to start</li><li>The application started but then stopped</li><li>The application started but threw an exception during startup</li></ul>",
144+
errorContext.statusCode,
145+
errorContext.subStatusCode,
146+
errorContext.generalErrorType,
147+
errorContext.errorReason,
145148
"");
146149

147150
auto pErrorApplication = std::make_unique<StartupExceptionApplication>(*pServer,
148151
*pHttpApplication,
149152
options->QueryDisableStartUpErrorPage(),
150153
hr,
151154
content,
152-
500i16,
153-
30i16,
155+
errorContext.statusCode,
156+
errorContext.subStatusCode,
154157
"Internal Server Error");
155158

156159
RETURN_IF_FAILED(pErrorApplication->StartMonitoringAppOffline());

src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ IN_PROCESS_APPLICATION::SetCallbackHandles(
130130
}
131131

132132
HRESULT
133-
IN_PROCESS_APPLICATION::LoadManagedApplication()
133+
IN_PROCESS_APPLICATION::LoadManagedApplication(ErrorContext& errorContext)
134134
{
135135
THROW_LAST_ERROR_IF_NULL(m_pInitializeEvent = CreateEvent(
136136
nullptr, // default security attributes
@@ -157,11 +157,17 @@ IN_PROCESS_APPLICATION::LoadManagedApplication()
157157

158158
// Wait for shutdown request
159159
const auto waitResult = WaitForMultipleObjects(2, waitHandles, FALSE, m_pConfig->QueryStartupTimeLimitInMS());
160+
160161
THROW_LAST_ERROR_IF(waitResult == WAIT_FAILED);
161162

162163
if (waitResult == WAIT_TIMEOUT)
163164
{
164165
// If server wasn't initialized in time shut application down without waiting for CLR thread to exit
166+
errorContext.statusCode = 500;
167+
errorContext.subStatusCode = 37;
168+
errorContext.generalErrorType = "ANCM Failed to Start Within Startup Time Limit";
169+
errorContext.errorReason = format("ANCM failed to start after %d milliseconds", m_pConfig->QueryStartupTimeLimitInMS());
170+
165171
m_waitForShutdown = false;
166172
StopClr();
167173
throw InvalidOperationException(format(L"Managed server didn't initialize after %u ms.", m_pConfig->QueryStartupTimeLimitInMS()));
@@ -380,15 +386,16 @@ HRESULT IN_PROCESS_APPLICATION::Start(
380386
IHttpApplication& pHttpApplication,
381387
APPLICATION_PARAMETER* pParameters,
382388
DWORD nParameters,
383-
std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER>& application)
389+
std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER>& application,
390+
ErrorContext& errorContext)
384391
{
385392
try
386393
{
387394
std::unique_ptr<InProcessOptions> options;
388395
THROW_IF_FAILED(InProcessOptions::Create(pServer, pSite, pHttpApplication, options));
389396
application = std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER>(
390397
new IN_PROCESS_APPLICATION(pServer, pHttpApplication, std::move(options), pParameters, nParameters));
391-
THROW_IF_FAILED(application->LoadManagedApplication());
398+
THROW_IF_FAILED(application->LoadManagedApplication(errorContext));
392399
return S_OK;
393400
}
394401
catch (InvalidOperationException& ex)

src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class IN_PROCESS_APPLICATION : public InProcessApplicationBase
5858
ExecuteApplication();
5959

6060
HRESULT
61-
LoadManagedApplication();
61+
LoadManagedApplication(ErrorContext& errorContext);
6262

6363
void
6464
QueueStop();
@@ -115,7 +115,8 @@ class IN_PROCESS_APPLICATION : public InProcessApplicationBase
115115
IHttpApplication& pHttpApplication,
116116
APPLICATION_PARAMETER* pParameters,
117117
DWORD nParameters,
118-
std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER>& application);
118+
std::unique_ptr<IN_PROCESS_APPLICATION, IAPPLICATION_DELETER>& application,
119+
ErrorContext& errorContext);
119120

120121
private:
121122
struct ExecuteClrContext: std::enable_shared_from_this<ExecuteClrContext>

src/Servers/IIS/IIS/test/Common.FunctionalTests/Inprocess/StartupTests.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,6 @@ public async Task RemoveInProcessReference_FailedToFindRequestHandler()
416416
}
417417

418418
[ConditionalFact]
419-
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/1772", FlakyOn.All)]
420419
public async Task StartupTimeoutIsApplied()
421420
{
422421
// From what I can tell, this failure is due to ungraceful shutdown.
@@ -434,11 +433,17 @@ public async Task StartupTimeoutIsApplied()
434433
var response = await deploymentResult.HttpClient.GetAsync("/");
435434
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
436435

437-
StopServer();
436+
StopServer(gracefulShutdown: false);
438437

439438
EventLogHelpers.VerifyEventLogEvents(deploymentResult,
440439
EventLogHelpers.InProcessFailedToStart(deploymentResult, "Managed server didn't initialize after 1000 ms.")
441440
);
441+
442+
if (DeployerSelector.HasNewHandler)
443+
{
444+
var responseContent = await response.Content.ReadAsStringAsync();
445+
Assert.Contains("ANCM Failed to Start Within Startup Time Limit", responseContent);
446+
}
442447
}
443448
}
444449

0 commit comments

Comments
 (0)