diff options
author | Justin Clark-Casey (justincc) | 2012-10-20 02:02:13 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-10-20 02:02:13 +0100 |
commit | da2b23f18d232230ac4d967f8d3b256aebd4741e (patch) | |
tree | e8ca08b230cfa8d11317532b176a405cc302eeb3 /OpenSim/Region/CoreModules | |
parent | Add experimental [Groups] MessageOnlineUsersOnly option for Flotsam XmlRpc gr... (diff) | |
download | opensim-SC-da2b23f18d232230ac4d967f8d3b256aebd4741e.zip opensim-SC-da2b23f18d232230ac4d967f8d3b256aebd4741e.tar.gz opensim-SC-da2b23f18d232230ac4d967f8d3b256aebd4741e.tar.bz2 opensim-SC-da2b23f18d232230ac4d967f8d3b256aebd4741e.tar.xz |
Improve efficiency of friends notification by only make one PresenceService call for all friends rather than one for each friend.
However, large groups could still take a very long time since we still need to message each avatar on different simulators.
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 11db18a..f1903c3 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Linq; | ||
31 | using System.Reflection; | 32 | using System.Reflection; |
32 | using System.Threading; | 33 | using System.Threading; |
33 | using log4net; | 34 | using log4net; |
@@ -495,42 +496,36 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
495 | 496 | ||
496 | protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) | 497 | protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) |
497 | { | 498 | { |
498 | foreach (FriendInfo friend in friendList) | 499 | List<string> friendStringIds = friendList.ConvertAll<string>(friend => friend.Friend); |
500 | List<string> remoteFriendStringIds = new List<string>(); | ||
501 | foreach (string friendStringId in friendStringIds) | ||
499 | { | 502 | { |
500 | UUID friendID; | 503 | UUID friendUuid; |
501 | if (UUID.TryParse(friend.Friend, out friendID)) | 504 | if (UUID.TryParse(friendStringId, out friendUuid)) |
502 | { | 505 | { |
503 | // Try local | 506 | if (LocalStatusNotification(userID, friendUuid, online)) |
504 | if (LocalStatusNotification(userID, friendID, online)) | ||
505 | continue; | 507 | continue; |
506 | 508 | ||
507 | // The friend is not here [as root]. Let's forward. | 509 | remoteFriendStringIds.Add(friendStringId); |
508 | PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); | ||
509 | if (friendSessions != null && friendSessions.Length > 0) | ||
510 | { | ||
511 | PresenceInfo friendSession = null; | ||
512 | foreach (PresenceInfo pinfo in friendSessions) | ||
513 | { | ||
514 | if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad | ||
515 | { | ||
516 | friendSession = pinfo; | ||
517 | break; | ||
518 | } | ||
519 | } | ||
520 | |||
521 | if (friendSession != null) | ||
522 | { | ||
523 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | ||
524 | //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); | ||
525 | m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); | ||
526 | } | ||
527 | } | ||
528 | |||
529 | // Friend is not online. Ignore. | ||
530 | } | 510 | } |
531 | else | 511 | else |
532 | { | 512 | { |
533 | m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); | 513 | m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friendStringId); |
514 | } | ||
515 | } | ||
516 | |||
517 | // We do this regrouping so that we can efficiently send a single request rather than one for each | ||
518 | // friend in what may be a very large friends list. | ||
519 | PresenceInfo[] friendSessions = PresenceService.GetAgents(remoteFriendStringIds.ToArray()); | ||
520 | |||
521 | foreach (PresenceInfo friendSession in friendSessions) | ||
522 | { | ||
523 | // let's guard against sessions-gone-bad | ||
524 | if (friendSession.RegionID != UUID.Zero) | ||
525 | { | ||
526 | GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | ||
527 | //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); | ||
528 | m_FriendsSimConnector.StatusNotify(region, userID, friendSession.UserID, online); | ||
534 | } | 529 | } |
535 | } | 530 | } |
536 | } | 531 | } |