Browse Source

complete UOW inside the common lock to prevent conflicts.

pull/16276/head
Halil İbrahim Kalkan 4 years ago
parent
commit
ef604cbd77
  1. 59
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

59
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs

@ -28,6 +28,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpDistributedCacheOptions CacheOptions { get; } protected AbpDistributedCacheOptions CacheOptions { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; }
public StaticPermissionSaver( public StaticPermissionSaver(
IStaticPermissionDefinitionStore staticStore, IStaticPermissionDefinitionStore staticStore,
IPermissionGroupDefinitionRecordRepository permissionGroupRepository, IPermissionGroupDefinitionRecordRepository permissionGroupRepository,
@ -38,8 +40,10 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
IApplicationInfoAccessor applicationInfoAccessor, IApplicationInfoAccessor applicationInfoAccessor,
IAbpDistributedLock distributedLock, IAbpDistributedLock distributedLock,
IOptions<AbpPermissionOptions> permissionOptions, IOptions<AbpPermissionOptions> permissionOptions,
ICancellationTokenProvider cancellationTokenProvider) ICancellationTokenProvider cancellationTokenProvider,
IUnitOfWorkManager unitOfWorkManager)
{ {
UnitOfWorkManager = unitOfWorkManager;
StaticStore = staticStore; StaticStore = staticStore;
PermissionGroupRepository = permissionGroupRepository; PermissionGroupRepository = permissionGroupRepository;
PermissionRepository = permissionRepository; PermissionRepository = permissionRepository;
@ -52,8 +56,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
CacheOptions = cacheOptions.Value; CacheOptions = cacheOptions.Value;
} }
[UnitOfWork] public async Task SaveAsync()
public virtual async Task SaveAsync()
{ {
await using var applicationLockHandle = await DistributedLock.TryAcquireAsync( await using var applicationLockHandle = await DistributedLock.TryAcquireAsync(
GetApplicationDistributedLockKey() GetApplicationDistributedLockKey()
@ -99,19 +102,40 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
throw new AbpException("Could not acquire distributed lock for saving static permissions!"); throw new AbpException("Could not acquire distributed lock for saving static permissions!");
} }
var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); using (var unitOfWork = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords);
if (hasChangesInGroups ||hasChangesInPermissions)
{ {
await Cache.SetStringAsync( try
GetCommonStampCacheKey(), {
Guid.NewGuid().ToString(), var hasChangesInGroups = await UpdateChangedPermissionGroupsAsync(permissionGroupRecords);
new DistributedCacheEntryOptions { var hasChangesInPermissions = await UpdateChangedPermissionsAsync(permissionRecords);
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
}, if (hasChangesInGroups || hasChangesInPermissions)
CancellationTokenProvider.Token {
); await Cache.SetStringAsync(
GetCommonStampCacheKey(),
Guid.NewGuid().ToString(),
new DistributedCacheEntryOptions {
SlidingExpiration = TimeSpan.FromDays(30) //TODO: Make it configurable?
},
CancellationTokenProvider.Token
);
}
}
catch
{
try
{
await unitOfWork.RollbackAsync();
}
catch
{
/* ignored */
}
throw;
}
await unitOfWork.CompleteAsync();
} }
} }
@ -136,7 +160,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
foreach (var permissionGroupRecord in permissionGroupRecords) foreach (var permissionGroupRecord in permissionGroupRecords)
{ {
var permissionGroupRecordInDatabase = permissionGroupRecordsInDatabase.GetOrDefault(permissionGroupRecord.Name); var permissionGroupRecordInDatabase =
permissionGroupRecordsInDatabase.GetOrDefault(permissionGroupRecord.Name);
if (permissionGroupRecordInDatabase == null) if (permissionGroupRecordInDatabase == null)
{ {
/* New group */ /* New group */
@ -291,4 +316,4 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc
.ToString() .ToString()
.ToMd5(); .ToMd5();
} }
} }
Loading…
Cancel
Save