diff options
Diffstat (limited to 'src/burn/engine/apply.cpp')
-rw-r--r-- | src/burn/engine/apply.cpp | 51 |
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( | |||
110 | static HRESULT ApplyProcessPayload( | 110 | static 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 | ); |
115 | static HRESULT ApplyCacheVerifyContainerOrPayload( | 116 | static 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 | ); |
207 | static BOOL ShouldSkipPackage( | ||
208 | __in BURN_PACKAGE* pPackage, | ||
209 | __in BOOL fRollback | ||
210 | ); | ||
206 | static HRESULT ExecuteRelatedBundle( | 211 | static 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: | |||
1164 | static HRESULT ApplyProcessPayload( | 1171 | static 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) |