From 84ae7e8e12851b5fef133f72875b18d61a5b98ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 19 Aug 2022 15:32:28 +0300 Subject: [PATCH] Delay for checking latest permissions --- .../DynamicPermissionDefinitionStore.cs | 13 +++++++++---- ...DynamicPermissionDefinitionStoreInMemoryCache.cs | 2 ++ ...DynamicPermissionDefinitionStoreInMemoryCache.cs | 3 +++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs index 0e8b28d38e..2a507c2ab5 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs @@ -78,22 +78,27 @@ public class DynamicPermissionDefinitionStore : IDynamicPermissionDefinitionStor private async Task EnsureCacheIsUptoDateAsync() { - /* TODO: Optimization note: May not check for a few seconds - * It is acceptable to get changes a few seconds after the last time the cache was updated. - */ - using (await StoreCache.SyncSemaphore.LockAsync()) { + if (StoreCache.LastCheckTime.HasValue && + DateTime.Now.Subtract(StoreCache.LastCheckTime.Value).TotalSeconds < 30) + { + /* We get the latest permission with a small delay for optimization */ + return; + } + var stampInDistributedCache = await GetOrSetStampInDistributedCache(); if (stampInDistributedCache == StoreCache.CacheStamp) { + StoreCache.LastCheckTime = DateTime.Now; return; } await UpdateInMemoryStoreCache(); StoreCache.CacheStamp = stampInDistributedCache; + StoreCache.LastCheckTime = DateTime.Now; } } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs index 30818ada68..185d1c6fee 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreInMemoryCache.cs @@ -21,6 +21,8 @@ public class DynamicPermissionDefinitionStoreInMemoryCache : protected ISimpleStateCheckerSerializer StateCheckerSerializer { get; } public SemaphoreSlim SyncSemaphore { get; } = new(1, 1); + + public DateTime? LastCheckTime { get; set; } public DynamicPermissionDefinitionStoreInMemoryCache(ISimpleStateCheckerSerializer stateCheckerSerializer) { diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs index e6a1da3b79..2dab588ebd 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IDynamicPermissionDefinitionStoreInMemoryCache.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -11,6 +12,8 @@ public interface IDynamicPermissionDefinitionStoreInMemoryCache SemaphoreSlim SyncSemaphore { get; } + DateTime? LastCheckTime { get; set; } + Task FillAsync( List permissionGroupRecords, List permissionRecords);