@joebigelow / wix-1 / commits / 70bb69c0

Remove the package's cache progress when retrying the whole package.

Sean Hall committed Apr 16, 2021 at 10:54 UTC 70bb69c0e5f589fb55d3e36a5e81e9a7d0e56814
3 files changed +47 -30
src/engine/apply.cpp
+45 -30
@@ -42,7 +42,7 @@ typedef struct _BURN_CACHE_PROGRESS_CONTEXT
42 BURN_CACHE_PROGRESS_TYPE type;
43 BURN_CONTAINER* pContainer;
44 BURN_PACKAGE* pPackage;
45 - BURN_PAYLOAD* pPayload;
45 + BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem;
46
47 BOOL fCancel;
48 HRESULT hrError;
@@ -106,7 +106,7 @@ static HRESULT ApplyCacheVerifyContainerOrPayload(
106 __in BURN_CACHE_CONTEXT* pContext,
107 __in_opt BURN_CONTAINER* pContainer,
108 __in_opt BURN_PACKAGE* pPackage,
109 - __in_opt BURN_PAYLOAD* pPayload
109 + __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
110 );
111 static HRESULT ExtractContainer(
112 __in BURN_CACHE_CONTEXT* pContext,
@@ -122,7 +122,7 @@ static HRESULT ApplyAcquireContainerOrPayload(
122 __in BURN_CACHE_CONTEXT* pContext,
123 __in_opt BURN_CONTAINER* pContainer,
124 __in_opt BURN_PACKAGE* pPackage,
125 - __in_opt BURN_PAYLOAD* pPayload
125 + __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
126 );
127 static HRESULT AcquireContainerOrPayload(
128 __in BURN_CACHE_PROGRESS_CONTEXT* pProgress,
@@ -829,7 +829,6 @@ static HRESULT ApplyCachePackage(
829
830 if (BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_RETRY == cachePackageCompleteAction)
831 {
832 - // TODO: the progress needs to account for the payloads (potentially) being recached.
832 for (DWORD i = 0; i < pPackage->payloads.cItems; ++i)
833 {
834 BURN_PAYLOAD_GROUP_ITEM* pItem = pPackage->payloads.rgItems + i;
@@ -838,6 +837,12 @@ static HRESULT ApplyCachePackage(
837 pItem->pPayload->cRemainingInstances += 1;
838 pItem->fCached = FALSE;
839 }
840 +
841 + if (pItem->qwCommittedCacheProgress)
842 + {
843 + pContext->qwSuccessfulCacheProgress -= pItem->qwCommittedCacheProgress;
844 + pItem->qwCommittedCacheProgress = 0;
845 + }
846 }
847
848 LogErrorId(hr, MSG_APPLY_RETRYING_PACKAGE, pPackage->sczId, NULL, NULL);
@@ -981,7 +986,7 @@ static HRESULT ApplyProcessPayload(
986 ExitFunction();
987 }
988
984 - hr = ApplyCacheVerifyContainerOrPayload(pContext, NULL, pPackage, pPayload);
989 + hr = ApplyCacheVerifyContainerOrPayload(pContext, NULL, pPackage, pPayloadGroupItem);
990 if (SUCCEEDED(hr))
991 {
992 ExitFunction();
@@ -991,7 +996,7 @@ static HRESULT ApplyProcessPayload(
996 {
997 fRetry = FALSE;
998
994 - hr = ApplyAcquireContainerOrPayload(pContext, NULL, pPackage, pPayload);
999 + hr = ApplyAcquireContainerOrPayload(pContext, NULL, pPackage, pPayloadGroupItem);
1000 LogExitOnFailure(hr, MSG_FAILED_ACQUIRE_PAYLOAD, "Failed to acquire payload: %ls to working path: %ls", pPayload->sczKey, pPayload->sczUnverifiedPath);
1001
1002 hr = LayoutOrCacheContainerOrPayload(pContext, NULL, pPackage, pPayloadGroupItem, cTryAgainAttempts, &fRetry);
@@ -1009,7 +1014,8 @@ static HRESULT ApplyProcessPayload(
1014 }
1015
1016 ++cTryAgainAttempts;
1012 - pContext->qwSuccessfulCacheProgress -= pPayload->qwFileSize;
1017 + pContext->qwSuccessfulCacheProgress -= pPayloadGroupItem->qwCommittedCacheProgress;
1018 + pPayloadGroupItem->qwCommittedCacheProgress = 0;
1019 ReleaseNullStr(pContext->sczLastUsedFolderCandidate);
1020 LogErrorId(hr, MSG_APPLY_RETRYING_PAYLOAD, pPayload->sczKey, NULL, NULL);
1021 }
@@ -1025,20 +1031,21 @@ static HRESULT ApplyCacheVerifyContainerOrPayload(
1031 __in BURN_CACHE_CONTEXT* pContext,
1032 __in_opt BURN_CONTAINER* pContainer,
1033 __in_opt BURN_PACKAGE* pPackage,
1028 - __in_opt BURN_PAYLOAD* pPayload
1034 + __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
1035 )
1036 {
1031 - AssertSz(pContainer || pPayload, "Must provide a container or a payload.");
1037 + AssertSz(pContainer || pPayloadGroupItem, "Must provide a container or a payload.");
1038
1039 HRESULT hr = S_OK;
1040 BURN_CACHE_PROGRESS_CONTEXT progress = { };
1041 LPCWSTR wzPackageOrContainerId = pContainer ? pContainer->sczId : pPackage ? pPackage->sczId : NULL;
1036 - LPCWSTR wzPayloadId = pPayload ? pPayload->sczKey : NULL;
1042 + LPCWSTR wzPayloadId = pPayloadGroupItem ? pPayloadGroupItem->pPayload->sczKey : NULL;
1043 + DWORD64 qwFileSize = pContainer ? pContainer->qwFileSize : pPayloadGroupItem->pPayload->qwFileSize;
1044
1045 progress.pCacheContext = pContext;
1046 progress.pContainer = pContainer;
1047 progress.pPackage = pPackage;
1041 - progress.pPayload = pPayload;
1048 + progress.pPayloadGroupItem = pPayloadGroupItem;
1049 progress.type = BURN_CACHE_PROGRESS_TYPE_CONTAINER_OR_PAYLOAD_VERIFY;
1050
1051 hr = UserExperienceOnCacheContainerOrPayloadVerifyBegin(pContext->pUX, wzPackageOrContainerId, wzPayloadId);
@@ -1046,7 +1053,7 @@ static HRESULT ApplyCacheVerifyContainerOrPayload(
1053
1054 if (INVALID_HANDLE_VALUE != pContext->hPipe)
1055 {
1049 - hr = ElevationCacheVerifyContainerOrPayload(pContext->hPipe, pContainer, pPackage, pPayload, pContext->wzLayoutDirectory);
1056 + hr = ElevationCacheVerifyContainerOrPayload(pContext->hPipe, pContainer, pPackage, pPayloadGroupItem->pPayload, pContext->wzLayoutDirectory);
1057 }
1058 else if (pContainer)
1059 {
@@ -1054,7 +1061,7 @@ static HRESULT ApplyCacheVerifyContainerOrPayload(
1061 }
1062 else
1063 {
1057 - hr = CacheVerifyPayload(pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder);
1064 + hr = CacheVerifyPayload(pPayloadGroupItem->pPayload, pContext->wzLayoutDirectory ? pContext->wzLayoutDirectory : pPackage->sczCacheFolder);
1065 }
1066
1067 // This was best effort to avoid acquiring the container or payload.
@@ -1063,9 +1070,13 @@ static HRESULT ApplyCacheVerifyContainerOrPayload(
1070 ExitFunction();
1071 }
1072
1066 - pContext->qwSuccessfulCacheProgress += pContainer ? pContainer->qwFileSize : pPayload->qwFileSize;
1073 + pContext->qwSuccessfulCacheProgress += qwFileSize;
1074 + if (pPayloadGroupItem)
1075 + {
1076 + pPayloadGroupItem->qwCommittedCacheProgress += qwFileSize;
1077 + }
1078
1068 - hr = CompleteCacheProgress(&progress, pContainer ? pContainer->qwFileSize : pPayload->qwFileSize);
1079 + hr = CompleteCacheProgress(&progress, qwFileSize);
1080
1081 LExit:
1082 UserExperienceOnCacheContainerOrPayloadVerifyComplete(pContext->pUX, wzPackageOrContainerId, wzPayloadId, hr);
@@ -1275,10 +1286,10 @@ static HRESULT ApplyAcquireContainerOrPayload(
1286 __in BURN_CACHE_CONTEXT* pContext,
1287 __in_opt BURN_CONTAINER* pContainer,
1288 __in_opt BURN_PACKAGE* pPackage,
1278 - __in_opt BURN_PAYLOAD* pPayload
1289 + __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
1290 )
1291 {
1281 - AssertSz(pContainer || pPayload, "Must provide a container or a payload.");
1292 + AssertSz(pContainer || pPayloadGroupItem, "Must provide a container or a payload.");
1293
1294 HRESULT hr = S_OK;
1295 BURN_CACHE_PROGRESS_CONTEXT progress = { };
@@ -1288,7 +1299,7 @@ static HRESULT ApplyAcquireContainerOrPayload(
1299 progress.type = BURN_CACHE_PROGRESS_TYPE_ACQUIRE;
1300 progress.pContainer = pContainer;
1301 progress.pPackage = pPackage;
1291 - progress.pPayload = pPayload;
1302 + progress.pPayloadGroupItem = pPayloadGroupItem;
1303
1304 do
1305 {
@@ -1297,10 +1308,10 @@ static HRESULT ApplyAcquireContainerOrPayload(
1308 if (fRetry)
1309 {
1310 hr = S_OK;
1300 - LogErrorId(hr, pContainer ? MSG_APPLY_RETRYING_ACQUIRE_CONTAINER : MSG_APPLY_RETRYING_ACQUIRE_PAYLOAD, pContainer ? pContainer->sczId : pPayload->sczKey, NULL, NULL);
1311 + LogErrorId(hr, pContainer ? MSG_APPLY_RETRYING_ACQUIRE_CONTAINER : MSG_APPLY_RETRYING_ACQUIRE_PAYLOAD, pContainer ? pContainer->sczId : pPayloadGroupItem->pPayload->sczKey, NULL, NULL);
1312 }
1313
1303 - ExitOnFailure(hr, "Failed to acquire %hs: %ls", pContainer ? "container" : "payload", pContainer ? pContainer->sczId : pPayload->sczKey);
1314 + ExitOnFailure(hr, "Failed to acquire %hs: %ls", pContainer ? "container" : "payload", pContainer ? pContainer->sczId : pPayloadGroupItem->pPayload->sczKey);
1315 } while (fRetry);
1316
1317 LExit:
@@ -1315,7 +1326,7 @@ static HRESULT AcquireContainerOrPayload(
1326 BURN_CACHE_CONTEXT* pContext = pProgress->pCacheContext;
1327 BURN_CONTAINER* pContainer = pProgress->pContainer;
1328 BURN_PACKAGE* pPackage = pProgress->pPackage;
1318 - BURN_PAYLOAD* pPayload = pProgress->pPayload;
1329 + BURN_PAYLOAD* pPayload = pProgress->pPayloadGroupItem ? pProgress->pPayloadGroupItem->pPayload : NULL;
1330 AssertSz(pContainer || pPayload, "Must provide a container or a payload.");
1331
1332 HRESULT hr = S_OK;
@@ -1473,7 +1484,7 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1484 progress.type = BURN_CACHE_PROGRESS_TYPE_VERIFY;
1485 progress.pContainer = pContainer;
1486 progress.pPackage = pPackage;
1476 - progress.pPayload = pPayload;
1487 + progress.pPayloadGroupItem = pPayloadGroupItem;
1488
1489 do
1490 {
@@ -1570,11 +1581,11 @@ static HRESULT CopyPayload(
1581 {
1582 HRESULT hr = S_OK;
1583 LPCWSTR wzPackageOrContainerId = pProgress->pContainer ? pProgress->pContainer->sczId : pProgress->pPackage ? pProgress->pPackage->sczId : L"";
1573 - LPCWSTR wzPayloadId = pProgress->pPayload ? pProgress->pPayload->sczKey : L"";
1584 + LPCWSTR wzPayloadId = pProgress->pPayloadGroupItem ? pProgress->pPayloadGroupItem->pPayload->sczKey : L"";
1585 HANDLE hDestinationFile = INVALID_HANDLE_VALUE;
1586 HANDLE hSourceOpenedFile = INVALID_HANDLE_VALUE;
1587
1577 - DWORD dwLogId = pProgress->pContainer ? (pProgress->pPayload ? MSG_ACQUIRE_CONTAINER_PAYLOAD : MSG_ACQUIRE_CONTAINER) : pProgress->pPackage ? MSG_ACQUIRE_PACKAGE_PAYLOAD : MSG_ACQUIRE_BUNDLE_PAYLOAD;
1588 + DWORD dwLogId = pProgress->pContainer ? (pProgress->pPayloadGroupItem ? MSG_ACQUIRE_CONTAINER_PAYLOAD : MSG_ACQUIRE_CONTAINER) : pProgress->pPackage ? MSG_ACQUIRE_PACKAGE_PAYLOAD : MSG_ACQUIRE_BUNDLE_PAYLOAD;
1589 LogId(REPORT_STANDARD, dwLogId, wzPackageOrContainerId, wzPayloadId, "copy", wzSourcePath);
1590
1591 hr = PreparePayloadDestinationPath(wzDestinationPath);
@@ -1630,14 +1641,14 @@ static HRESULT DownloadPayload(
1641 {
1642 HRESULT hr = S_OK;
1643 LPCWSTR wzPackageOrContainerId = pProgress->pContainer ? pProgress->pContainer->sczId : pProgress->pPackage ? pProgress->pPackage->sczId : L"";
1633 - LPCWSTR wzPayloadId = pProgress->pPayload ? pProgress->pPayload->sczKey : L"";
1634 - DOWNLOAD_SOURCE* pDownloadSource = pProgress->pContainer ? &pProgress->pContainer->downloadSource : &pProgress->pPayload->downloadSource;
1635 - DWORD64 qwDownloadSize = pProgress->pContainer ? pProgress->pContainer->qwFileSize : pProgress->pPayload->qwFileSize;
1644 + LPCWSTR wzPayloadId = pProgress->pPayloadGroupItem ? pProgress->pPayloadGroupItem->pPayload->sczKey : L"";
1645 + DOWNLOAD_SOURCE* pDownloadSource = pProgress->pContainer ? &pProgress->pContainer->downloadSource : &pProgress->pPayloadGroupItem->pPayload->downloadSource;
1646 + DWORD64 qwDownloadSize = pProgress->pContainer ? pProgress->pContainer->qwFileSize : pProgress->pPayloadGroupItem->pPayload->qwFileSize;
1647 DOWNLOAD_CACHE_CALLBACK cacheCallback = { };
1648 DOWNLOAD_AUTHENTICATION_CALLBACK authenticationCallback = { };
1649 APPLY_AUTHENTICATION_REQUIRED_DATA authenticationData = { };
1650
1640 - DWORD dwLogId = pProgress->pContainer ? (pProgress->pPayload ? MSG_ACQUIRE_CONTAINER_PAYLOAD : MSG_ACQUIRE_CONTAINER) : pProgress->pPackage ? MSG_ACQUIRE_PACKAGE_PAYLOAD : MSG_ACQUIRE_BUNDLE_PAYLOAD;
1651 + DWORD dwLogId = pProgress->pContainer ? (pProgress->pPayloadGroupItem ? MSG_ACQUIRE_CONTAINER_PAYLOAD : MSG_ACQUIRE_CONTAINER) : pProgress->pPackage ? MSG_ACQUIRE_PACKAGE_PAYLOAD : MSG_ACQUIRE_BUNDLE_PAYLOAD;
1652 LogId(REPORT_STANDARD, dwLogId, wzPackageOrContainerId, wzPayloadId, "download", pDownloadSource->sczUrl);
1653
1654 hr = PreparePayloadDestinationPath(wzDestinationPath);
@@ -1736,11 +1747,15 @@ static HRESULT CompleteCacheProgress(
1747 if (PROGRESS_CONTINUE == dwResult)
1748 {
1749 pContext->pCacheContext->qwSuccessfulCacheProgress += qwFileSize;
1750 + if (pContext->pPayloadGroupItem)
1751 + {
1752 + pContext->pPayloadGroupItem->qwCommittedCacheProgress += qwFileSize;
1753 + }
1754
1755 if (BURN_CACHE_PROGRESS_TYPE_VERIFY == pContext->type && pContext->pCacheContext->sczLastUsedFolderCandidate)
1756 {
1757 // We successfully copied from a source location, set that as the last used source.
1743 - CacheSetLastUsedSource(pContext->pCacheContext->pVariables, pContext->pCacheContext->sczLastUsedFolderCandidate, pContext->pContainer ? pContext->pContainer->sczFilePath : pContext->pPayload->sczFilePath);
1758 + CacheSetLastUsedSource(pContext->pCacheContext->pVariables, pContext->pCacheContext->sczLastUsedFolderCandidate, pContext->pContainer ? pContext->pContainer->sczFilePath : pContext->pPayloadGroupItem->pPayload->sczFilePath);
1759 }
1760 }
1761 else if (PROGRESS_CANCEL == dwResult)
@@ -1774,7 +1789,7 @@ static DWORD CALLBACK CacheProgressRoutine(
1789 DWORD dwResult = PROGRESS_CONTINUE;
1790 BURN_CACHE_PROGRESS_CONTEXT* pProgress = static_cast<BURN_CACHE_PROGRESS_CONTEXT*>(lpData);
1791 LPCWSTR wzPackageOrContainerId = pProgress->pContainer ? pProgress->pContainer->sczId : pProgress->pPackage ? pProgress->pPackage->sczId : NULL;
1777 - LPCWSTR wzPayloadId = pProgress->pPayload ? pProgress->pPayload->sczKey : NULL;
1792 + LPCWSTR wzPayloadId = pProgress->pPayloadGroupItem ? pProgress->pPayloadGroupItem->pPayload->sczKey : NULL;
1793 DWORD64 qwCacheProgress = pProgress->pCacheContext->qwSuccessfulCacheProgress + TotalBytesTransferred.QuadPart;
1794 if (qwCacheProgress > pProgress->pCacheContext->qwTotalCacheSize)
1795 {
src/engine/payload.h
+1
@@ -62,6 +62,7 @@ typedef struct _BURN_PAYLOAD_GROUP_ITEM
62
63 // mutable members
64 BOOL fCached;
65 + DWORD64 qwCommittedCacheProgress;
66 } BURN_PAYLOAD_GROUP_ITEM;
67
68 typedef struct _BURN_PAYLOAD_GROUP
src/engine/plan.cpp
+1
@@ -1854,6 +1854,7 @@ static void ResetPlannedPayloadGroupState(
1854 BURN_PAYLOAD_GROUP_ITEM* pItem = pPayloadGroup->rgItems + i;
1855
1856 pItem->fCached = FALSE;
1857 + pItem->qwCommittedCacheProgress = 0;
1858 }
1859 }
1860