summaryrefslogtreecommitdiff
path: root/src/burn/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/apply.cpp')
-rw-r--r--src/burn/engine/apply.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp
index 048cd98b..d215cfe5 100644
--- a/src/burn/engine/apply.cpp
+++ b/src/burn/engine/apply.cpp
@@ -110,7 +110,8 @@ static HRESULT ApplyLayoutContainer(
110static HRESULT ApplyProcessPayload( 110static HRESULT ApplyProcessPayload(
111 __in BURN_CACHE_CONTEXT* pContext, 111 __in BURN_CACHE_CONTEXT* pContext,
112 __in_opt BURN_PACKAGE* pPackage, 112 __in_opt BURN_PACKAGE* pPackage,
113 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem 113 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem,
114 __in BOOL fVital
114 ); 115 );
115static HRESULT ApplyCacheVerifyContainerOrPayload( 116static HRESULT ApplyCacheVerifyContainerOrPayload(
116 __in BURN_CACHE_CONTEXT* pContext, 117 __in BURN_CACHE_CONTEXT* pContext,
@@ -203,6 +204,10 @@ static HRESULT DoRollbackActions(
203 __in DWORD dwCheckpoint, 204 __in DWORD dwCheckpoint,
204 __out BOOTSTRAPPER_APPLY_RESTART* pRestart 205 __out BOOTSTRAPPER_APPLY_RESTART* pRestart
205 ); 206 );
207static BOOL ShouldSkipPackage(
208 __in BURN_PACKAGE* pPackage,
209 __in BOOL fRollback
210 );
206static HRESULT ExecuteRelatedBundle( 211static HRESULT ExecuteRelatedBundle(
207 __in BURN_ENGINE_STATE* pEngineState, 212 __in BURN_ENGINE_STATE* pEngineState,
208 __in BURN_EXECUTE_ACTION* pExecuteAction, 213 __in BURN_EXECUTE_ACTION* pExecuteAction,
@@ -379,6 +384,7 @@ extern "C" void ApplyReset(
379 { 384 {
380 BURN_PACKAGE* pPackage = pPackages->rgPackages + i; 385 BURN_PACKAGE* pPackage = pPackages->rgPackages + i;
381 pPackage->hrCacheResult = S_OK; 386 pPackage->hrCacheResult = S_OK;
387 pPackage->fAcquireOptionalSource = FALSE;
382 pPackage->fReachedExecution = FALSE; 388 pPackage->fReachedExecution = FALSE;
383 pPackage->fAbandonedProcess = FALSE; 389 pPackage->fAbandonedProcess = FALSE;
384 pPackage->transactionRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN; 390 pPackage->transactionRegistrationState = BURN_PACKAGE_REGISTRATION_STATE_UNKNOWN;
@@ -633,7 +639,7 @@ extern "C" HRESULT ApplyCache(
633 break; 639 break;
634 640
635 case BURN_CACHE_ACTION_TYPE_SIGNAL_SYNCPOINT: 641 case BURN_CACHE_ACTION_TYPE_SIGNAL_SYNCPOINT:
636 if (!::SetEvent(pCacheAction->syncpoint.hEvent)) 642 if (!::SetEvent(pCacheAction->syncpoint.pPackage->hCacheEvent))
637 { 643 {
638 ExitWithLastError(hr, "Failed to set syncpoint event."); 644 ExitWithLastError(hr, "Failed to set syncpoint event.");
639 } 645 }
@@ -959,12 +965,13 @@ static HRESULT ApplyCachePackage(
959 HRESULT hr = S_OK; 965 HRESULT hr = S_OK;
960 BOOL fCanceledBegin = FALSE; 966 BOOL fCanceledBegin = FALSE;
961 BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION cachePackageCompleteAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE; 967 BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION cachePackageCompleteAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE;
968 BOOL fVital = pPackage->fCacheVital;
962 969
963 for (;;) 970 for (;;)
964 { 971 {
965 fCanceledBegin = FALSE; 972 fCanceledBegin = FALSE;
966 973
967 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cItems, pPackage->payloads.qwTotalSize); 974 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cItems, pPackage->payloads.qwTotalSize, fVital);
968 if (FAILED(hr)) 975 if (FAILED(hr))
969 { 976 {
970 fCanceledBegin = TRUE; 977 fCanceledBegin = TRUE;
@@ -975,7 +982,7 @@ static HRESULT ApplyCachePackage(
975 { 982 {
976 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPackage->payloads.rgItems + i; 983 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPackage->payloads.rgItems + i;
977 984
978 hr = ApplyProcessPayload(pContext, pPackage, pPayloadGroupItem); 985 hr = ApplyProcessPayload(pContext, pPackage, pPayloadGroupItem, fVital);
979 if (FAILED(hr)) 986 if (FAILED(hr))
980 { 987 {
981 break; 988 break;
@@ -984,7 +991,7 @@ static HRESULT ApplyCachePackage(
984 } 991 }
985 992
986 pPackage->hrCacheResult = hr; 993 pPackage->hrCacheResult = hr;
987 cachePackageCompleteAction = SUCCEEDED(hr) || pPackage->fVital || fCanceledBegin ? BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE : BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE; 994 cachePackageCompleteAction = SUCCEEDED(hr) || (pPackage->fVital && fVital) || fCanceledBegin ? BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE : BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE;
988 UserExperienceOnCachePackageComplete(pContext->pUX, pPackage->sczId, hr, &cachePackageCompleteAction); 995 UserExperienceOnCachePackageComplete(pContext->pUX, pPackage->sczId, hr, &cachePackageCompleteAction);
989 996
990 if (SUCCEEDED(hr)) 997 if (SUCCEEDED(hr))
@@ -1014,7 +1021,7 @@ static HRESULT ApplyCachePackage(
1014 1021
1015 continue; 1022 continue;
1016 } 1023 }
1017 else if (BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE == cachePackageCompleteAction && !pPackage->fVital) // ignore non-vital download failures. 1024 else if (BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_IGNORE == cachePackageCompleteAction && (!pPackage->fVital || !fVital)) // ignore non-vital download failures.
1018 { 1025 {
1019 LogId(REPORT_STANDARD, MSG_CACHE_CONTINUING_NONVITAL_PACKAGE, pPackage->sczId, hr); 1026 LogId(REPORT_STANDARD, MSG_CACHE_CONTINUING_NONVITAL_PACKAGE, pPackage->sczId, hr);
1020 hr = S_OK; 1027 hr = S_OK;
@@ -1101,7 +1108,7 @@ static HRESULT ApplyLayoutBundle(
1101 { 1108 {
1102 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPayloads->rgItems + i; 1109 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPayloads->rgItems + i;
1103 1110
1104 hr = ApplyProcessPayload(pContext, NULL, pPayloadGroupItem); 1111 hr = ApplyProcessPayload(pContext, NULL, pPayloadGroupItem, TRUE);
1105 ExitOnFailure(hr, "Failed to layout bundle payload: %ls", pPayloadGroupItem->pPayload->sczKey); 1112 ExitOnFailure(hr, "Failed to layout bundle payload: %ls", pPayloadGroupItem->pPayload->sczKey);
1106 } 1113 }
1107 1114
@@ -1164,12 +1171,14 @@ LExit:
1164static HRESULT ApplyProcessPayload( 1171static HRESULT ApplyProcessPayload(
1165 __in BURN_CACHE_CONTEXT* pContext, 1172 __in BURN_CACHE_CONTEXT* pContext,
1166 __in_opt BURN_PACKAGE* pPackage, 1173 __in_opt BURN_PACKAGE* pPackage,
1167 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem 1174 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem,
1175 __in BOOL fVital
1168 ) 1176 )
1169{ 1177{
1170 HRESULT hr = S_OK; 1178 HRESULT hr = S_OK;
1171 DWORD cTryAgainAttempts = 0; 1179 DWORD cTryAgainAttempts = 0;
1172 BOOL fRetry = FALSE; 1180 BOOL fRetry = FALSE;
1181 BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION action = BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION_NONE;
1173 BURN_PAYLOAD* pPayload = pPayloadGroupItem->pPayload; 1182 BURN_PAYLOAD* pPayload = pPayloadGroupItem->pPayload;
1174 1183
1175 Assert(pContext->pPayloads && pPackage || pContext->wzLayoutDirectory); 1184 Assert(pContext->pPayloads && pPackage || pContext->wzLayoutDirectory);
@@ -1184,6 +1193,18 @@ static HRESULT ApplyProcessPayload(
1184 { 1193 {
1185 ExitFunction(); 1194 ExitFunction();
1186 } 1195 }
1196 else if (pPackage && !pPackage->fAcquireOptionalSource && !fVital)
1197 {
1198 HRESULT hrResponse = UserExperienceOnCachePackageNonVitalValidationFailure(pContext->pUX, pPackage->sczId, hr, &action);
1199 ExitOnRootFailure(hrResponse, "BA aborted cache package non-vital failure.");
1200
1201 if (BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION_ACQUIRE != action)
1202 {
1203 ExitFunction();
1204 }
1205
1206 pPackage->fAcquireOptionalSource = TRUE;
1207 }
1187 1208
1188 for (;;) 1209 for (;;)
1189 { 1210 {
@@ -2567,10 +2588,20 @@ static BOOL ShouldSkipPackage(
2567 ) 2588 )
2568{ 2589{
2569 BOOL fSkip = FALSE; 2590 BOOL fSkip = FALSE;
2591 BURN_CACHE_PACKAGE_TYPE cachePackageType = fRollback ? pPackage->rollbackCacheType : pPackage->executeCacheType;
2592 BOOL fCacheVital = BURN_CACHE_PACKAGE_TYPE_REQUIRED == cachePackageType;
2570 2593
2571 if (FAILED(pPackage->hrCacheResult)) 2594 if (fCacheVital && FAILED(pPackage->hrCacheResult))
2572 { 2595 {
2573 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult); 2596 if (fRollback)
2597 {
2598 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_ROLLBACK_NO_CACHE, pPackage->sczId, pPackage->hrCacheResult, LoggingActionStateToString(pPackage->rollback));
2599 }
2600 else
2601 {
2602 LogId(REPORT_STANDARD, MSG_APPLY_SKIPPED_FAILED_CACHED_PACKAGE, pPackage->sczId, pPackage->hrCacheResult);
2603 }
2604
2574 ExitFunction1(fSkip = TRUE); 2605 ExitFunction1(fSkip = TRUE);
2575 } 2606 }
2576 else if (fRollback && pPackage->fAbandonedProcess) 2607 else if (fRollback && pPackage->fAbandonedProcess)