From a470bbc209dff298dbf86a29393d6a2a8b768dc8 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Thu, 15 Sep 2022 12:17:47 -0500 Subject: Ignore cache bundle failure if it already exists in the package cache. Fixes 6848 --- src/burn/engine/cache.cpp | 12 ++++---- src/burn/engine/engine.mc | 7 +++++ src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs | 33 ++++++++++++++++++++-- 3 files changed, 43 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/burn/engine/cache.cpp b/src/burn/engine/cache.cpp index 01237162..251cd24b 100644 --- a/src/burn/engine/cache.cpp +++ b/src/burn/engine/cache.cpp @@ -1000,8 +1000,6 @@ extern "C" HRESULT CacheCompleteBundle( BOOL fPathEqual = FALSE; LPWSTR sczTargetDirectory = NULL; LPWSTR sczTargetPath = NULL; - LPWSTR sczSourceDirectory = NULL; - LPWSTR sczPayloadSourcePath = NULL; hr = CreateCompletedPath(pCache, fPerMachine, wzBundleId, NULL, &sczTargetDirectory); ExitOnFailure(hr, "Failed to create completed cache path for bundle."); @@ -1028,18 +1026,18 @@ extern "C" HRESULT CacheCompleteBundle( FileRemoveFromPendingRename(sczTargetPath); // best effort to ensure bundle is not deleted from cache post restart. hr = FileEnsureCopyWithRetry(wzSourceBundlePath, sczTargetPath, TRUE, FILE_OPERATION_RETRY_COUNT, FILE_OPERATION_RETRY_WAIT); + if (FAILED(hr) && FileExistsEx(sczTargetPath, NULL)) + { + LogId(REPORT_WARNING, MSG_IGNORING_CACHE_BUNDLE_FAILURE, hr); + ExitFunction1(hr = S_OK); + } ExitOnFailure(hr, "Failed to cache bundle from: '%ls' to '%ls'", wzSourceBundlePath, sczTargetPath); // Reset the path permissions in the cache. hr = ResetPathPermissions(fPerMachine, sczTargetPath); ExitOnFailure(hr, "Failed to reset permissions on cached bundle: '%ls'", sczTargetPath); - hr = PathGetDirectory(wzSourceBundlePath, &sczSourceDirectory); - ExitOnFailure(hr, "Failed to get directory from engine working path: %ls", wzSourceBundlePath); - LExit: - ReleaseStr(sczPayloadSourcePath); - ReleaseStr(sczSourceDirectory); ReleaseStr(sczTargetPath); ReleaseStr(sczTargetDirectory); diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc index cebd1325..39aea60e 100644 --- a/src/burn/engine/engine.mc +++ b/src/burn/engine/engine.mc @@ -862,6 +862,13 @@ Language=English Cached non-vital package: %1!ls!, encountered error: 0x%2!x!. Continuing... . +MessageId=345 +Severity=Warning +SymbolicName=MSG_IGNORING_CACHE_BUNDLE_FAILURE +Language=English +Ignoring failure to cache bundle because the file already exists, encountered error: 0x%1!x!. Continuing... +. + MessageId=346 Severity=Warning SymbolicName=MSG_CACHE_RETRYING_PACKAGE diff --git a/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs b/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs index e5e3259f..afc3fc10 100644 --- a/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs +++ b/src/test/burn/WixToolsetTest.BurnE2E/CacheTests.cs @@ -203,6 +203,35 @@ namespace WixToolsetTest.BurnE2E } } + [RuntimeFact] + public void CanHandleCachedBundleInPackageCacheInUse() + { + var packageA = this.CreatePackageInstaller("PackageA"); + var packageB = this.CreatePackageInstaller("PackageB"); + var bundleA = this.CreateBundleInstaller("BundleA"); + + bundleA.Install(); + + var registration = bundleA.VerifyRegisteredAndInPackageCache(); + var cachedBundlePath = registration.CachePath; + + packageA.VerifyInstalled(true); + packageB.VerifyInstalled(true); + + // Lock the bundle file in the package cache. + string modifyLogPath; + using (FileStream lockTargetFile = new FileStream(cachedBundlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) + { + modifyLogPath = bundleA.Modify(); + } + + bundleA.VerifyRegisteredAndInPackageCache(); + packageA.VerifyInstalled(true); + packageB.VerifyInstalled(true); + + Assert.True(LogVerifier.MessageInLogFile(modifyLogPath, "w345: Ignoring failure to cache bundle because the file already exists, encountered error: 0x80070020. Continuing...")); + } + [RuntimeFact] public void CanGetEngineWorkingDirectoryFromCommandLine() { @@ -215,7 +244,7 @@ namespace WixToolsetTest.BurnE2E { var baseTempPath = dfs.GetFolder(true); var logPath = bundleA.Install(0, $"-burn.engine.working.directory=\"{baseTempPath}\""); - LogVerifier.MessageInLogFileRegex(logPath, $"Burn x86 v4.*, Windows v.* \\(Build .*: Service Pack .*\\), path: {baseTempPath.Replace("\\", "\\\\")}\\\\.*\\\\.cr\\\\BundleA.exe"); + Assert.True(LogVerifier.MessageInLogFileRegex(logPath, $"Burn x86 v4.*, Windows v.* \\(Build .*: Service Pack .*\\), path: {baseTempPath.Replace("\\", "\\\\")}\\\\.*\\\\.cr\\\\BundleA.exe")); } } @@ -251,7 +280,7 @@ namespace WixToolsetTest.BurnE2E } var logPath = bundleA.Install(); - LogVerifier.MessageInLogFileRegex(logPath, $"Burn x86 v4.*, Windows v.* \\(Build .*: Service Pack .*\\), path: {baseTempPath.Replace("\\", "\\\\")}\\\\.*\\\\.cr\\\\BundleA.exe"); + Assert.True(LogVerifier.MessageInLogFileRegex(logPath, $"Burn x86 v4.*, Windows v.* \\(Build .*: Service Pack .*\\), path: {baseTempPath.Replace("\\", "\\\\")}\\\\.*\\\\.cr\\\\BundleA.exe")); } } finally -- cgit v1.2.3-55-g6feb