@joebigelow / wix / commits / 41d2c12d

Assume critical shutdown was caused by the current package.

Packages should not be retried if a restart was initiated. Only the first package that initiated restart should be stored in BURN_BUNDLE_FORCED_RESTART_PACKAGE.

Sean Hall committed May 3, 2022 at 15:28 UTC 41d2c12d60ee84cefc26ec99abb328701883c8f5
3 files changed +27 -15
src/burn/engine/apply.cpp
+21 -15
@@ -329,8 +329,7 @@ static HRESULT ReportOverallProgressTicks(
329 __in BURN_APPLY_CONTEXT* pApplyContext
330 );
331 static HRESULT ExecutePackageComplete(
332 - __in BURN_USER_EXPERIENCE* pUX,
333 - __in BURN_VARIABLES* pVariables,
332 + __in BURN_ENGINE_STATE* pEngineState,
333 __in LPCWSTR wzPackageId,
334 __in BOOL fPackageVital,
335 __in BOOL fAbandonedProcess,
@@ -2400,8 +2399,6 @@ static HRESULT DoExecuteAction(
2399 ExitOnFailure(hr, "Failed to execute dependency action.");
2400 break;
2401
2403 - break;
2404 -
2402 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START: __fallthrough;
2403 case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END:
2404 *ppCheckpoint = NULL;
@@ -2653,7 +2650,7 @@ LExit:
2650 if (fBeginCalled)
2651 {
2652 pPackage->fAbandonedProcess = pContext->fAbandonedProcess;
2656 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2653 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2654 }
2655
2656 return hr;
@@ -2778,7 +2775,7 @@ LExit:
2775 if (fBeginCalled)
2776 {
2777 pPackage->fAbandonedProcess = pContext->fAbandonedProcess;
2781 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2778 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2779 }
2780
2781 return hr;
@@ -2858,7 +2855,7 @@ LExit:
2855 if (fBeginCalled)
2856 {
2857 pPackage->fAbandonedProcess = pContext->fAbandonedProcess;
2861 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2858 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2859 }
2860
2861 return hr;
@@ -2923,7 +2920,7 @@ LExit:
2920 if (fBeginCalled)
2921 {
2922 Assert(!pContext->fAbandonedProcess);
2926 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2923 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2924 }
2925
2926 return hr;
@@ -2997,7 +2994,7 @@ LExit:
2994 if (fBeginCalled)
2995 {
2996 Assert(!pContext->fAbandonedProcess);
3000 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2997 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
2998 }
2999
3000 return hr;
@@ -3078,7 +3075,7 @@ LExit:
3075 if (fBeginCalled)
3076 {
3077 pPackage->fAbandonedProcess = pContext->fAbandonedProcess;
3081 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
3078 + hr = ExecutePackageComplete(pEngineState, pPackage->sczId, pPackage->fVital, pPackage->fAbandonedProcess, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
3079 }
3080
3081 return hr;
@@ -3398,7 +3395,7 @@ LExit:
3395 if (fBeginCalled)
3396 {
3397 Assert(!pContext->fAbandonedProcess);
3401 - hr = ExecutePackageComplete(&pEngineState->userExperience, &pEngineState->variables, pContext->wzExecutingPackageId, FALSE, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
3398 + hr = ExecutePackageComplete(pEngineState, pContext->wzExecutingPackageId, FALSE, FALSE, hr, hrExecute, fRollback, pRestart, pfRetry, pfSuspend);
3399 }
3400
3401 return hr;
@@ -3574,8 +3571,7 @@ static HRESULT ReportOverallProgressTicks(
3571 }
3572
3573 static HRESULT ExecutePackageComplete(
3577 - __in BURN_USER_EXPERIENCE* pUX,
3578 - __in BURN_VARIABLES* pVariables,
3574 + __in BURN_ENGINE_STATE* pEngineState,
3575 __in LPCWSTR wzPackageId,
3576 __in BOOL fPackageVital,
3577 __in BOOL fAbandonedProcess,
@@ -3589,6 +3585,13 @@ static HRESULT ExecutePackageComplete(
3585 {
3586 HRESULT hr = FAILED(hrOverall) ? hrOverall : hrExecute; // if the overall function failed use that otherwise use the execution result.
3587 BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION executePackageCompleteAction = FAILED(hrOverall) || SUCCEEDED(hrExecute) || fPackageVital ? BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_NONE : BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_IGNORE;
3588 + BURN_USER_EXPERIENCE* pUX = &pEngineState->userExperience;
3589 + BURN_VARIABLES* pVariables = &pEngineState->variables;
3590 +
3591 + if (pEngineState->fCriticalShutdownInitiated)
3592 + {
3593 + *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
3594 + }
3595
3596 // Send package execute complete to BA.
3597 UserExperienceOnExecutePackageComplete(pUX, wzPackageId, hr, *pRestart, &executePackageCompleteAction);
@@ -3596,12 +3599,15 @@ static HRESULT ExecutePackageComplete(
3599 {
3600 *pRestart = BOOTSTRAPPER_APPLY_RESTART_INITIATED;
3601 }
3599 - *pfRetry = (FAILED(hrExecute) && BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY == executePackageCompleteAction && !fAbandonedProcess); // allow retry only on failures.
3602 + *pfRetry = (BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY == executePackageCompleteAction &&
3603 + FAILED(hrExecute) && !fAbandonedProcess && BOOTSTRAPPER_APPLY_RESTART_INITIATED != *pRestart); // allow retry only on non-fatal failures.
3604 *pfSuspend = (BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_SUSPEND == executePackageCompleteAction);
3605
3606 // Remember this package as the package that initiated the forced restart.
3603 - if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart)
3607 + if (BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart && !pEngineState->wzRestartInitiatedPackageId)
3608 {
3609 + pEngineState->wzRestartInitiatedPackageId = wzPackageId;
3610 +
3611 // Best effort to set the forced restart package variable.
3612 VariableSetString(pVariables, BURN_BUNDLE_FORCED_RESTART_PACKAGE, wzPackageId, TRUE, FALSE);
3613 }
src/burn/engine/core.h
+2
@@ -159,7 +159,9 @@ typedef struct _BURN_ENGINE_STATE
159 BURN_PIPE_CONNECTION companionConnection;
160 BURN_PIPE_CONNECTION embeddedConnection;
161
162 + BOOL fCriticalShutdownInitiated;
163 BURN_RESUME_MODE resumeMode;
164 + LPCWSTR wzRestartInitiatedPackageId;
165
166 BURN_ENGINE_COMMAND internalCommand;
167 } BURN_ENGINE_STATE;
src/burn/engine/uithread.cpp
+4
@@ -18,6 +18,7 @@ struct UITHREAD_INFO
18 {
19 BOOL fElevatedEngine;
20 BURN_USER_EXPERIENCE* pUserExperience;
21 + BOOL* pfCriticalShutdownInitiated;
22 };
23
24
@@ -132,6 +133,7 @@ static DWORD WINAPI ThreadProc(
133
134 info.fElevatedEngine = fElevatedEngine;
135 info.pUserExperience = &pEngineState->userExperience;
136 + info.pfCriticalShutdownInitiated = &pEngineState->fCriticalShutdownInitiated;
137
138 // Create the window to handle reboots without activating it.
139 hWnd = ::CreateWindowExW(WS_EX_NOACTIVATE, wc.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, HWND_DESKTOP, NULL, pContext->hInstance, &info);
@@ -208,6 +210,8 @@ static LRESULT CALLBACK WndProc(
210 UserExperienceOnSystemShutdown(pInfo->pUserExperience, dwEndSession, &fCancel);
211 }
212
213 + *pInfo->pfCriticalShutdownInitiated |= fCritical;
214 +
215 fRet = !fCancel;
216 LogId(REPORT_STANDARD, MSG_SYSTEM_SHUTDOWN, LoggingBoolToString(fCritical), LoggingBoolToString(pInfo->fElevatedEngine), LoggingBoolToString(fRet));
217 return fRet;