Backup: fix start

This commit is contained in:
pavelbannov 2020-06-08 11:17:54 +03:00
parent f59be0f44b
commit 5fb753b528
2 changed files with 74 additions and 69 deletions

View File

@ -1,14 +1,16 @@
using ASC.Common;
using ASC.Common.Threading.Progress;
using ASC.Data.Backup.Service;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System;
using System;
using System.Collections.Generic;
using System.IO;
using ASC.Common.Logging;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using ASC.Common;
using ASC.Common.Logging;
using ASC.Common.Threading.Progress;
using ASC.Data.Backup.Service;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace ASC.Data.Backup
{
@ -50,7 +52,7 @@ namespace ASC.Data.Backup
diHelper.AddBackupServiceLauncher();
diHelper.AddNLogManager("ASC.Data.Backup");
services.AddHostedService<BackupServiceLauncher>();
diHelper.Configure<ProgressQueue<IProgressItem>>(r =>
diHelper.Configure<ProgressQueue<BaseBackupProgressItem>>(r =>
{
r.workerCount = 1;
r.waitInterval = (int)TimeSpan.FromMinutes(5).TotalMilliseconds;

View File

@ -46,8 +46,9 @@ using ASC.Data.Backup.Tasks.Modules;
using ASC.Data.Backup.Utils;
using ASC.Data.Storage;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
namespace ASC.Data.Backup.Service
@ -55,7 +56,7 @@ namespace ASC.Data.Backup.Service
internal class BackupWorker
{
private ILog Log { get; set; }
private ProgressQueue<IProgressItem> ProgressQueue { get; set; }
private ProgressQueue<BaseBackupProgressItem> ProgressQueue { get; set; }
internal string TempFolder { get; set; }
private string CurrentRegion { get; set; }
private Dictionary<string, string> ConfigPaths { get; set; }
@ -66,15 +67,16 @@ namespace ASC.Data.Backup.Service
public BackupWorker(
IOptionsMonitor<ILog> options,
ProgressQueue<IProgressItem> progressQueue,
ProgressQueueOptionsManager<BaseBackupProgressItem> progressQueue,
BackupRepository backupRepository,
FactoryProgressItem factoryProgressItem)
{
Log = options.CurrentValue;
BackupRepository = backupRepository;
ProgressQueue = progressQueue;
ProgressQueue = progressQueue.Value;
this.factoryProgressItem = factoryProgressItem;
}
}
public void Start(BackupSettings settings)
{
TempFolder = PathHelper.ToRootedPath(settings.TempFolder);
@ -117,7 +119,7 @@ namespace ASC.Data.Backup.Service
}
if (item == null)
{
item = factoryProgressItem.CreateBackupProgressItem(request, false,TempFolder, Limit, CurrentRegion, ConfigPaths);
item = factoryProgressItem.CreateBackupProgressItem(request, false, TempFolder, Limit, CurrentRegion, ConfigPaths);
ProgressQueue.Add(item);
}
return ToBackupProgress(item);
@ -136,7 +138,7 @@ namespace ASC.Data.Backup.Service
}
if (item == null)
{
item = factoryProgressItem.CreateBackupProgressItem(schedule, false, TempFolder, Limit, CurrentRegion, ConfigPaths);
item = factoryProgressItem.CreateBackupProgressItem(schedule, false, TempFolder, Limit, CurrentRegion, ConfigPaths);
ProgressQueue.Add(item);
}
}
@ -242,26 +244,40 @@ namespace ASC.Data.Backup.Service
Error = progressItem.Error != null ? ((Exception)progressItem.Error).Message : null
};
var backupProgressItem = progressItem as BackupProgressItem;
if (backupProgressItem != null)
if (progressItem is BackupProgressItem backupProgressItem)
{
progress.Link = backupProgressItem.Link;
}
else
{
var transferProgressItem = progressItem as TransferProgressItem;
if (transferProgressItem != null)
if (progressItem is TransferProgressItem transferProgressItem)
{
progress.Link = transferProgressItem.Link;
}
}
return progress;
}
}
}
public abstract class BaseBackupProgressItem : IProgressItem
{
public object Id { get; set; }
public object Status { get; set; }
public object Error { get; set; }
public double Percentage { get; set; }
public bool IsCompleted { get; set; }
public abstract object Clone();
public abstract void RunJob();
}
}
public class BackupProgressItem : IProgressItem
public class BackupProgressItem : BaseBackupProgressItem
{
private const string ArchiveFormat = "tar.gz";
private bool IsScheduled { get; set; }
@ -272,11 +288,6 @@ namespace ASC.Data.Backup.Service
public bool BackupMail { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
public string Link { get; private set; }
public object Id { get; set; }
public object Status { get; set; }
public object Error { get; set; }
public double Percentage { get; set; }
public bool IsCompleted { get; set; }
public string TempFolder { get; set; }
private string CurrentRegion { get; set; }
private Dictionary<string, string> ConfigPaths { get; set; }
@ -284,13 +295,13 @@ namespace ASC.Data.Backup.Service
private TenantManager TenantManager { get; set; }
private BackupStorageFactory BackupStorageFactory { get; set; }
private NotifyHelper NotifyHelper { get; set; }
private BackupsContext BackupRecordContext{ get; set; }
private BackupRepository BackupRepository{ get; set; }
private CoreBaseSettings CoreBaseSettings{ get; set; }
private IOptionsMonitor<ILog> Options{ get; set; }
private StorageFactory StorageFactory{ get; set; }
private StorageFactoryConfig StorageFactoryConfig{ get; set; }
private ModuleProvider ModuleProvider{ get; set; }
private BackupsContext BackupRecordContext { get; set; }
private BackupRepository BackupRepository { get; set; }
private CoreBaseSettings CoreBaseSettings { get; set; }
private IOptionsMonitor<ILog> Options { get; set; }
private StorageFactory StorageFactory { get; set; }
private StorageFactoryConfig StorageFactoryConfig { get; set; }
private ModuleProvider ModuleProvider { get; set; }
private ILog Log { get; set; }
public BackupProgressItem(IOptionsMonitor<ILog> options, StorageFactory storageFactory, StorageFactoryConfig storageFactoryConfig, ModuleProvider moduleProvider, BackupStorageFactory backupStorageFactory, NotifyHelper notifyHelper, TenantManager tenantManager, CoreBaseSettings coreBaseSettings, BackupsContext backupRecordContext, BackupRepository backupRepository)
{
@ -337,7 +348,7 @@ namespace ASC.Data.Backup.Service
CurrentRegion = currentRegion;
ConfigPaths = configPaths;
}
public void RunJob()
public override void RunJob()
{
if (ThreadPriority.BelowNormal < Thread.CurrentThread.Priority)
{
@ -392,7 +403,7 @@ namespace ASC.Data.Backup.Service
}
catch (Exception error)
{
Log.ErrorFormat("RunJob - Params: {0}, Error = {1}", new { Id = Id, Tenant = TenantId, File = tempFile, BasePath = StorageBasePath, }, error);
Log.ErrorFormat("RunJob - Params: {0}, Error = {1}", new { Id, Tenant = TenantId, File = tempFile, BasePath = StorageBasePath, }, error);
Error = error;
IsCompleted = true;
}
@ -412,26 +423,19 @@ namespace ASC.Data.Backup.Service
}
}
public object Clone()
public override object Clone()
{
return MemberwiseClone();
}
}
public class RestoreProgressItem : IProgressItem
public class RestoreProgressItem : BaseBackupProgressItem
{
public int TenantId { get; private set; }
public BackupStorageType StorageType { get; set; }
public string StoragePath { get; set; }
public bool Notify { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
public object Id { get; set; }
public object Status { get; set; }
public object Error { get; set; }
public double Percentage { get; set; }
public bool IsCompleted { get; set; }
public string TempFolder { get; set; }
private string CurrentRegion { get; set; }
private string UpgradesPath { get; set; }
@ -451,16 +455,16 @@ namespace ASC.Data.Backup.Service
public RestoreProgressItem(
BackupStorageFactory backupStorageFactory,
IOptionsMonitor<ILog> options,
StorageFactory storageFactory,
StorageFactoryConfig storageFactoryConfig,
ModuleProvider moduleProvider,
IOptionsMonitor<ILog> options,
StorageFactory storageFactory,
StorageFactoryConfig storageFactoryConfig,
ModuleProvider moduleProvider,
CoreBaseSettings coreBaseSettings,
LicenseReader licenseReader,
AscCacheNotify ascCacheNotify,
LicenseReader licenseReader,
AscCacheNotify ascCacheNotify,
NotifyHelper notifyHelper,
TenantManager tenantManager)
{
{
BackupStorageFactory = backupStorageFactory;
Options = options;
StorageFactory = storageFactory;
@ -484,7 +488,7 @@ namespace ASC.Data.Backup.Service
UpgradesPath = upgradesPath;
CurrentRegion = currentRegion;
}
public void RunJob()
public override void RunJob()
{
Tenant tenant = null;
var tempFile = PathHelper.GetTempFileName(TempFolder);
@ -570,7 +574,7 @@ namespace ASC.Data.Backup.Service
}
}
public object Clone()
public override object Clone()
{
return MemberwiseClone();
}
@ -578,7 +582,7 @@ namespace ASC.Data.Backup.Service
}
public class TransferProgressItem : IProgressItem
public class TransferProgressItem : BaseBackupProgressItem
{
public int TenantId { get; private set; }
public string TargetRegion { get; set; }
@ -586,12 +590,6 @@ namespace ASC.Data.Backup.Service
public bool Notify { get; set; }
public string Link { get; set; }
public object Id { get; set; }
public object Status { get; set; }
public object Error { get; set; }
public double Percentage { get; set; }
public bool IsCompleted { get; set; }
public string TempFolder { get; set; }
public Dictionary<string, string> ConfigPaths { get; set; }
public IOptionsMonitor<ILog> Options { get; set; }
@ -607,7 +605,7 @@ namespace ASC.Data.Backup.Service
public ILog Log { get; set; }
public TransferProgressItem(
public TransferProgressItem(
IOptionsMonitor<ILog> options,
TenantManager tenantManager,
NotifyHelper notifyHelper,
@ -636,7 +634,7 @@ namespace ASC.Data.Backup.Service
int limit,
bool notify,
string currentRegion,
Dictionary<string, string> configPaths)
Dictionary<string, string> configPaths)
{
Id = Guid.NewGuid();
TenantId = tenantId;
@ -649,7 +647,8 @@ namespace ASC.Data.Backup.Service
Limit = limit;
}
public void RunJob()
public override void RunJob()
{
var tempFile = PathHelper.GetTempFileName(TempFolder);
var alias = TenantManager.GetTenant(TenantId).TenantAlias;
@ -691,7 +690,7 @@ namespace ASC.Data.Backup.Service
return "http://" + alias + "." + ConfigurationProvider.Open(ConfigPaths[isErrorLink ? CurrentRegion : TargetRegion]).AppSettings.Settings["core.base-domain"].Value;
}
public object Clone()
public override object Clone()
{
return MemberwiseClone();
}
@ -701,7 +700,7 @@ namespace ASC.Data.Backup.Service
{
public IServiceProvider ServiceProvider { get; set; }
public FactoryProgressItem(
public FactoryProgressItem(
IServiceProvider serviceProvider
)
{
@ -769,7 +768,11 @@ namespace ASC.Data.Backup.Service
{
services.TryAddScoped<BackupWorker>();
services.TryAddScoped<FactoryProgressItem>();
services.TryAddSingleton<ProgressQueue<IProgressItem>>();
services.TryAddSingleton<ProgressQueueOptionsManager<BaseBackupProgressItem>>();
services.TryAddSingleton<ProgressQueue<BaseBackupProgressItem>>();
services.AddSingleton<IConfigureOptions<ProgressQueue<BaseBackupProgressItem>>, ConfigureProgressQueue<BaseBackupProgressItem>>(); ;
return services
.AddTenantManagerService()
.AddCoreBaseSettingsService()