adding logging for outprocess start and application recycle (#573)
adding logging for outprocess start and application recycle
This commit is contained in:
parent
ff496ca580
commit
e3d3b088ae
|
|
@ -196,6 +196,7 @@ APPLICATION_MANAGER::RecycleApplication(
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
APPLICATION_INFO_KEY key;
|
APPLICATION_INFO_KEY key;
|
||||||
|
DWORD dwPreviousCounter = 0;
|
||||||
|
|
||||||
hr = key.Initialize(pszApplicationId);
|
hr = key.Initialize(pszApplicationId);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
|
|
@ -203,13 +204,32 @@ APPLICATION_MANAGER::RecycleApplication(
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
AcquireSRWLockExclusive(&m_srwLock);
|
AcquireSRWLockExclusive(&m_srwLock);
|
||||||
|
dwPreviousCounter = m_pApplicationInfoHash->Count();
|
||||||
|
|
||||||
m_pApplicationInfoHash->DeleteKey(&key);
|
m_pApplicationInfoHash->DeleteKey(&key);
|
||||||
|
|
||||||
|
if(dwPreviousCounter != m_pApplicationInfoHash->Count())
|
||||||
|
{
|
||||||
|
// Application got recycled. Log an event
|
||||||
|
STACK_STRU(strEventMsg, 256);
|
||||||
|
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
||||||
|
ASPNETCORE_EVENT_RECYCLE_CONFIGURATION_MSG,
|
||||||
|
pszApplicationId)))
|
||||||
|
{
|
||||||
|
UTILITY::LogEvent(g_hEventLog,
|
||||||
|
EVENTLOG_INFORMATION_TYPE,
|
||||||
|
ASPNETCORE_EVENT_RECYCLE_CONFIGURATION,
|
||||||
|
strEventMsg.QueryStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (m_pApplicationInfoHash->Count() == 0)
|
if (m_pApplicationInfoHash->Count() == 0)
|
||||||
{
|
{
|
||||||
m_hostingModel = HOSTING_UNKNOWN;
|
m_hostingModel = HOSTING_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (g_fAspnetcoreRHLoadedError)
|
if (g_fAspnetcoreRHLoadedError)
|
||||||
{
|
{
|
||||||
// We had assembly loading failure
|
// We had assembly loading failure
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,17 @@ Language=English
|
||||||
%1
|
%1
|
||||||
.
|
.
|
||||||
|
|
||||||
|
Messageid=1020
|
||||||
|
SymbolicName=ASPNETCORE_EVENT_PROCESS_START_FAILURE
|
||||||
|
Language=English
|
||||||
|
%1
|
||||||
|
.
|
||||||
|
|
||||||
|
Messageid=1021
|
||||||
|
SymbolicName=ASPNETCORE_EVENT_RECYCLE_CONFIGURATION
|
||||||
|
Language=English
|
||||||
|
%1
|
||||||
|
.
|
||||||
|
|
||||||
;
|
;
|
||||||
;#endif // _ASPNETCORE_MODULE_MSG_H_
|
;#endif // _ASPNETCORE_MODULE_MSG_H_
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,10 @@
|
||||||
#define ASPNETCORE_EVENT_MSG_BUFFER_SIZE 256
|
#define ASPNETCORE_EVENT_MSG_BUFFER_SIZE 256
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_SUCCESS_MSG L"Application '%s' started process '%d' successfully and is listening on port '%d'."
|
#define ASPNETCORE_EVENT_PROCESS_START_SUCCESS_MSG L"Application '%s' started process '%d' successfully and is listening on port '%d'."
|
||||||
#define ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED_MSG L"Maximum rapid fail count per minute of '%d' exceeded."
|
#define ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED_MSG L"Maximum rapid fail count per minute of '%d' exceeded."
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_INTERNAL_ERROR_MSG L"Application '%s' failed to parse processPath and arguments due to internal error, ErrorCode = '0x%x'."
|
#define ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s' at stage '%s', ErrorCode = '0x%x', retryCounter '%d'."
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_POSTCREATE_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s'but failed to get its status, ErrorCode = '0x%x', retryCounter '%d'."
|
#define ASPNETCORE_EVENT_PROCESS_START_FAILURE_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s'with multiple retries. The last try of listening port is '%d'. See pervious warnings for details."
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s', ErrorCode = '0x%x', retryCounter '%d'."
|
#define ASPNETCORE_EVENT_PROCESS_START_STATUS_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s' , ErrorCode = '0x%x', processStatus '%d'."
|
||||||
|
#define ASPNETCORE_EVENT_PROCESS_START_PORTSETUP_ERROR_MSG L"Application '%s' with physical root '%s' failed to choose listen port '%d' given port rang '%d - %d', EorrorCode = '0x%x'. If environment variable 'ASPNETCORE_PORT' was set, try removing it such that a random port is selected instead."
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but failed to listen on the given port '%d'"
|
#define ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but failed to listen on the given port '%d'"
|
||||||
#define ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but either crashed or did not respond or did not listen on the given port '%d', ErrorCode = '0x%x'"
|
#define ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but either crashed or did not respond or did not listen on the given port '%d', ErrorCode = '0x%x'"
|
||||||
#define ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG L"Warning: Could not create stdoutLogFile %s, ErrorCode = '0x%x'."
|
#define ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG L"Warning: Could not create stdoutLogFile %s, ErrorCode = '0x%x'."
|
||||||
|
|
@ -28,6 +29,7 @@
|
||||||
#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDOUT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Last 4KB characters of captured stdout and stderr logs:\r\n%s"
|
#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDOUT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Last 4KB characters of captured stdout and stderr logs:\r\n%s"
|
||||||
#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Please check the stderr logs for more information."
|
#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Please check the stderr logs for more information."
|
||||||
#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG L"Application '%s' is recycled due to app_offline file was detected."
|
#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG L"Application '%s' is recycled due to app_offline file was detected."
|
||||||
|
#define ASPNETCORE_EVENT_RECYCLE_CONFIGURATION_MSG L"Application '%s' is recycled due to configuration changed"
|
||||||
#define ASPNETCORE_EVENT_MODULE_DISABLED_MSG L"AspNetCore Module is disabled"
|
#define ASPNETCORE_EVENT_MODULE_DISABLED_MSG L"AspNetCore Module is disabled"
|
||||||
#define ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG L"Application '%s' was compiled for .NET Framework. Please compile for .NET core to run the inprocess application or change the process mode to out of process. ErrorCode = '0x%x'."
|
#define ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG L"Application '%s' was compiled for .NET Framework. Please compile for .NET core to run the inprocess application or change the process mode to out of process. ErrorCode = '0x%x'."
|
||||||
#define ASPNETCORE_EVENT_PORTABLE_APP_DOTNET_MISSING_MSG L"Could not find dotnet.exe on the system PATH environment variable for portable application '%s'. Check that a valid path to dotnet is on the PATH and the bitness of dotnet matches the bitness of the IIS worker process. ErrorCode = '0x%x'."
|
#define ASPNETCORE_EVENT_PORTABLE_APP_DOTNET_MISSING_MSG L"Could not find dotnet.exe on the system PATH environment variable for portable application '%s'. Check that a valid path to dotnet is on the PATH and the bitness of dotnet matches the bitness of the IIS worker process. ErrorCode = '0x%x'."
|
||||||
|
|
|
||||||
|
|
@ -173,9 +173,7 @@ PROCESS_MANAGER::GetProcess(
|
||||||
// terminate existing process that is not ready
|
// terminate existing process that is not ready
|
||||||
// before creating new one.
|
// before creating new one.
|
||||||
//
|
//
|
||||||
|
ShutdownProcessNoLock( m_ppServerProcessList[dwProcessIndex] );
|
||||||
//todo:
|
|
||||||
//ShutdownProcessNoLock( m_ppServerProcessList[dwProcessIndex] );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,8 @@ SERVER_PROCESS::SetupListenPort(
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
ENVIRONMENT_VAR_ENTRY *pEntry = NULL;
|
ENVIRONMENT_VAR_ENTRY *pEntry = NULL;
|
||||||
|
STACK_STRU(strEventMsg, 256);
|
||||||
|
|
||||||
pEnvironmentVarTable->FindKey(ASPNETCORE_PORT_ENV_STR, &pEntry);
|
pEnvironmentVarTable->FindKey(ASPNETCORE_PORT_ENV_STR, &pEntry);
|
||||||
if (pEntry != NULL)
|
if (pEntry != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -190,6 +192,25 @@ Finished:
|
||||||
pEntry->Dereference();
|
pEntry->Dereference();
|
||||||
pEntry = NULL;
|
pEntry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_PORTSETUP_ERROR_MSG,
|
||||||
|
m_struAppFullPath.QueryStr(),
|
||||||
|
m_struPhysicalPath.QueryStr(),
|
||||||
|
m_dwPort,
|
||||||
|
MIN_PORT,
|
||||||
|
MAX_PORT,
|
||||||
|
hr)))
|
||||||
|
{
|
||||||
|
UTILITY::LogEvent(g_hEventLog,
|
||||||
|
EVENTLOG_INFORMATION_TYPE,
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_SUCCESS,
|
||||||
|
strEventMsg.QueryStr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -503,6 +524,9 @@ SERVER_PROCESS::OutputEnvironmentVariables
|
||||||
DBG_ASSERT(pEnvironmentVarTable); // We added some startup variables
|
DBG_ASSERT(pEnvironmentVarTable); // We added some startup variables
|
||||||
DBG_ASSERT(pEnvironmentVarTable->Count() >0);
|
DBG_ASSERT(pEnvironmentVarTable->Count() >0);
|
||||||
|
|
||||||
|
// cleanup, as we may in retry logic
|
||||||
|
pmszOutput->Reset();
|
||||||
|
|
||||||
pszEnvironmentVariables = GetEnvironmentStringsW();
|
pszEnvironmentVariables = GetEnvironmentStringsW();
|
||||||
if (pszEnvironmentVariables == NULL)
|
if (pszEnvironmentVariables == NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -575,6 +599,13 @@ SERVER_PROCESS::SetupCommandLine(
|
||||||
|
|
||||||
DBG_ASSERT(pstrCommandLine);
|
DBG_ASSERT(pstrCommandLine);
|
||||||
|
|
||||||
|
if (!m_struCommandLine.IsEmpty() &&
|
||||||
|
pstrCommandLine == (&m_struCommandLine))
|
||||||
|
{
|
||||||
|
// already set up the commandline string, skip
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
|
||||||
pszPath = m_ProcessPath.QueryStr();
|
pszPath = m_ProcessPath.QueryStr();
|
||||||
|
|
||||||
if ((wcsstr(pszPath, L":") == NULL) && (wcsstr(pszPath, L"%") == NULL))
|
if ((wcsstr(pszPath, L":") == NULL) && (wcsstr(pszPath, L"%") == NULL))
|
||||||
|
|
@ -638,6 +669,7 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
DWORD dwTimeDifference = 0;
|
DWORD dwTimeDifference = 0;
|
||||||
DWORD dwActualProcessId = 0;
|
DWORD dwActualProcessId = 0;
|
||||||
INT iChildProcessIndex = -1;
|
INT iChildProcessIndex = -1;
|
||||||
|
STACK_STRU(strEventMsg, 256);
|
||||||
|
|
||||||
if (CheckRemoteDebuggerPresent(m_hProcessHandle, &fDebuggerAttached) == 0)
|
if (CheckRemoteDebuggerPresent(m_hProcessHandle, &fDebuggerAttached) == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -654,14 +686,14 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
// make sure the process is still running
|
// make sure the process is still running
|
||||||
if (processStatus != STILL_ACTIVE)
|
if (processStatus != STILL_ACTIVE)
|
||||||
{
|
{
|
||||||
hr = E_FAIL;
|
hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE;
|
||||||
/*pStruErrorMessage->SafeSnwprintf(
|
strEventMsg.SafeSnwprintf(
|
||||||
ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG,
|
ASPNETCORE_EVENT_PROCESS_START_STATUS_ERROR_MSG,
|
||||||
m_struAppFullPath.QueryStr(),
|
m_struAppFullPath.QueryStr(),
|
||||||
m_pszRootApplicationPath.QueryStr(),
|
m_struPhysicalPath.QueryStr(),
|
||||||
m_pStruCommandline->QueryStr(),
|
m_struCommandLine.QueryStr(),
|
||||||
hr,
|
hr,
|
||||||
processStatus);*/
|
processStatus);
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -680,6 +712,11 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
} while (fReady == FALSE &&
|
} while (fReady == FALSE &&
|
||||||
((dwTimeDifference < m_dwStartupTimeLimitInMS) || fDebuggerAttached));
|
((dwTimeDifference < m_dwStartupTimeLimitInMS) || fDebuggerAttached));
|
||||||
|
|
||||||
|
if (!fReady)
|
||||||
|
{
|
||||||
|
hr = E_APPLICATION_ACTIVATION_TIMED_OUT;
|
||||||
|
}
|
||||||
|
|
||||||
// register call back with the created process
|
// register call back with the created process
|
||||||
if (FAILED(hr = RegisterProcessWait(&m_hProcessWaitHandle, m_hProcessHandle)))
|
if (FAILED(hr = RegisterProcessWait(&m_hProcessWaitHandle, m_hProcessHandle)))
|
||||||
{
|
{
|
||||||
|
|
@ -750,14 +787,14 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
// on the port we specified.
|
// on the port we specified.
|
||||||
//
|
//
|
||||||
fReady = FALSE;
|
fReady = FALSE;
|
||||||
//pStruErrorMessage->SafeSnwprintf(
|
|
||||||
// ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG,
|
|
||||||
// m_struAppFullPath.QueryStr(),
|
|
||||||
// m_pszRootApplicationPath.QueryStr(),
|
|
||||||
// m_struCommandline.QueryStr(),
|
|
||||||
// m_dwPort,
|
|
||||||
// hr);
|
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED);
|
hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED);
|
||||||
|
strEventMsg.SafeSnwprintf(
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG,
|
||||||
|
m_struAppFullPath.QueryStr(),
|
||||||
|
m_struPhysicalPath.QueryStr(),
|
||||||
|
m_struCommandLine.QueryStr(),
|
||||||
|
m_dwPort,
|
||||||
|
hr);
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -770,13 +807,13 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
if (dwTimeDifference >= m_dwStartupTimeLimitInMS)
|
if (dwTimeDifference >= m_dwStartupTimeLimitInMS)
|
||||||
{
|
{
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT);
|
hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT);
|
||||||
/*pStruErrorMessage->SafeSnwprintf(
|
strEventMsg.SafeSnwprintf(
|
||||||
ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG,
|
ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG,
|
||||||
m_struAppFullPath.QueryStr(),
|
m_struAppFullPath.QueryStr(),
|
||||||
m_pszRootApplicationPath.QueryStr(),
|
m_struPhysicalPath.QueryStr(),
|
||||||
pStruCommandline->QueryStr(),
|
m_struCommandLine.QueryStr(),
|
||||||
m_dwPort,
|
m_dwPort,
|
||||||
hr);*/
|
hr);
|
||||||
}
|
}
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
|
|
@ -794,13 +831,13 @@ SERVER_PROCESS::PostStartCheck(
|
||||||
|
|
||||||
if ((FAILED(hr) || fReady == FALSE))
|
if ((FAILED(hr) || fReady == FALSE))
|
||||||
{
|
{
|
||||||
//pStruErrorMessage->SafeSnwprintf(
|
strEventMsg.SafeSnwprintf(
|
||||||
// ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG,
|
ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG,
|
||||||
// m_struAppFullPath.QueryStr(),
|
m_struAppFullPath.QueryStr(),
|
||||||
// m_pszRootApplicationPath.QueryStr(),
|
m_struPhysicalPath.QueryStr(),
|
||||||
// pStruCommandline->QueryStr(),
|
m_struCommandLine.QueryStr(),
|
||||||
// m_dwPort,
|
m_dwPort,
|
||||||
// hr);
|
hr);
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -845,6 +882,12 @@ Finished:
|
||||||
m_pForwarderConnection->DereferenceForwarderConnection();
|
m_pForwarderConnection->DereferenceForwarderConnection();
|
||||||
m_pForwarderConnection = NULL;
|
m_pForwarderConnection = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UTILITY::LogEvent(
|
||||||
|
g_hEventLog,
|
||||||
|
EVENTLOG_WARNING_TYPE,
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_ERROR,
|
||||||
|
strEventMsg.QueryStr());
|
||||||
}
|
}
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
@ -862,6 +905,7 @@ SERVER_PROCESS::StartProcess(
|
||||||
STACK_STRU( strEventMsg, 256);
|
STACK_STRU( strEventMsg, 256);
|
||||||
MULTISZ mszNewEnvironment;
|
MULTISZ mszNewEnvironment;
|
||||||
ENVIRONMENT_VAR_HASH *pHashTable = NULL;
|
ENVIRONMENT_VAR_HASH *pHashTable = NULL;
|
||||||
|
PWSTR pStrStage = NULL;
|
||||||
|
|
||||||
GetStartupInfoW(&startupInfo);
|
GetStartupInfoW(&startupInfo);
|
||||||
|
|
||||||
|
|
@ -871,20 +915,22 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
SetupStdHandles(&startupInfo);
|
SetupStdHandles(&startupInfo);
|
||||||
|
|
||||||
//
|
|
||||||
// generate process command line.
|
|
||||||
//
|
|
||||||
if (FAILED(hr = SetupCommandLine(&m_struCommandLine)))
|
|
||||||
{
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (dwRetryCount > 0)
|
while (dwRetryCount > 0)
|
||||||
{
|
{
|
||||||
dwRetryCount--;
|
dwRetryCount--;
|
||||||
|
//
|
||||||
|
// generate process command line.
|
||||||
|
//
|
||||||
|
if (FAILED(hr = SetupCommandLine(&m_struCommandLine)))
|
||||||
|
{
|
||||||
|
pStrStage = L"SetupCommanLine";
|
||||||
|
goto Failure;
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(hr = InitEnvironmentVariablesTable(&pHashTable)))
|
if (FAILED(hr = InitEnvironmentVariablesTable(&pHashTable)))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"InitEnvironmentVariablesTable";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -892,7 +938,8 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
if (FAILED(hr = SetupListenPort(pHashTable)))
|
if (FAILED(hr = SetupListenPort(pHashTable)))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"SetupListenPort";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -900,7 +947,8 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
if (FAILED(hr = SetupAppPath(pHashTable)))
|
if (FAILED(hr = SetupAppPath(pHashTable)))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"SetupAppPath";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -908,7 +956,8 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
if (FAILED(hr = SetupAppToken(pHashTable)))
|
if (FAILED(hr = SetupAppToken(pHashTable)))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"SetupAppToken";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -916,7 +965,8 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
if (FAILED(hr = OutputEnvironmentVariables(&mszNewEnvironment, pHashTable)))
|
if (FAILED(hr = OutputEnvironmentVariables(&mszNewEnvironment, pHashTable)))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"OutputEnvironmentVariables";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
dwCreationFlags = CREATE_NO_WINDOW |
|
dwCreationFlags = CREATE_NO_WINDOW |
|
||||||
|
|
@ -936,16 +986,9 @@ SERVER_PROCESS::StartProcess(
|
||||||
&startupInfo,
|
&startupInfo,
|
||||||
&processInformation))
|
&processInformation))
|
||||||
{
|
{
|
||||||
|
pStrStage = L"CreateProcessW";
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
// don't the check return code as we already in error report
|
goto Failure;
|
||||||
strEventMsg.SafeSnwprintf(
|
|
||||||
ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG,
|
|
||||||
m_struAppFullPath.QueryStr(),
|
|
||||||
m_struPhysicalPath.QueryStr(),
|
|
||||||
m_struCommandLine.QueryStr(),
|
|
||||||
hr,
|
|
||||||
dwRetryCount);
|
|
||||||
goto Finished;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_hProcessHandle = processInformation.hProcess;
|
m_hProcessHandle = processInformation.hProcess;
|
||||||
|
|
@ -958,15 +1001,17 @@ SERVER_PROCESS::StartProcess(
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
if (hr != HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
|
if (hr != HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"AssignProcessToJobObject";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ResumeThread(processInformation.hThread) == -1)
|
if (ResumeThread(processInformation.hThread) == -1)
|
||||||
{
|
{
|
||||||
|
pStrStage = L"ResumeThread";
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
goto Finished;
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -974,7 +1019,8 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
if (FAILED(hr = PostStartCheck()))
|
if (FAILED(hr = PostStartCheck()))
|
||||||
{
|
{
|
||||||
goto Finished;
|
pStrStage = L"PostStartCheck";
|
||||||
|
goto Failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backend process starts successfully. Set retry counter to 0
|
// Backend process starts successfully. Set retry counter to 0
|
||||||
|
|
@ -992,7 +1038,24 @@ SERVER_PROCESS::StartProcess(
|
||||||
strEventMsg.QueryStr());
|
strEventMsg.QueryStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
Finished:
|
goto Finished;
|
||||||
|
|
||||||
|
Failure:
|
||||||
|
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG,
|
||||||
|
m_struAppFullPath.QueryStr(),
|
||||||
|
m_struPhysicalPath.QueryStr(),
|
||||||
|
m_struCommandLine.QueryStr(),
|
||||||
|
pStrStage,
|
||||||
|
hr,
|
||||||
|
dwRetryCount)))
|
||||||
|
{
|
||||||
|
UTILITY::LogEvent(g_hEventLog,
|
||||||
|
EVENTLOG_WARNING_TYPE,
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_ERROR,
|
||||||
|
strEventMsg.QueryStr());
|
||||||
|
}
|
||||||
|
|
||||||
if (processInformation.hThread != NULL)
|
if (processInformation.hThread != NULL)
|
||||||
{
|
{
|
||||||
CloseHandle(processInformation.hThread);
|
CloseHandle(processInformation.hThread);
|
||||||
|
|
@ -1006,29 +1069,11 @@ SERVER_PROCESS::StartProcess(
|
||||||
pHashTable = NULL;
|
pHashTable = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FAILED(hr))
|
CleanUp();
|
||||||
{
|
|
||||||
if (strEventMsg.IsEmpty())
|
|
||||||
{
|
|
||||||
strEventMsg.SafeSnwprintf(
|
|
||||||
ASPNETCORE_EVENT_PROCESS_START_POSTCREATE_ERROR_MSG,
|
|
||||||
m_struAppFullPath.QueryStr(),
|
|
||||||
m_struPhysicalPath.QueryStr(),
|
|
||||||
m_struCommandLine.QueryStr(),
|
|
||||||
hr,
|
|
||||||
dwRetryCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strEventMsg.IsEmpty())
|
|
||||||
{
|
|
||||||
UTILITY::LogEvent(g_hEventLog,
|
|
||||||
EVENTLOG_ERROR_TYPE,
|
|
||||||
ASPNETCORE_EVENT_PROCESS_START_ERROR,
|
|
||||||
strEventMsg.QueryStr());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Finished:
|
||||||
if (FAILED(hr) || m_fReady == FALSE)
|
if (FAILED(hr) || m_fReady == FALSE)
|
||||||
{
|
{
|
||||||
if (m_hStdoutHandle != NULL)
|
if (m_hStdoutHandle != NULL)
|
||||||
|
|
@ -1045,23 +1090,17 @@ SERVER_PROCESS::StartProcess(
|
||||||
m_Timer.CancelTimer();
|
m_Timer.CancelTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_hListeningProcessHandle != NULL)
|
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
||||||
|
ASPNETCORE_EVENT_PROCESS_START_FAILURE_MSG,
|
||||||
|
m_struAppFullPath.QueryStr(),
|
||||||
|
m_struCommandLine.QueryStr(),
|
||||||
|
m_dwPort)))
|
||||||
{
|
{
|
||||||
if (m_hListeningProcessHandle != INVALID_HANDLE_VALUE)
|
UTILITY::LogEvent(g_hEventLog,
|
||||||
{
|
EVENTLOG_ERROR_TYPE,
|
||||||
CloseHandle(m_hListeningProcessHandle);
|
ASPNETCORE_EVENT_PROCESS_START_FAILURE,
|
||||||
}
|
strEventMsg.QueryStr());
|
||||||
m_hListeningProcessHandle = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_hProcessWaitHandle != NULL)
|
|
||||||
{
|
|
||||||
UnregisterWait(m_hProcessWaitHandle);
|
|
||||||
m_hProcessWaitHandle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
StopProcess();
|
|
||||||
StopAllProcessesInJobObject();
|
|
||||||
}
|
}
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
@ -1807,7 +1846,8 @@ SERVER_PROCESS::SERVER_PROCESS() :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SERVER_PROCESS::~SERVER_PROCESS()
|
VOID
|
||||||
|
SERVER_PROCESS::CleanUp()
|
||||||
{
|
{
|
||||||
if (m_hProcessWaitHandle != NULL)
|
if (m_hProcessWaitHandle != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -1815,7 +1855,7 @@ SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
m_hProcessWaitHandle = NULL;
|
m_hProcessWaitHandle = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (INT i=0; i<MAX_ACTIVE_CHILD_PROCESSES; ++i)
|
for (INT i = 0; i<MAX_ACTIVE_CHILD_PROCESSES; ++i)
|
||||||
{
|
{
|
||||||
if (m_hChildProcessWaitHandles[i] != NULL)
|
if (m_hChildProcessWaitHandles[i] != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -1828,6 +1868,7 @@ SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
{
|
{
|
||||||
if (m_hProcessHandle != INVALID_HANDLE_VALUE)
|
if (m_hProcessHandle != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
TerminateProcess(m_hProcessHandle, 1);
|
||||||
CloseHandle(m_hProcessHandle);
|
CloseHandle(m_hProcessHandle);
|
||||||
}
|
}
|
||||||
m_hProcessHandle = NULL;
|
m_hProcessHandle = NULL;
|
||||||
|
|
@ -1842,12 +1883,13 @@ SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
m_hListeningProcessHandle = NULL;
|
m_hListeningProcessHandle = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (INT i=0; i<MAX_ACTIVE_CHILD_PROCESSES; ++i)
|
for (INT i = 0; i<MAX_ACTIVE_CHILD_PROCESSES; ++i)
|
||||||
{
|
{
|
||||||
if (m_hChildProcessHandles[i] != NULL)
|
if (m_hChildProcessHandles[i] != NULL)
|
||||||
{
|
{
|
||||||
if (m_hChildProcessHandles[i] != INVALID_HANDLE_VALUE)
|
if (m_hChildProcessHandles[i] != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
TerminateProcess(m_hChildProcessHandles[i], 1);
|
||||||
CloseHandle(m_hChildProcessHandles[i]);
|
CloseHandle(m_hChildProcessHandles[i]);
|
||||||
}
|
}
|
||||||
m_hChildProcessHandles[i] = NULL;
|
m_hChildProcessHandles[i] = NULL;
|
||||||
|
|
@ -1855,6 +1897,39 @@ SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_hJobObject != NULL)
|
||||||
|
{
|
||||||
|
if (m_hJobObject != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseHandle(m_hJobObject);
|
||||||
|
}
|
||||||
|
m_hJobObject = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pForwarderConnection != NULL)
|
||||||
|
{
|
||||||
|
m_pForwarderConnection->DereferenceForwarderConnection();
|
||||||
|
m_pForwarderConnection = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
|
{
|
||||||
|
|
||||||
|
CleanUp();
|
||||||
|
|
||||||
|
m_pEnvironmentVarTable = NULL;
|
||||||
|
// no need to free m_pEnvironmentVarTable, as it references to
|
||||||
|
// the same hash table hold by configuration.
|
||||||
|
// the hashtable memory will be freed once onfiguration got recycled
|
||||||
|
|
||||||
|
if (m_pProcessManager != NULL)
|
||||||
|
{
|
||||||
|
m_pProcessManager->DereferenceProcessManager();
|
||||||
|
m_pProcessManager = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_hStdoutHandle != NULL)
|
if (m_hStdoutHandle != NULL)
|
||||||
{
|
{
|
||||||
if (m_hStdoutHandle != INVALID_HANDLE_VALUE)
|
if (m_hStdoutHandle != INVALID_HANDLE_VALUE)
|
||||||
|
|
@ -1883,34 +1958,6 @@ SERVER_PROCESS::~SERVER_PROCESS()
|
||||||
DeleteFile(m_struFullLogFile.QueryStr());
|
DeleteFile(m_struFullLogFile.QueryStr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_hJobObject != NULL)
|
|
||||||
{
|
|
||||||
if (m_hJobObject != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
CloseHandle(m_hJobObject);
|
|
||||||
}
|
|
||||||
m_hJobObject = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_pProcessManager != NULL)
|
|
||||||
{
|
|
||||||
m_pProcessManager->DereferenceProcessManager();
|
|
||||||
m_pProcessManager = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_pForwarderConnection != NULL)
|
|
||||||
{
|
|
||||||
m_pForwarderConnection->DereferenceForwarderConnection();
|
|
||||||
m_pForwarderConnection = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pEnvironmentVarTable = NULL;
|
|
||||||
// no need to free m_pEnvironmentVarTable, as it references to
|
|
||||||
// the same hash table hold by configuration.
|
|
||||||
// the hashtable memory will be freed once onfiguration got recycled
|
|
||||||
|
|
||||||
// InterlockedDecrement(&g_dwActiveServerProcesses);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,8 @@ public:
|
||||||
);
|
);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
VOID
|
||||||
|
CleanUp();
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
IsDebuggerIsAttached(
|
IsDebuggerIsAttached(
|
||||||
|
|
@ -279,4 +281,4 @@ private:
|
||||||
|
|
||||||
PROCESS_MANAGER *m_pProcessManager;
|
PROCESS_MANAGER *m_pProcessManager;
|
||||||
ENVIRONMENT_VAR_HASH *m_pEnvironmentVarTable ;
|
ENVIRONMENT_VAR_HASH *m_pEnvironmentVarTable ;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue