refactoring DistributedTask. replace return value from string to dynamic for indexer

This commit is contained in:
Alexey Bannov 2022-04-01 10:10:15 +03:00
parent 90623263e9
commit 2370f7bad5
14 changed files with 150 additions and 103 deletions

View File

@ -24,6 +24,8 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace ASC.Common.Threading;
[ProtoContract(IgnoreUnknownSubTypes = true)]
@ -46,7 +48,7 @@ public class DistributedTask
[ProtoMember(3)]
public DistributedTaskStatus Status { get; set; }
public Exception Exception
{
get => new Exception(_exeption);
@ -61,7 +63,7 @@ public class DistributedTask
_exeption = String.Empty;
_props = new Dictionary<string, string>();
}
public void PublishChanges()
{
if (Publication == null)
@ -72,20 +74,52 @@ public class DistributedTask
Publication(this);
}
public string this[string propName]
[Obsolete("GetProperty<T> is deprecated, please use indexer this[propName] instead.")]
public T GetProperty<T>(string propName)
{
if (!_props.TryGetValue(propName, out var propValue))
{
return default;
}
return JsonSerializer.Deserialize<T>(propValue);
}
[Obsolete("SetProperty is deprecated, please use indexer this[propName] = propValue instead.")]
public void SetProperty(string propName, object propValue)
{
_props[propName] = JsonSerializer.Serialize(propValue);
}
public dynamic this[string propName]
{
get
{
if (!_props.TryGetValue(propName, out var propValue))
{
throw new ArgumentException($"Unknown propery {propName}. You must init the property before used.");
}
if (int.TryParse(propValue, out var resultAsInt))
{
return resultAsInt;
}
if (bool.TryParse(propValue, out var resultAsBool))
{
return resultAsBool;
}
return _props[propName];
}
set
{
_props[propName] = value;
_props[propName] = Convert.ToString(value);
}
}
public override int GetHashCode()
{
return Id.GetHashCode();
return Id.GetHashCode();
}
}

View File

@ -214,11 +214,18 @@ public class DistributedTaskQueue
queueTasks = queueTasks.FindAll(x => x.Id != id);
using var ms = new MemoryStream();
if (queueTasks.Count == 0)
{
_distributedCache.Remove(_name);
}
else
{
using var ms = new MemoryStream();
Serializer.Serialize(ms, queueTasks);
Serializer.Serialize(ms, queueTasks);
_distributedCache.Set(_name, ms.ToArray());
_distributedCache.Set(_name, ms.ToArray());
}
_logger.TraceFormat("DequeueTask '{DistributedTaskId}' by instanse id '{InstanceId}'", id, InstanceId);

View File

@ -1,14 +1,6 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using ASC.Core.Common.Hosting.Interfaces;
using ASC.Common;
using ASC.Common.Logging;
using ASC.Core.Common.Hosting.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
namespace ASC.Core.Common.Hosting;

View File

@ -42,28 +42,21 @@ public class BackupProgressItem : BaseBackupProgressItem
private Dictionary<string, string> _configPaths;
private int _limit;
private readonly TenantManager _tenantManager;
private readonly BackupStorageFactory _backupStorageFactory;
private readonly BackupRepository _backupRepository;
private readonly BackupPortalTask _backupPortalTask;
private TenantManager _tenantManager;
private BackupStorageFactory _backupStorageFactory;
private BackupRepository _backupRepository;
private BackupPortalTask _backupPortalTask;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly NotifyHelper _notifyHelper;
public BackupProgressItem(
ILog logger,
TenantManager tenantManager,
BackupStorageFactory backupStorageFactory,
BackupRepository backupRepository,
BackupPortalTask backupPortalTask,
IServiceScopeFactory serviceProvider,
CoreBaseSettings coreBaseSettings,
NotifyHelper notifyHelper)
: base(logger)
: base(logger, serviceProvider)
{
_tenantManager = tenantManager;
_backupStorageFactory = backupStorageFactory;
_backupRepository = backupRepository;
_backupPortalTask = backupPortalTask;
_coreBaseSettings = coreBaseSettings;
_notifyHelper = notifyHelper;
}
@ -105,6 +98,13 @@ public class BackupProgressItem : BaseBackupProgressItem
Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
}
using var scope = _serviceScopeProvider.CreateScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_backupStorageFactory = scope.ServiceProvider.GetService<BackupStorageFactory>();
_backupRepository = scope.ServiceProvider.GetService<BackupRepository>();
_backupPortalTask = scope.ServiceProvider.GetService<BackupPortalTask>();
var dateTime = _coreBaseSettings.Standalone ? DateTime.Now : DateTime.UtcNow;
var backupName = string.Format("{0}_{1:yyyy-MM-dd_HH-mm-ss}.{2}", _tenantManager.GetTenant(TenantId).Alias, dateTime, ArchiveFormat);

View File

@ -30,14 +30,14 @@ public abstract class BaseBackupProgressItem : DistributedTaskProgress
private int? _tenantId;
private BackupProgressItemEnum? _backupProgressItemEnum;
private string _link;
public int TenantId
{
get => _tenantId ?? Convert.ToInt32(this[nameof(_tenantId)]);
get => _tenantId ?? this[nameof(_tenantId)];
set
{
_tenantId = value;
this[nameof(_tenantId)] = value.ToString();
this[nameof(_tenantId)] = value;
}
}
@ -58,21 +58,27 @@ public abstract class BaseBackupProgressItem : DistributedTaskProgress
{
get
{
return _backupProgressItemEnum ?? (BackupProgressItemEnum)Convert.ToInt32(this[(nameof(_backupProgressItemEnum))]);
return _backupProgressItemEnum ?? (BackupProgressItemEnum)this[nameof(_backupProgressItemEnum)];
}
protected set
{
_backupProgressItemEnum = value;
this[nameof(_backupProgressItemEnum)] = Convert.ToString((int)value);
this[nameof(_backupProgressItemEnum)] = (int)value;
}
}
protected ILog Logger { get; set; }
protected IServiceScopeFactory _serviceScopeProvider;
protected BaseBackupProgressItem(ILog logger)
protected BaseBackupProgressItem(ILog logger, IServiceScopeFactory serviceScopeFactory)
{
Logger = logger;
_serviceScopeProvider = serviceScopeFactory;
this[nameof(_tenantId)] = 0;
this[nameof(_link)] = "";
this[nameof(_backupProgressItemEnum)] = 0;
}
public abstract object Clone();

View File

@ -28,10 +28,10 @@ namespace ASC.Data.Backup.Services;
[Transient]
public class RestoreProgressItem : BaseBackupProgressItem
{
private readonly TenantManager _tenantManager;
private readonly BackupStorageFactory _backupStorageFactory;
private TenantManager _tenantManager;
private BackupStorageFactory _backupStorageFactory;
private readonly NotifyHelper _notifyHelper;
private readonly BackupRepository _backupRepository;
private BackupRepository _backupRepository;
private readonly RestorePortalTask _restorePortalTask;
private readonly CoreBaseSettings _coreBaseSettings;
@ -41,18 +41,15 @@ public class RestoreProgressItem : BaseBackupProgressItem
public RestoreProgressItem(
ILog logger,
TenantManager tenantManager,
BackupStorageFactory backupStorageFactory,
IServiceScopeFactory serviceScopeFactory,
NotifyHelper notifyHelper,
BackupRepository backupRepository,
CoreBaseSettings coreBaseSettings)
: base(logger)
: base(logger, serviceScopeFactory)
{
_tenantManager = tenantManager;
_backupStorageFactory = backupStorageFactory;
_notifyHelper = notifyHelper;
_coreBaseSettings = coreBaseSettings;
_backupRepository = backupRepository;
BackupProgressItemEnum = BackupProgressItemEnum.Restore;
}
@ -82,6 +79,13 @@ public class RestoreProgressItem : BaseBackupProgressItem
try
{
using var scope = _serviceScopeProvider.CreateScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_backupStorageFactory = scope.ServiceProvider.GetService<BackupStorageFactory>();
_backupRepository = scope.ServiceProvider.GetService<BackupRepository>();
tenant = _tenantManager.GetTenant(TenantId);
_tenantManager.SetCurrentTenant(tenant);
_notifyHelper.SendAboutRestoreStarted(tenant, Notify);

View File

@ -31,20 +31,17 @@ namespace ASC.Data.Backup.Services;
[Transient]
public class TransferProgressItem : BaseBackupProgressItem
{
private readonly TenantManager _tenantManager;
private TenantManager _tenantManager;
private readonly NotifyHelper _notifyHelper;
private readonly TransferPortalTask _transferPortalTask;
private TransferPortalTask _transferPortalTask;
public TransferProgressItem(
ILog logger,
TenantManager tenantManager,
NotifyHelper notifyHelper,
TransferPortalTask transferPortalTask) :
base(logger)
IServiceScopeFactory serviceScopeFactory,
NotifyHelper notifyHelper) :
base(logger, serviceScopeFactory)
{
_tenantManager = tenantManager;
_notifyHelper = notifyHelper;
_transferPortalTask = transferPortalTask;
BackupProgressItemEnum = BackupProgressItemEnum.Transfer;
}
@ -85,6 +82,11 @@ public class TransferProgressItem : BaseBackupProgressItem
try
{
using var scope = _serviceScopeProvider.CreateScope();
_tenantManager = scope.ServiceProvider.GetService<TenantManager>();
_transferPortalTask = scope.ServiceProvider.GetService<TransferPortalTask>();
_notifyHelper.SendAboutTransferStart(tenant, TargetRegion, Notify);
var transferProgressItem = _transferPortalTask;
transferProgressItem.Init(TenantId, ConfigPaths[CurrentRegion], ConfigPaths[TargetRegion], Limit, TempFolder);

View File

@ -24,6 +24,7 @@
*/
using ASC.Common.Threading;
using ASC.Data.Backup.Tasks;
namespace ASC.Data.Backup.BackgroundTasks;
@ -49,6 +50,8 @@ public class Startup : BaseStartup
DIHelper.TryAdd<RestoreProgressItem>();
DIHelper.TryAdd<TransferProgressItem>();
DIHelper.TryAdd<BackupPortalTask>();
DIHelper.TryAdd<BackupWorkerService>();
NotifyConfigurationExtension.Register(DIHelper);

View File

@ -117,8 +117,8 @@ public class ReportState
task["fileName"],
task["tmpFileName"],
task["script"],
Convert.ToInt32(task["reportType"]),
(ReportOrigin)Convert.ToInt32(task["reportOrigin"]),
task["reportType"],
(ReportOrigin)task["reportOrigin"],
null,
null,
tenantId,
@ -127,8 +127,8 @@ public class ReportState
return new ReportState(null, data, httpContextAccessor)
{
Id = task["id"],
FileId = Convert.ToInt32(task["fileId"]),
Status = (ReportStatus)Convert.ToInt32(task["status"]),
FileId = task["fileId"],
Status = (ReportStatus)task["status"],
Exception = task["exception"]
};
@ -238,10 +238,10 @@ public class ReportState
TaskInfo["id"] = Id;
TaskInfo["fileName"] = FileName;
TaskInfo["tmpFileName"] = TmpFileName;
TaskInfo["reportType"] = Convert.ToString(ReportType);
TaskInfo["fileId"] = Convert.ToString(FileId);
TaskInfo["status"] = Convert.ToString((int)Status);
TaskInfo["reportOrigin"] = Convert.ToString((int)Origin);
TaskInfo["reportType"] = ReportType;
TaskInfo["fileId"] = FileId;
TaskInfo["status"] = (int)Status;
TaskInfo["reportOrigin"] = (int)Origin;
TaskInfo["exception"] = Exception;
}
}
@ -291,7 +291,7 @@ public class DocbuilderReportsUtility
}
var result = ReportState.FromTask(task, httpContextAccessor, tenantId, userId);
var status = (ReportStatus)Convert.ToInt32(task["status"]);
var status = (ReportStatus)task["status"];
if ((int)status > 1)
{

View File

@ -114,7 +114,7 @@ class FileDownloadOperation : ComposeFileOperation<FileDownloadOperationData<str
Error = error2;
}
SuccessProcessed = Convert.ToInt32(thirdpartyTask[Process]) + Convert.ToInt32(daoTask[Process]);
SuccessProcessed = thirdpartyTask[Process] + daoTask[Process];
var progressSteps = ThirdPartyOperation.Total + DaoOperation.Total + 1;
@ -122,7 +122,7 @@ class FileDownloadOperation : ComposeFileOperation<FileDownloadOperationData<str
base.FillDistributedTask();
TaskInfo[Progress] = progress.ToString();
TaskInfo[Progress] = progress;
TaskInfo.PublishChanges();
}
}

View File

@ -60,6 +60,16 @@ public abstract class FileOperation : DistributedTask
Culture = Thread.CurrentThread.CurrentCulture.Name;
TaskInfo = new DistributedTask();
TaskInfo[Owner] = (new Guid()).ToString();
TaskInfo[OpType] = 0;
TaskInfo[Src] = "";
TaskInfo[Progress] = 0;
TaskInfo[Res] = "";
TaskInfo[Err] = "";
TaskInfo[Process] = 0;
TaskInfo[Finish] = false;
TaskInfo[Hold] = false; ;
}
public virtual DistributedTask GetDistributedTask()
@ -74,13 +84,13 @@ public abstract class FileOperation : DistributedTask
{
var progress = Total != 0 ? 100 * Processed / Total : 0;
TaskInfo[OpType] = Convert.ToString((int)OperationType);
TaskInfo[Owner] = ((IAccount)(Principal ?? Thread.CurrentPrincipal).Identity).ID.ToString();
TaskInfo[Progress] = Convert.ToString(progress < 100 ? progress : 100);
TaskInfo[Res] = Result;
TaskInfo[OpType] = (int)OperationType;
TaskInfo[Owner] = ((IAccount)(Principal ?? Thread.CurrentPrincipal).Identity).ID.ToString();
TaskInfo[Progress] = progress < 100 ? progress : 100;
TaskInfo[Res] = Result;
TaskInfo[Err] = Error;
TaskInfo[Process] = SuccessProcessed.ToString();
TaskInfo[Hold] = HoldResult.ToString();
TaskInfo[Process] = SuccessProcessed;
TaskInfo[Hold] = HoldResult;
}
public abstract Task RunJobAsync(DistributedTask _, CancellationToken cancellationToken);
@ -154,26 +164,15 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
Result = status2;
}
bool? finished1 = null;
bool? finished2 = null;
bool finished1 = thirdpartyTask[Finish];
bool finished2 = daoTask[Finish];
if (bool.TryParse(thirdpartyTask[Finish], out var fb1))
if (finished1 && finished2)
{
finished1 = fb1;
TaskInfo[Finish] = true;
}
if (bool.TryParse(daoTask[Finish], out var fb2))
{
finished2 = fb2;
}
if (finished1 != null && finished2 != null)
{
TaskInfo[Finish] = finished1.ToString();
}
SuccessProcessed = Convert.ToInt32(thirdpartyTask[Process]) + Convert.ToInt32(daoTask[Process]);
SuccessProcessed = thirdpartyTask[Process] + daoTask[Process];
base.FillDistributedTask();
@ -182,12 +181,12 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
if (ThirdPartyOperation.Total != 0)
{
progress += Convert.ToInt32(thirdpartyTask[Progress]);
progress += thirdpartyTask[Progress];
}
if (DaoOperation.Total != 0)
{
progress += Convert.ToInt32(daoTask[Progress]);
progress += daoTask[Progress];
}
if (ThirdPartyOperation.Total != 0 && DaoOperation.Total != 0)
@ -195,7 +194,7 @@ internal class ComposeFileOperation<T1, T2> : FileOperation
progress /= 2;
}
TaskInfo[Progress] = (progress < 100 ? progress : 100).ToString();
TaskInfo[Progress] = progress < 100 ? progress : 100;
TaskInfo.PublishChanges();
}
@ -304,7 +303,7 @@ abstract class FileOperation<T, TId> : FileOperation where T : FileOperationData
{
try
{
TaskInfo[Finish] = "true";
TaskInfo[Finish] = true;
PublishTaskInfo();
}
catch { /* ignore */ }

View File

@ -52,7 +52,7 @@ public class FileOperationsManager
{
foreach (var o in operations.Where(o => processlist.All(p => p.Id != o.InstanceId)))
{
o[FileOperation.Progress] = "100";
o[FileOperation.Progress] = 100;
_tasks.DequeueTask(o.Id);
}
}
@ -60,23 +60,23 @@ public class FileOperationsManager
operations = operations.Where(t => new Guid(t[FileOperation.Owner]) == userId).ToList();
foreach (var o in operations.Where(o => o.Status > DistributedTaskStatus.Running))
{
o[FileOperation.Progress] = "100";
o[FileOperation.Progress] = 100;
_tasks.DequeueTask(o.Id);
}
var results = operations
.Where(o => bool.Parse(o[FileOperation.Hold]) || Convert.ToInt32(o[FileOperation.Progress]) != 100)
.Where(o => o[FileOperation.Hold] || o[FileOperation.Progress] != 100)
.Select(o => new FileOperationResult
{
Id = o.Id,
OperationType = (FileOperationType)Convert.ToInt32(o[FileOperation.OpType]),
OperationType = (FileOperationType)o[FileOperation.OpType],
Source = o[FileOperation.Src],
Progress = Convert.ToInt32(o[FileOperation.Progress]),
Processed = o[FileOperation.Process].ToString(),
Progress = o[FileOperation.Progress],
Processed = Convert.ToString(o[FileOperation.Process]),
Result = o[FileOperation.Res],
Error = o[FileOperation.Err],
Finished = bool.Parse(o[FileOperation.Finish])
Finished = o[FileOperation.Finish]
})
.ToList();
@ -113,7 +113,7 @@ public class FileOperationsManager
{
var operations = _tasks.GetAllTasks()
.Where(t => new Guid(t[FileOperation.Owner]) == userId)
.Where(t => (FileOperationType)Convert.ToInt32(t[FileOperation.OpType]) == FileOperationType.Download);
.Where(t => (FileOperationType)t[FileOperation.OpType] == FileOperationType.Download);
if (operations.Any(o => o.Status <= DistributedTaskStatus.Running))
{

View File

@ -177,7 +177,7 @@ public class SmtpOperation
{
try
{
TaskInfo[FINISHED] = true.ToString();
TaskInfo[FINISHED] = true;
PublishTaskInfo();
_securityContext.Logout();
@ -208,8 +208,8 @@ public class SmtpOperation
protected virtual void FillDistributedTask()
{
TaskInfo[SOURCE] = Source;
TaskInfo[OWNER] = Convert.ToString(CurrentTenant);
TaskInfo[PROGRESS] = Convert.ToString(Progress < 100 ? Progress : 100);
TaskInfo[OWNER] = CurrentTenant;
TaskInfo[PROGRESS] = Progress < 100 ? Progress : 100;
TaskInfo[RESULT] = Status;
TaskInfo[ERROR] = Error;
//TaskInfo.SetProperty(PROCESSED, successProcessed);

View File

@ -65,7 +65,7 @@ namespace ASC.Web.Studio.Core.Quota
public virtual DistributedTask GetDistributedTask()
{
TaskInfo[TenantIdKey] = TenantId.ToString();
TaskInfo[TenantIdKey] = TenantId;
return TaskInfo;
}
}