For built-in groups, if a delegate throws an exception (e.g. due to network failure), always remove its request from the m_ActiveRequests list.

If this is not done, all subsequent calls for the same data see that a request is apparantly already in progress and so wait for the result indefinitely.
inv-download
Justin Clark-Casey (justincc) 2015-02-04 17:04:59 +00:00
parent 6834393821
commit 765fd02418
1 changed files with 128 additions and 69 deletions

View File

@ -145,14 +145,20 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
//group = m_GroupsService.GetGroupRecord(RequestingAgentID, GroupID, GroupName); try
group = d(); {
//group = m_GroupsService.GetGroupRecord(RequestingAgentID, GroupID, GroupName);
lock (m_Cache) group = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, group, GROUPS_CACHE_TIMEOUT);
return (ExtendedGroupRecord)group;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, group, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (ExtendedGroupRecord)group;
} }
} }
else else
@ -244,13 +250,19 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
membership = d(); try
{
lock (m_Cache) membership = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
return (ExtendedGroupMembershipData)membership;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (ExtendedGroupMembershipData)membership;
} }
} }
else else
@ -287,12 +299,18 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
membership = d(); try
lock (m_Cache) {
membership = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
return (ExtendedGroupMembershipData)membership;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, membership, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (ExtendedGroupMembershipData)membership;
} }
} }
else else
@ -328,12 +346,18 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
memberships = d(); try
lock (m_Cache) {
memberships = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT);
return (List<GroupMembershipData>)memberships;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (List<GroupMembershipData>)memberships;
} }
} }
else else
@ -370,20 +394,26 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
List<ExtendedGroupMembersData> _members = d(); try
if (_members != null && _members.Count > 0)
members = _members.ConvertAll<GroupMembersData>(new Converter<ExtendedGroupMembersData, GroupMembersData>(m_ForeignImporter.ConvertGroupMembersData));
else
members = new List<GroupMembersData>();
lock (m_Cache)
{ {
//m_Cache.AddOrUpdate(cacheKey, members, GROUPS_CACHE_TIMEOUT); List<ExtendedGroupMembersData> _members = d();
m_Cache.AddOrUpdate(cacheKey, _members, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey);
return (List<GroupMembersData>)members; if (_members != null && _members.Count > 0)
members = _members.ConvertAll<GroupMembersData>(new Converter<ExtendedGroupMembersData, GroupMembersData>(m_ForeignImporter.ConvertGroupMembersData));
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;
}
}
finally
{
m_ActiveRequests.Remove(cacheKey);
} }
} }
else else
@ -498,16 +528,22 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
roles = d(); try
if (roles != null)
{ {
lock (m_Cache) roles = d();
if (roles != null)
{ {
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT); lock (m_Cache)
m_ActiveRequests.Remove(cacheKey); {
return (List<GroupRolesData>)roles; m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
return (List<GroupRolesData>)roles;
}
} }
} }
finally
{
m_ActiveRequests.Remove(cacheKey);
}
} }
else else
Thread.Sleep(50); Thread.Sleep(50);
@ -542,23 +578,29 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
List<ExtendedGroupRoleMembersData> _rmembers = d(); try
{
if (_rmembers != null && _rmembers.Count > 0) List<ExtendedGroupRoleMembersData> _rmembers = d();
rmembers = _rmembers.ConvertAll<GroupRoleMembersData>(new Converter<ExtendedGroupRoleMembersData, GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData));
else if (_rmembers != null && _rmembers.Count > 0)
rmembers = new List<GroupRoleMembersData>(); rmembers = _rmembers.ConvertAll<GroupRoleMembersData>(new Converter<ExtendedGroupRoleMembersData, GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData));
else
lock (m_Cache) 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;
}
}
finally
{ {
// 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);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (List<GroupRoleMembersData>)rmembers;
} }
} }
else else
@ -667,12 +709,19 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
roles = d(); try
lock (m_Cache) {
roles = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey);
return (List<GroupRolesData>)roles;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, roles, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (List<GroupRolesData>)roles;
} }
} }
else else
@ -768,13 +817,19 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
GroupNoticeInfo _notice = d(); try
{
lock (m_Cache) GroupNoticeInfo _notice = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, _notice, GROUPS_CACHE_TIMEOUT);
return _notice;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, _notice, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return _notice;
} }
} }
else else
@ -810,20 +865,24 @@ namespace OpenSim.Groups
if (firstCall) if (firstCall)
{ {
notices = d(); try
{
lock (m_Cache) notices = d();
lock (m_Cache)
{
m_Cache.AddOrUpdate(cacheKey, notices, GROUPS_CACHE_TIMEOUT);
return (List<ExtendedGroupNoticeData>)notices;
}
}
finally
{ {
m_Cache.AddOrUpdate(cacheKey, notices, GROUPS_CACHE_TIMEOUT);
m_ActiveRequests.Remove(cacheKey); m_ActiveRequests.Remove(cacheKey);
return (List<ExtendedGroupNoticeData>)notices;
} }
} }
else else
Thread.Sleep(50); Thread.Sleep(50);
} }
} }
} }
} }