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;