private void GetChangesFromDb() { if (Interlocked.CompareExchange(ref getchanges, 1, 0) == 0) { try { if (trustInterval == null) { trustInterval = new TrustInterval(); trustInterval.Start(DbExpiration); } if (!trustInterval.Expired) { return; } var starttime = trustInterval.StartTime; trustInterval.Start(DbExpiration); //get and merge changes in cached tenants foreach (var tenantGroup in service.GetUsers(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(u => u.Tenant)) { var users = cache.Get(USERS + tenantGroup.Key) as IDictionary <Guid, UserInfo>; if (users != null) { lock (users) { foreach (var u in tenantGroup) { users[u.ID] = u; } } } } foreach (var tenantGroup in service.GetGroups(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(g => g.Tenant)) { var groups = cache.Get(GROUPS + tenantGroup.Key) as IDictionary <Guid, Group>; if (groups != null) { lock (groups) { foreach (var g in tenantGroup) { groups[g.Id] = g; } } } } foreach (var tenantGroup in service.GetUserGroupRefs(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(r => r.Tenant)) { var refs = cache.Get(REFS + tenantGroup.Key) as IDictionary <string, UserGroupRef>; if (refs != null) { lock (refs) { foreach (var r in tenantGroup) { refs[r.CreateKey()] = r; } } } } } finally { getchanges = 0; } } }
public IEnumerable <TenantQuotaRow> FindTenantQuotaRows(TenantQuotaRowQuery query) { if (query == null) { throw new ArgumentNullException("query"); } if (Interlocked.CompareExchange(ref syncQuotaRows, 1, 0) == 0) { try { var rows = cache.Get(KEY_QUOTA_ROWS) as Dictionary <string, List <TenantQuotaRow> >; if (rows == null || interval.Expired) { var date = rows != null ? interval.StartTime : DateTime.MinValue; interval.Start(CacheExpiration); var changes = service.FindTenantQuotaRows(new TenantQuotaRowQuery(Tenant.DEFAULT_TENANT).WithLastModified(date)) .GroupBy(r => r.Tenant.ToString()) .ToDictionary(g => g.Key, g => g.ToList()); // merge changes from db to cache if (rows == null) { rows = changes; } else { foreach (var p in changes) { if (rows.ContainsKey(p.Key)) { var cachedRows = rows[p.Key]; foreach (var r in p.Value) { cachedRows.RemoveAll(c => c.Path == r.Path); cachedRows.Add(r); } } else { rows[p.Key] = p.Value; } } } cache.Insert(KEY_QUOTA_ROWS, rows, DateTime.UtcNow.Add(CacheExpiration)); } } finally { syncQuotaRows = 0; } } var quotaRows = cache.Get(KEY_QUOTA_ROWS) as IDictionary <string, List <TenantQuotaRow> >; if (quotaRows == null) { return(new TenantQuotaRow[0]); } lock (quotaRows) { var list = quotaRows.ContainsKey(query.Tenant.ToString()) ? quotaRows[query.Tenant.ToString()] : new List <TenantQuotaRow>(); if (query != null && !string.IsNullOrEmpty(query.Path)) { return(list.Where(r => query.Path == r.Path)); } return(list.ToList()); } }
private void GetChangesFromDb() { if (!TrustInterval.Expired) { return; } if (Interlocked.CompareExchange(ref getchanges, 1, 0) == 0) { try { if (!TrustInterval.Expired) { return; } var starttime = TrustInterval.StartTime; if (starttime != default) { var correction = TimeSpan.FromTicks(DbExpiration.Ticks * 3); starttime = TrustInterval.StartTime.Subtract(correction); } TrustInterval.Start(DbExpiration); //get and merge changes in cached tenants foreach (var tenantGroup in Service.GetUsers(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(u => u.Tenant)) { var users = Cache.Get <IDictionary <Guid, UserInfo> >(UserServiceCache.GetUserCacheKey(tenantGroup.Key)); if (users != null) { lock (users) { foreach (var u in tenantGroup) { users[u.ID] = u; } } } } foreach (var tenantGroup in Service.GetGroups(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(g => g.Tenant)) { var groups = Cache.Get <IDictionary <Guid, Group> >(UserServiceCache.GetGroupCacheKey(tenantGroup.Key)); if (groups != null) { lock (groups) { foreach (var g in tenantGroup) { groups[g.Id] = g; } } } } foreach (var tenantGroup in Service.GetUserGroupRefs(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(r => r.Tenant)) { var refs = Cache.Get <UserGroupRefStore>(UserServiceCache.GetRefCacheKey(tenantGroup.Key)); if (refs != null) { lock (refs) { foreach (var r in tenantGroup) { refs[r.CreateKey()] = r; } } } } } finally { Volatile.Write(ref getchanges, 0); } } }
private void GetChangesFromDb() { if (Interlocked.CompareExchange(ref getchanges, 1, 0) == 0) { try { if (trustInterval == null) { trustInterval = new TrustInterval(); trustInterval.Start(DbExpiration); } if (!trustInterval.Expired) return; var starttime = trustInterval.StartTime.AddMinutes(-1); trustInterval.Start(DbExpiration); //get and merge changes in cached tenants foreach (var tenantGroup in service.GetUsers(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(u => u.Tenant)) { var users = cache.Get(USERS + tenantGroup.Key) as IDictionary<Guid, UserInfo>; if (users != null) { lock (users) { foreach (var u in tenantGroup) { users[u.ID] = u; } } } } foreach (var tenantGroup in service.GetGroups(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(g => g.Tenant)) { var groups = cache.Get(GROUPS + tenantGroup.Key) as IDictionary<Guid, Group>; if (groups != null) { lock (groups) { foreach (var g in tenantGroup) { groups[g.Id] = g; } } } } foreach (var tenantGroup in service.GetUserGroupRefs(Tenant.DEFAULT_TENANT, starttime).Values.GroupBy(r => r.Tenant)) { var refs = cache.Get(REFS + tenantGroup.Key) as IDictionary<string, UserGroupRef>; if (refs != null) { lock (refs) { foreach (var r in tenantGroup) { refs[r.CreateKey()] = r; } } } } } finally { getchanges = 0; } } }