diff options
author | Oren Hurvitz | 2014-04-21 14:57:31 +0300 |
---|---|---|
committer | Oren Hurvitz | 2014-04-21 16:56:49 +0100 |
commit | 4cac87d9f421d937422c0f9afbe1ba66c66bad17 (patch) | |
tree | 896ca286529e3b72e9c97f1ee2af3a2e6381a961 /OpenSim/Region/CoreModules/Avatar/Friends | |
parent | Better error handling when retrieving offline IMs (diff) | |
download | opensim-SC_OLD-4cac87d9f421d937422c0f9afbe1ba66c66bad17.zip opensim-SC_OLD-4cac87d9f421d937422c0f9afbe1ba66c66bad17.tar.gz opensim-SC_OLD-4cac87d9f421d937422c0f9afbe1ba66c66bad17.tar.bz2 opensim-SC_OLD-4cac87d9f421d937422c0f9afbe1ba66c66bad17.tar.xz |
Fixed: when a user logged-in, sometimes he didn't get notified of the Online status of friends, so they continued to appear Offline.
This happened because these notifications (the UDP packets) can only be sent to Root Agents. But the notifications were done in OnClientLogin(), at which point the client is still a Child Agent. Since a FireAndForget is used, it became a race condition as to whether the packets would be sent before or after the client became a Root Agent.
To fix this, we now only send the notifications once the client becomes a Root Agent for the first time.
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Friends')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 24 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs | 2 |
2 files changed, 24 insertions, 2 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index b693f2d..31bcded 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -94,6 +94,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
94 | protected Dictionary<UUID, UserFriendData> m_Friends = new Dictionary<UUID, UserFriendData>(); | 94 | protected Dictionary<UUID, UserFriendData> m_Friends = new Dictionary<UUID, UserFriendData>(); |
95 | 95 | ||
96 | /// <summary> | 96 | /// <summary> |
97 | /// Maintain a record of clients that need to notify about their online status. This only | ||
98 | /// needs to be done on login. Subsequent online/offline friend changes are sent by a different mechanism. | ||
99 | /// </summary> | ||
100 | protected HashSet<UUID> m_NeedsToNotifyStatus = new HashSet<UUID>(); | ||
101 | |||
102 | /// <summary> | ||
97 | /// Maintain a record of viewers that need to be sent notifications for friends that are online. This only | 103 | /// Maintain a record of viewers that need to be sent notifications for friends that are online. This only |
98 | /// needs to be done on login. Subsequent online/offline friend changes are sent by a different mechanism. | 104 | /// needs to be done on login. Subsequent online/offline friend changes are sent by a different mechanism. |
99 | /// </summary> | 105 | /// </summary> |
@@ -324,6 +330,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
324 | private void OnMakeRootAgent(ScenePresence sp) | 330 | private void OnMakeRootAgent(ScenePresence sp) |
325 | { | 331 | { |
326 | RecacheFriends(sp.ControllingClient); | 332 | RecacheFriends(sp.ControllingClient); |
333 | |||
334 | lock (m_NeedsToNotifyStatus) | ||
335 | { | ||
336 | if (m_NeedsToNotifyStatus.Remove(sp.UUID)) | ||
337 | { | ||
338 | // Inform the friends that this user is online. This can only be done once the client is a Root Agent. | ||
339 | StatusChange(sp.UUID, true); | ||
340 | } | ||
341 | } | ||
327 | } | 342 | } |
328 | 343 | ||
329 | private void OnClientLogin(IClientAPI client) | 344 | private void OnClientLogin(IClientAPI client) |
@@ -331,8 +346,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
331 | UUID agentID = client.AgentId; | 346 | UUID agentID = client.AgentId; |
332 | 347 | ||
333 | //m_log.DebugFormat("[XXX]: OnClientLogin!"); | 348 | //m_log.DebugFormat("[XXX]: OnClientLogin!"); |
334 | // Inform the friends that this user is online | 349 | |
335 | StatusChange(agentID, true); | 350 | // Register that we need to send this user's status to friends. This can only be done |
351 | // once the client becomes a Root Agent, because as part of sending out the presence | ||
352 | // we also get back the presence of the HG friends, and we need to send that to the | ||
353 | // client, but that can only be done when the client is a Root Agent. | ||
354 | lock (m_NeedsToNotifyStatus) | ||
355 | m_NeedsToNotifyStatus.Add(agentID); | ||
336 | 356 | ||
337 | // Register that we need to send the list of online friends to this user | 357 | // Register that we need to send the list of online friends to this user |
338 | lock (m_NeedsListOfOnlineFriends) | 358 | lock (m_NeedsListOfOnlineFriends) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index d00945e..be12935 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs | |||
@@ -239,6 +239,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
239 | fList.Add(s.Substring(0, 36)); | 239 | fList.Add(s.Substring(0, 36)); |
240 | } | 240 | } |
241 | 241 | ||
242 | // FIXME: also query the presence status of friends in other grids (like in HGStatusNotifier.Notify()) | ||
243 | |||
242 | PresenceInfo[] presence = PresenceService.GetAgents(fList.ToArray()); | 244 | PresenceInfo[] presence = PresenceService.GetAgents(fList.ToArray()); |
243 | foreach (PresenceInfo pi in presence) | 245 | foreach (PresenceInfo pi in presence) |
244 | { | 246 | { |