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.0.7.4-extended
							parent
							
								
									9e3605d952
								
							
						
					
					
						commit
						ee4abb681e
					
				|  | @ -28,6 +28,7 @@ | ||||||
| using System; | using System; | ||||||
| using System.Collections; | using System.Collections; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using log4net; | using log4net; | ||||||
|  | @ -495,42 +496,36 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | ||||||
| 
 | 
 | ||||||
|         protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) |         protected virtual void StatusNotify(List<FriendInfo> friendList, UUID userID, bool online) | ||||||
|         { |         { | ||||||
|             foreach (FriendInfo friend in friendList) |             List<string> friendStringIds = friendList.ConvertAll<string>(friend => friend.Friend); | ||||||
|  |             List<string> remoteFriendStringIds = new List<string>(); | ||||||
|  |             foreach (string friendStringId in friendStringIds) | ||||||
|             { |             { | ||||||
|                 UUID friendID; |                 UUID friendUuid; | ||||||
|                 if (UUID.TryParse(friend.Friend, out friendID)) |                 if (UUID.TryParse(friendStringId, out friendUuid)) | ||||||
|                 { |                 { | ||||||
|                     // Try local |                     if (LocalStatusNotification(userID, friendUuid, online)) | ||||||
|                     if (LocalStatusNotification(userID, friendID, online)) |  | ||||||
|                         continue; |                         continue; | ||||||
| 
 | 
 | ||||||
|                     // The friend is not here [as root]. Let's forward. |                     remoteFriendStringIds.Add(friendStringId); | ||||||
|                     PresenceInfo[] friendSessions = PresenceService.GetAgents(new string[] { friendID.ToString() }); |  | ||||||
|                     if (friendSessions != null && friendSessions.Length > 0) |  | ||||||
|                     { |  | ||||||
|                         PresenceInfo friendSession = null; |  | ||||||
|                         foreach (PresenceInfo pinfo in friendSessions) |  | ||||||
|                         { |  | ||||||
|                             if (pinfo.RegionID != UUID.Zero) // let's guard against sessions-gone-bad |  | ||||||
|                             { |  | ||||||
|                                 friendSession = pinfo; |  | ||||||
|                                 break; |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
| 
 |  | ||||||
|                         if (friendSession != null) |  | ||||||
|                         { |  | ||||||
|                             GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); |  | ||||||
|                             //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); |  | ||||||
|                             m_FriendsSimConnector.StatusNotify(region, userID, friendID, online); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| 
 |  | ||||||
|                     // Friend is not online. Ignore. |  | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                 { |                 { | ||||||
|                     m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friend.Friend); |                     m_log.WarnFormat("[FRIENDS]: Error parsing friend ID {0}", friendStringId); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // We do this regrouping so that we can efficiently send a single request rather than one for each | ||||||
|  |             // friend in what may be a very large friends list. | ||||||
|  |             PresenceInfo[] friendSessions = PresenceService.GetAgents(remoteFriendStringIds.ToArray()); | ||||||
|  | 
 | ||||||
|  |             foreach (PresenceInfo friendSession in friendSessions) | ||||||
|  |             { | ||||||
|  |                 // let's guard against sessions-gone-bad | ||||||
|  |                 if (friendSession.RegionID != UUID.Zero) | ||||||
|  |                 { | ||||||
|  |                     GridRegion region = GridService.GetRegionByUUID(m_Scenes[0].RegionInfo.ScopeID, friendSession.RegionID); | ||||||
|  |                     //m_log.DebugFormat("[FRIENDS]: Remote Notify to region {0}", region.RegionName); | ||||||
|  |                     m_FriendsSimConnector.StatusNotify(region, userID, friendSession.UserID, online); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -128,7 +128,7 @@ namespace OpenSim.Services.Connectors.Friends | ||||||
|             return Call(region, sendData); |             return Call(region, sendData); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool StatusNotify(GridRegion region, UUID userID, UUID friendID, bool online) |         public bool StatusNotify(GridRegion region, UUID userID, string friendID, bool online) | ||||||
|         { |         { | ||||||
|             Dictionary<string, object> sendData = new Dictionary<string, object>(); |             Dictionary<string, object> sendData = new Dictionary<string, object>(); | ||||||
|             //sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); |             //sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); | ||||||
|  | @ -136,7 +136,7 @@ namespace OpenSim.Services.Connectors.Friends | ||||||
|             sendData["METHOD"] = "status"; |             sendData["METHOD"] = "status"; | ||||||
| 
 | 
 | ||||||
|             sendData["FromID"] = userID.ToString(); |             sendData["FromID"] = userID.ToString(); | ||||||
|             sendData["ToID"] = friendID.ToString(); |             sendData["ToID"] = friendID; | ||||||
|             sendData["Online"] = online.ToString(); |             sendData["Online"] = online.ToString(); | ||||||
| 
 | 
 | ||||||
|             return Call(region, sendData); |             return Call(region, sendData); | ||||||
|  |  | ||||||
|  | @ -397,7 +397,7 @@ namespace OpenSim.Services.HypergridService | ||||||
|                     if (region != null) |                     if (region != null) | ||||||
|                     { |                     { | ||||||
|                         m_log.DebugFormat("[HGFRIENDS SERVICE]: Remote Notify to region {0}, user {1} is {2}", region.RegionName, foreignUserID, (online ? "online" : "offline")); |                         m_log.DebugFormat("[HGFRIENDS SERVICE]: Remote Notify to region {0}, user {1} is {2}", region.RegionName, foreignUserID, (online ? "online" : "offline")); | ||||||
|                         m_FriendsSimConnector.StatusNotify(region, foreignUserID, userID, online); |                         m_FriendsSimConnector.StatusNotify(region, foreignUserID, userID.ToString(), online); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -436,7 +436,7 @@ namespace OpenSim.Services.HypergridService | ||||||
|                     if (region != null) |                     if (region != null) | ||||||
|                     { |                     { | ||||||
|                         m_log.DebugFormat("[USER AGENT SERVICE]: Remote Notify to region {0}, user {1} is {2}", region.RegionName, foreignUserID, (online ? "online" : "offline")); |                         m_log.DebugFormat("[USER AGENT SERVICE]: Remote Notify to region {0}, user {1} is {2}", region.RegionName, foreignUserID, (online ? "online" : "offline")); | ||||||
|                         m_FriendsSimConnector.StatusNotify(region, foreignUserID, userID, online); |                         m_FriendsSimConnector.StatusNotify(region, foreignUserID, userID.ToString(), online); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)