From 5c105c5805a5fd918ae2c2485a6126f59a495851 Mon Sep 17 00:00:00 2001 From: Leonid Tsarev Date: Tue, 21 May 2024 15:05:48 +0300 Subject: [PATCH 1/2] Log errors that happen during file copy --- .../Contracts/HostInteraction.cs | 2 +- src/LibraryManager.Contracts/FileHelpers.cs | 13 +++++++------ .../Contracts/HostInteraction.cs | 2 +- src/libman/Contracts/HostInteraction.cs | 2 +- test/LibraryManager.Mocks/HostInteraction.cs | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/LibraryManager.Build/Contracts/HostInteraction.cs b/src/LibraryManager.Build/Contracts/HostInteraction.cs index 48eec4a76..61b835bdc 100644 --- a/src/LibraryManager.Build/Contracts/HostInteraction.cs +++ b/src/LibraryManager.Build/Contracts/HostInteraction.cs @@ -83,7 +83,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if (result) { Logger.Log(string.Format(Resources.Text.FileWrittenToDisk, destinationPath.Replace('\\', '/')), LogLevel.Operation); diff --git a/src/LibraryManager.Contracts/FileHelpers.cs b/src/LibraryManager.Contracts/FileHelpers.cs index 3d58e5d86..4d5a19de3 100644 --- a/src/LibraryManager.Contracts/FileHelpers.cs +++ b/src/LibraryManager.Contracts/FileHelpers.cs @@ -136,21 +136,22 @@ public static Task ReadFileAsStreamAsync(string fileName, CancellationTo /// /// Full path to the source file /// Full path to the destination file + /// Pass logger to log errors. /// Cancellation token /// A boolean indicating whether the file was copied successfully - public static async Task CopyFileAsync(string sourceFile, string destinationFile, CancellationToken cancellationToken) + public static async Task CopyFileAsync(string sourceFile, string destinationFile, ILogger logger, CancellationToken cancellationToken) { try { - using (FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read)) - { - await WriteToFileAsync(destinationFile, sourceStream, cancellationToken); - } + using FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read); + + await WriteToFileAsync(destinationFile, sourceStream, cancellationToken); return true; } - catch (Exception) + catch (Exception exception) { + logger.Log($"Error during copying file {exception}", LogLevel.Error); return false; } } diff --git a/src/LibraryManager.Vsix/Contracts/HostInteraction.cs b/src/LibraryManager.Vsix/Contracts/HostInteraction.cs index 7f171c67e..9e6949ac4 100644 --- a/src/LibraryManager.Vsix/Contracts/HostInteraction.cs +++ b/src/LibraryManager.Vsix/Contracts/HostInteraction.cs @@ -121,7 +121,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, } await VsHelpers.CheckFileOutOfSourceControlAsync(absoluteDestinationPath); - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if (result) { diff --git a/src/libman/Contracts/HostInteraction.cs b/src/libman/Contracts/HostInteraction.cs index a56558625..cd2f82b49 100644 --- a/src/libman/Contracts/HostInteraction.cs +++ b/src/libman/Contracts/HostInteraction.cs @@ -108,7 +108,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if(result) { Logger.Log(string.Format(Resources.Text.FileWrittenToDisk, destinationPath.Replace('\\', '/')), LogLevel.Operation); diff --git a/test/LibraryManager.Mocks/HostInteraction.cs b/test/LibraryManager.Mocks/HostInteraction.cs index 1be9738c4..6e3d71c73 100644 --- a/test/LibraryManager.Mocks/HostInteraction.cs +++ b/test/LibraryManager.Mocks/HostInteraction.cs @@ -152,7 +152,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); return result; } From ff78e14d4a012fb54b537047f59f4c4194debf0c Mon Sep 17 00:00:00 2001 From: Leonid Tsarev Date: Tue, 21 May 2024 15:08:24 +0300 Subject: [PATCH 2/2] Retry file copying --- src/LibraryManager.Contracts/FileHelpers.cs | 22 ++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/LibraryManager.Contracts/FileHelpers.cs b/src/LibraryManager.Contracts/FileHelpers.cs index 4d5a19de3..818346fd6 100644 --- a/src/LibraryManager.Contracts/FileHelpers.cs +++ b/src/LibraryManager.Contracts/FileHelpers.cs @@ -141,19 +141,23 @@ public static Task ReadFileAsStreamAsync(string fileName, CancellationTo /// A boolean indicating whether the file was copied successfully public static async Task CopyFileAsync(string sourceFile, string destinationFile, ILogger logger, CancellationToken cancellationToken) { - try + //Sometimes it flaky. Let's retry + for (int i=0; i<2;i++) { - using FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read); + try + { + using FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read); - await WriteToFileAsync(destinationFile, sourceStream, cancellationToken); + await WriteToFileAsync(destinationFile, sourceStream, cancellationToken); - return true; - } - catch (Exception exception) - { - logger.Log($"Error during copying file {exception}", LogLevel.Error); - return false; + return true; + } + catch (Exception exception) + { + logger.Log($"Error during copying file {exception}", LogLevel.Error); + } } + return false; } ///