mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 22:26:09 +08:00
simplify groups v2 cache
This commit is contained in:
@@ -51,12 +51,12 @@ namespace OpenSim.Groups
|
||||
|
||||
public class RemoteConnectorCacheWrapper
|
||||
{
|
||||
private ForeignImporter m_ForeignImporter;
|
||||
|
||||
private Dictionary<string, bool> m_ActiveRequests = new Dictionary<string, bool>();
|
||||
private const int GROUPS_CACHE_TIMEOUT = 1 * 60; // 1 minutes
|
||||
|
||||
// This all important cache cahces objects of different types:
|
||||
private ForeignImporter m_ForeignImporter;
|
||||
private HashSet<string> m_ActiveRequests = new HashSet<string>();
|
||||
|
||||
// This all important cache caches objects of different types:
|
||||
// group-<GroupID> or group-<Name> => ExtendedGroupRecord
|
||||
// active-<AgentID> => GroupMembershipData
|
||||
// membership-<AgentID>-<GroupID> => GroupMembershipData
|
||||
@@ -68,7 +68,7 @@ namespace OpenSim.Groups
|
||||
// rolemembers-<RequestingAgentID>-<GroupID> => List<ExtendedGroupRoleMembersData>
|
||||
// notice-<noticeID> => GroupNoticeInfo
|
||||
// notices-<GroupID> => List<ExtendedGroupNoticeData>
|
||||
private ExpiringCache<string, object> m_Cache = new ExpiringCache<string, object>();
|
||||
private ExpiringCacheOS<string, object> m_Cache = new ExpiringCacheOS<string, object>(30000);
|
||||
|
||||
public RemoteConnectorCacheWrapper(IUserManagement uman)
|
||||
{
|
||||
@@ -88,13 +88,10 @@ namespace OpenSim.Groups
|
||||
return UUID.Zero;
|
||||
|
||||
if (group.GroupID != UUID.Zero)
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.Add("group-" + group.GroupID.ToString(), group, GROUPS_CACHE_TIMEOUT);
|
||||
if (m_Cache.Contains("memberships-" + RequestingAgentID.ToString()))
|
||||
m_Cache.Remove("memberships-" + RequestingAgentID.ToString());
|
||||
}
|
||||
|
||||
{
|
||||
m_Cache.AddOrUpdate("group-" + group.GroupID.ToString(), group, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.Remove("memberships-" + RequestingAgentID.ToString());
|
||||
}
|
||||
return group.GroupID;
|
||||
}
|
||||
|
||||
@@ -105,8 +102,8 @@ namespace OpenSim.Groups
|
||||
ExtendedGroupRecord group = d();
|
||||
|
||||
if (group != null && group.GroupID != UUID.Zero)
|
||||
lock (m_Cache)
|
||||
m_Cache.AddOrUpdate("group-" + group.GroupID.ToString(), group, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate("group-" + group.GroupID.ToString(), group, GROUPS_CACHE_TIMEOUT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -136,9 +133,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -180,8 +177,6 @@ namespace OpenSim.Groups
|
||||
m_Cache.AddOrUpdate("active-" + AgentID.ToString(), membership, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate("membership-" + AgentID.ToString() + "-" + GroupID.ToString(), membership, GROUPS_CACHE_TIMEOUT);
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -189,37 +184,29 @@ namespace OpenSim.Groups
|
||||
{
|
||||
d();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
string cacheKey = "active-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
string AgentIDToString = AgentID.ToString();
|
||||
string cacheKey = "active-" + AgentIDToString;
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "memberships-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
cacheKey = "memberships-" + AgentIDToString;
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "membership-" + AgentID.ToString() + "-" + GroupID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
string GroupIDToString = GroupID.ToString();
|
||||
cacheKey = "membership-" + AgentIDToString + "-" + GroupIDToString;
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "members-" + RequestingAgentID.ToString() + "-" + GroupID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
cacheKey = "members-" + RequestingAgentID.ToString() + "-" + GroupIDToString;
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "roles-" + "-" + GroupID.ToString() + "-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
}
|
||||
cacheKey = "roles-" + "-" + GroupIDToString + "-" + AgentIDToString;
|
||||
m_Cache.Remove(cacheKey);
|
||||
}
|
||||
|
||||
public void SetAgentActiveGroup(string AgentID, GroupMembershipDelegate d)
|
||||
{
|
||||
GroupMembershipData activeGroup = d();
|
||||
string cacheKey = "active-" + AgentID.ToString();
|
||||
lock (m_Cache)
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.AddOrUpdate(cacheKey, activeGroup, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate(cacheKey, activeGroup, GROUPS_CACHE_TIMEOUT);
|
||||
}
|
||||
|
||||
public ExtendedGroupMembershipData GetAgentActiveMembership(string AgentID, GroupMembershipDelegate d)
|
||||
@@ -241,9 +228,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -253,12 +240,8 @@ namespace OpenSim.Groups
|
||||
try
|
||||
{
|
||||
membership = d();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
|
||||
return (ExtendedGroupMembershipData)membership;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
|
||||
return (ExtendedGroupMembershipData)membership;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -290,9 +273,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -302,11 +285,8 @@ namespace OpenSim.Groups
|
||||
try
|
||||
{
|
||||
membership = d();
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
|
||||
return (ExtendedGroupMembershipData)membership;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
|
||||
return (ExtendedGroupMembershipData)membership;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -337,9 +317,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -349,11 +329,8 @@ namespace OpenSim.Groups
|
||||
try
|
||||
{
|
||||
memberships = d();
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupMembershipData>)memberships;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupMembershipData>)memberships;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -385,9 +362,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -403,13 +380,8 @@ namespace OpenSim.Groups
|
||||
else
|
||||
members = new List<GroupMembersData>();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
//m_Cache.AddOrUpdate(cacheKey, members, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate(cacheKey, _members, GROUPS_CACHE_TIMEOUT);
|
||||
|
||||
return (List<GroupMembersData>)members;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, _members, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupMembersData>)members;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -433,16 +405,10 @@ namespace OpenSim.Groups
|
||||
role.RoleID = roleID;
|
||||
role.Title = title;
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate("role-" + roleID.ToString(), role, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate("role-" + roleID.ToString(), role, GROUPS_CACHE_TIMEOUT);
|
||||
|
||||
// also remove this list
|
||||
if (m_Cache.Contains("roles-" + groupID.ToString()))
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
|
||||
}
|
||||
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -463,22 +429,15 @@ namespace OpenSim.Groups
|
||||
r.Powers = powers;
|
||||
r.Title = title;
|
||||
|
||||
m_Cache.Update("role-" + roleID.ToString(), r, GROUPS_CACHE_TIMEOUT);
|
||||
m_Cache.AddOrUpdate("role-" + roleID.ToString(), r, GROUPS_CACHE_TIMEOUT);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (m_Cache)
|
||||
{
|
||||
if (m_Cache.Contains("role-" + roleID.ToString()))
|
||||
m_Cache.Remove("role-" + roleID.ToString());
|
||||
|
||||
// also remove these lists, because they will have an outdated role
|
||||
if (m_Cache.Contains("roles-" + groupID.ToString()))
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
|
||||
}
|
||||
m_Cache.Remove("role-" + roleID.ToString());
|
||||
// also remove these lists, because they will have an outdated role
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -490,18 +449,11 @@ namespace OpenSim.Groups
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
if (m_Cache.Contains("role-" + roleID.ToString()))
|
||||
m_Cache.Remove("role-" + roleID.ToString());
|
||||
|
||||
m_Cache.Remove("role-" + roleID.ToString());
|
||||
// also remove the list, because it will have an removed role
|
||||
if (m_Cache.Contains("roles-" + groupID.ToString()))
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
|
||||
if (m_Cache.Contains("roles-" + groupID.ToString() + "-" + RequestingAgentID.ToString()))
|
||||
m_Cache.Remove("roles-" + groupID.ToString() + "-" + RequestingAgentID.ToString());
|
||||
|
||||
if (m_Cache.Contains("rolemembers-" + RequestingAgentID.ToString() + "-" + groupID.ToString()))
|
||||
m_Cache.Remove("rolemembers-" + RequestingAgentID.ToString() + "-" + groupID.ToString());
|
||||
m_Cache.Remove("roles-" + groupID.ToString());
|
||||
m_Cache.Remove("roles-" + groupID.ToString() + "-" + RequestingAgentID.ToString());
|
||||
m_Cache.Remove("rolemembers-" + RequestingAgentID.ToString() + "-" + groupID.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -519,9 +471,9 @@ namespace OpenSim.Groups
|
||||
return (List<GroupRolesData>)roles;
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -533,11 +485,8 @@ namespace OpenSim.Groups
|
||||
roles = d();
|
||||
if (roles != null)
|
||||
{
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupRolesData>)roles;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupRolesData>)roles;
|
||||
}
|
||||
}
|
||||
finally
|
||||
@@ -569,9 +518,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -587,16 +536,13 @@ namespace OpenSim.Groups
|
||||
else
|
||||
rmembers = new List<GroupRoleMembersData>();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
// For some strange reason, when I cache the list of GroupRoleMembersData,
|
||||
// it gets emptied out. The TryGet gets an empty list...
|
||||
//m_Cache.AddOrUpdate(cacheKey, rmembers, GROUPS_CACHE_TIMEOUT);
|
||||
// Caching the list of ExtendedGroupRoleMembersData doesn't show that issue
|
||||
// I don't get it.
|
||||
m_Cache.AddOrUpdate(cacheKey, _rmembers, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupRoleMembersData>)rmembers;
|
||||
}
|
||||
// For some strange reason, when I cache the list of GroupRoleMembersData,
|
||||
// it gets emptied out. The TryGet gets an empty list...
|
||||
//m_Cache.AddOrUpdate(cacheKey, rmembers, GROUPS_CACHE_TIMEOUT);
|
||||
// Caching the list of ExtendedGroupRoleMembersData doesn't show that issue
|
||||
// I don't get it.
|
||||
m_Cache.AddOrUpdate(cacheKey, _rmembers, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupRoleMembersData>)rmembers;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -671,12 +617,10 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
cacheKey = "roles-" + GroupID.ToString() + "-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "rolemembers-" + RequestingAgentID.ToString() + "-" + GroupID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
m_Cache.Remove(cacheKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -700,9 +644,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -712,12 +656,8 @@ namespace OpenSim.Groups
|
||||
try
|
||||
{
|
||||
roles = d();
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
|
||||
m_ActiveRequests.Remove(cacheKey);
|
||||
return (List<GroupRolesData>)roles;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<GroupRolesData>)roles;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -737,12 +677,10 @@ namespace OpenSim.Groups
|
||||
{
|
||||
// Invalidate cached info, because it has ActiveRoleID and Powers
|
||||
string cacheKey = "membership-" + AgentID.ToString() + "-" + GroupID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "memberships-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
m_Cache.Remove(cacheKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -757,8 +695,7 @@ namespace OpenSim.Groups
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "memberships-" + AgentID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
cacheKey = "active-" + AgentID.ToString();
|
||||
object m = null;
|
||||
@@ -775,14 +712,9 @@ namespace OpenSim.Groups
|
||||
{
|
||||
if (d())
|
||||
{
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate("notice-" + noticeID.ToString(), notice, GROUPS_CACHE_TIMEOUT);
|
||||
string cacheKey = "notices-" + groupID.ToString();
|
||||
if (m_Cache.Contains(cacheKey))
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
}
|
||||
m_Cache.AddOrUpdate("notice-" + noticeID.ToString(), notice, GROUPS_CACHE_TIMEOUT);
|
||||
string cacheKey = "notices-" + groupID.ToString();
|
||||
m_Cache.Remove(cacheKey);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -808,9 +740,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -821,11 +753,8 @@ namespace OpenSim.Groups
|
||||
{
|
||||
GroupNoticeInfo _notice = d();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, _notice, GROUPS_CACHE_TIMEOUT);
|
||||
return _notice;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, _notice, GROUPS_CACHE_TIMEOUT);
|
||||
return _notice;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -856,9 +785,9 @@ namespace OpenSim.Groups
|
||||
}
|
||||
|
||||
// not cached
|
||||
if (!m_ActiveRequests.ContainsKey(cacheKey))
|
||||
if (!m_ActiveRequests.Contains(cacheKey))
|
||||
{
|
||||
m_ActiveRequests.Add(cacheKey, true);
|
||||
m_ActiveRequests.Add(cacheKey);
|
||||
firstCall = true;
|
||||
}
|
||||
}
|
||||
@@ -869,11 +798,8 @@ namespace OpenSim.Groups
|
||||
{
|
||||
notices = d();
|
||||
|
||||
lock (m_Cache)
|
||||
{
|
||||
m_Cache.AddOrUpdate(cacheKey, notices, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<ExtendedGroupNoticeData>)notices;
|
||||
}
|
||||
m_Cache.AddOrUpdate(cacheKey, notices, GROUPS_CACHE_TIMEOUT);
|
||||
return (List<ExtendedGroupNoticeData>)notices;
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user