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