Port v7@2aa0dfb2c5 - WIP

This commit is contained in:
Stephan
2018-03-20 18:21:37 +01:00
parent 8199b7710c
commit a9147f1473
31 changed files with 479 additions and 107 deletions

View File

@@ -4,6 +4,7 @@ using System.IO;
using System.Linq;
using Umbraco.Core.Composing;
using Umbraco.Core.Exceptions;
using System.Threading;
using Umbraco.Core.Logging;
namespace Umbraco.Core.IO
@@ -104,7 +105,7 @@ namespace Umbraco.Core.IO
try
{
Directory.Delete(fullPath, recursive);
WithRetry(() => Directory.Delete(fullPath, recursive));
}
catch (DirectoryNotFoundException ex)
{
@@ -221,7 +222,7 @@ namespace Umbraco.Core.IO
try
{
File.Delete(fullPath);
WithRetry(() => File.Delete(fullPath));
}
catch (FileNotFoundException ex)
{
@@ -371,7 +372,7 @@ namespace Umbraco.Core.IO
{
if (overrideIfExists == false)
throw new InvalidOperationException($"A file at path '{path}' already exists");
File.Delete(fullPath);
WithRetry(() => File.Delete(fullPath));
}
var directory = Path.GetDirectoryName(fullPath);
@@ -379,9 +380,9 @@ namespace Umbraco.Core.IO
Directory.CreateDirectory(directory); // ensure it exists
if (copy)
File.Copy(physicalPath, fullPath);
WithRetry(() => File.Copy(physicalPath, fullPath));
else
File.Move(physicalPath, fullPath);
WithRetry(() => File.Move(physicalPath, fullPath));
}
#region Helper Methods
@@ -410,6 +411,35 @@ namespace Umbraco.Core.IO
return path;
}
protected void WithRetry(Action action)
{
// 10 times 100ms is 1s
const int count = 10;
const int pausems = 100;
for (var i = 0;; i++)
{
try
{
action();
break; // done
}
catch (IOException e)
{
// if it's not *exactly* IOException then it could be
// some inherited exception such as FileNotFoundException,
// and then we don't want to retry
if (e.GetType() != typeof(IOException)) throw;
// if we have tried enough, throw, else swallow
// the exception and retry after a pause
if (i == count) throw;
}
Thread.Sleep(pausems);
}
}
#endregion
}
}