diff options
Diffstat (limited to '')
| -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) |
