diff options
author | Mike Mazur | 2008-08-12 06:21:02 +0000 |
---|---|---|
committer | Mike Mazur | 2008-08-12 06:21:02 +0000 |
commit | 8ea92c0669de17f4967540ecc1350860aa346f06 (patch) | |
tree | fb3502211612e8b34e1102ba39880a2fd77f2e5c /OpenSim | |
parent | Remove "static" from the AsyncCommand Manager to make it work properly (diff) | |
download | opensim-SC-8ea92c0669de17f4967540ecc1350860aa346f06.zip opensim-SC-8ea92c0669de17f4967540ecc1350860aa346f06.tar.gz opensim-SC-8ea92c0669de17f4967540ecc1350860aa346f06.tar.bz2 opensim-SC-8ea92c0669de17f4967540ecc1350860aa346f06.tar.xz |
Thanks, lulurun, for a patch that addresses inventory problems that occur
occasionally, but are fixed on restart (issue 1919).
This patch introduces the following changes:
1. when a user teleports out of Region A, remove that user's profile
from the Region A user profile cache
2. when a user crosses between regions out of Region A, remove that
user's profile from the Region A user profile cache
3. the user profile cache's session ID member can now be set (written),
and is updated each time a connection with a new avatar is established (ie: a
new avatar enters the region)
4. when a region server looks up a user profile and a cache miss
occurs, fetch the user profile from the user server first instead of
immediately returning null
Diffstat (limited to 'OpenSim')
5 files changed, 43 insertions, 72 deletions
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index d85eda0..57f5e76 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs | |||
@@ -85,8 +85,12 @@ namespace OpenSim.Framework.Communications.Cache | |||
85 | /// </summary> | 85 | /// </summary> |
86 | private IDictionary<LLUUID, IList<InventoryFolderImpl>> pendingCategorizationFolders | 86 | private IDictionary<LLUUID, IList<InventoryFolderImpl>> pendingCategorizationFolders |
87 | = new Dictionary<LLUUID, IList<InventoryFolderImpl>>(); | 87 | = new Dictionary<LLUUID, IList<InventoryFolderImpl>>(); |
88 | 88 | ||
89 | public LLUUID SessionID { get { return m_session_id; } } | 89 | public LLUUID SessionID |
90 | { | ||
91 | get { return m_session_id; } | ||
92 | set { m_session_id = value; } | ||
93 | } | ||
90 | private LLUUID m_session_id = LLUUID.Zero; | 94 | private LLUUID m_session_id = LLUUID.Zero; |
91 | 95 | ||
92 | /// <summary> | 96 | /// <summary> |
@@ -101,21 +105,6 @@ namespace OpenSim.Framework.Communications.Cache | |||
101 | } | 105 | } |
102 | 106 | ||
103 | /// <summary> | 107 | /// <summary> |
104 | /// Constructor | ||
105 | /// </summary> | ||
106 | /// <param name="commsManager"></param> | ||
107 | /// <param name="userProfile"></param> | ||
108 | /// <param name="sessionId"> | ||
109 | /// Session id of the user. This is used in subsequent security checks. | ||
110 | /// </param> | ||
111 | public CachedUserInfo(CommunicationsManager commsManager, UserProfileData userProfile, LLUUID sessionId) | ||
112 | { | ||
113 | m_commsManager = commsManager; | ||
114 | m_userProfile = userProfile; | ||
115 | m_session_id = sessionId; | ||
116 | } | ||
117 | |||
118 | /// <summary> | ||
119 | /// This allows a request to be added to be processed once we receive a user's inventory | 108 | /// This allows a request to be added to be processed once we receive a user's inventory |
120 | /// from the inventory service. If we already have the inventory, the request | 109 | /// from the inventory service. If we already have the inventory, the request |
121 | /// is executed immediately instead. | 110 | /// is executed immediately instead. |
diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index c4a6b31..db58738 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs | |||
@@ -63,58 +63,10 @@ namespace OpenSim.Framework.Communications.Cache | |||
63 | /// A new user has moved into a region in this instance so retrieve their profile from the user service. | 63 | /// A new user has moved into a region in this instance so retrieve their profile from the user service. |
64 | /// </summary> | 64 | /// </summary> |
65 | /// <param name="userID"></param> | 65 | /// <param name="userID"></param> |
66 | public void AddNewUser(IClientAPI remoteClient) | ||
67 | { | ||
68 | m_log.DebugFormat("[USER CACHE]: Adding user profile for {0} {1}", remoteClient.Name, remoteClient.AgentId); | ||
69 | |||
70 | // Potential fix - Multithreading issue. | ||
71 | lock (m_userProfiles) | ||
72 | { | ||
73 | if (!m_userProfiles.ContainsKey(remoteClient.AgentId)) | ||
74 | { | ||
75 | UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(remoteClient.AgentId); | ||
76 | CachedUserInfo userInfo = new CachedUserInfo(m_commsManager, userProfile, remoteClient.SessionId); | ||
77 | |||
78 | if (userInfo.UserProfile != null) | ||
79 | { | ||
80 | // The inventory for the user will be populated when they actually enter the scene | ||
81 | m_userProfiles.Add(remoteClient.AgentId, userInfo); | ||
82 | } | ||
83 | else | ||
84 | { | ||
85 | m_log.ErrorFormat("[USER CACHE]: User profile for user {0} not found.", remoteClient.AgentId); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | |||
91 | /// <summary> | ||
92 | /// A new user has moved into a region in this instance so retrieve their profile from the user service. | ||
93 | /// </summary> | ||
94 | /// <param name="userID"></param> | ||
95 | public void AddNewUser(LLUUID userID) | 66 | public void AddNewUser(LLUUID userID) |
96 | { | 67 | { |
97 | m_log.DebugFormat("[USER CACHE]: Adding user profile for {0}", userID); | 68 | m_log.DebugFormat("[USER CACHE]: Adding user profile for {0}", userID); |
98 | 69 | GetUserDetails(userID); | |
99 | // Potential fix - Multithreading issue. | ||
100 | lock (m_userProfiles) | ||
101 | { | ||
102 | if (!m_userProfiles.ContainsKey(userID)) | ||
103 | { | ||
104 | UserProfileData userProfile = m_commsManager.UserService.GetUserProfile(userID); | ||
105 | CachedUserInfo userInfo = new CachedUserInfo(m_commsManager, userProfile); | ||
106 | |||
107 | if (userInfo.UserProfile != null) | ||
108 | { | ||
109 | // The inventory for the user will be populated when they actually enter the scene | ||
110 | m_userProfiles.Add(userID, userInfo); | ||
111 | } | ||
112 | else | ||
113 | { | ||
114 | m_log.ErrorFormat("[USER CACHE]: User profile for user {0} not found.", userID); | ||
115 | } | ||
116 | } | ||
117 | } | ||
118 | } | 70 | } |
119 | 71 | ||
120 | /// <summary> | 72 | /// <summary> |
@@ -176,10 +128,28 @@ namespace OpenSim.Framework.Communications.Cache | |||
176 | /// <returns>null if no user details are found</returns> | 128 | /// <returns>null if no user details are found</returns> |
177 | public CachedUserInfo GetUserDetails(LLUUID userID) | 129 | public CachedUserInfo GetUserDetails(LLUUID userID) |
178 | { | 130 | { |
179 | if (m_userProfiles.ContainsKey(userID)) | 131 | lock (m_userProfiles) |
180 | return m_userProfiles[userID]; | 132 | { |
181 | else | 133 | if (m_userProfiles.ContainsKey(userID)) |
182 | return null; | 134 | { |
135 | return m_userProfiles[userID]; | ||
136 | } | ||
137 | else | ||
138 | { | ||
139 | UserProfileData userprofile = m_commsManager.UserService.GetUserProfile(userID); | ||
140 | if (userprofile != null) | ||
141 | { | ||
142 | CachedUserInfo userinfo = new CachedUserInfo(m_commsManager, userprofile); | ||
143 | m_userProfiles.Add(userID, userinfo); | ||
144 | return userinfo; | ||
145 | } | ||
146 | else | ||
147 | { | ||
148 | m_log.ErrorFormat("[USER CACHE]: User profile for user {0} not found.", userID); | ||
149 | return null; | ||
150 | } | ||
151 | } | ||
152 | } | ||
183 | } | 153 | } |
184 | 154 | ||
185 | /// <summary> | 155 | /// <summary> |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index f39a0e6..b54713f 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -2015,7 +2015,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
2015 | "[SCENE]: Adding new {0} agent {1} {2} in {3}", | 2015 | "[SCENE]: Adding new {0} agent {1} {2} in {3}", |
2016 | (child ? "child" : "root"), client.Name, client.AgentId, RegionInfo.RegionName); | 2016 | (child ? "child" : "root"), client.Name, client.AgentId, RegionInfo.RegionName); |
2017 | 2017 | ||
2018 | CommsManager.UserProfileCacheService.AddNewUser(client); | 2018 | CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); |
2019 | 2019 | ||
2020 | CreateAndAddScenePresence(client, child); | 2020 | CreateAndAddScenePresence(client, child); |
2021 | } | 2021 | } |
@@ -2455,6 +2455,9 @@ namespace OpenSim.Region.Environment.Scenes | |||
2455 | agent.circuitcode, agent.AgentID, RegionInfo.RegionName); | 2455 | agent.circuitcode, agent.AgentID, RegionInfo.RegionName); |
2456 | 2456 | ||
2457 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); | 2457 | m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); |
2458 | // rewrite session_id | ||
2459 | CachedUserInfo userinfo = CommsManager.UserProfileCacheService.GetUserDetails(agent.AgentID); | ||
2460 | userinfo.SessionID = agent.SessionID; | ||
2458 | } | 2461 | } |
2459 | else | 2462 | else |
2460 | { | 2463 | { |
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index cb37faf..348b643 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | |||
@@ -627,6 +627,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
627 | { | 627 | { |
628 | SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList()); | 628 | SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList()); |
629 | } | 629 | } |
630 | // if (teleport success) // seems to be always success here | ||
631 | // the user may change thier profile information in other region, | ||
632 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
633 | m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID); | ||
634 | m_log.InfoFormat("User {0} is going to another region, profile cache removed", avatar.UUID); | ||
630 | } | 635 | } |
631 | else | 636 | else |
632 | { | 637 | { |
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 1721acb..5c90bf3 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs | |||
@@ -1989,6 +1989,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
1989 | 1989 | ||
1990 | m_scene.SendKillObject(m_localId); | 1990 | m_scene.SendKillObject(m_localId); |
1991 | m_scene.NotifyMyCoarseLocationChange(); | 1991 | m_scene.NotifyMyCoarseLocationChange(); |
1992 | // the user may change thier profile information in other region, | ||
1993 | // so the userinfo in UserProfileCache is not reliable any more, delete it | ||
1994 | m_scene.CommsManager.UserProfileCacheService.RemoveUser(UUID); | ||
1995 | m_log.InfoFormat("User {0} is going to another region, profile cache removed", UUID); | ||
1992 | } | 1996 | } |
1993 | else | 1997 | else |
1994 | { | 1998 | { |