Optimize the number of Simian calls to get the initial presence

information for the friends list. This is a pretty big performance
improvement on login. Note that you must upgrade simian to incorporate
the corresponding GetSessions call.
user_profiles
Mic Bowman 2013-04-07 17:31:44 -07:00
parent 7f070236f7
commit c7cd077e55
1 changed files with 83 additions and 110 deletions

View File

@ -137,10 +137,11 @@ namespace OpenSim.Services.Connectors.SimianGrid
userID, sessionID, secureSessionID); userID, sessionID, secureSessionID);
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "AddSession" }, { "RequestMethod", "AddSession" },
{ "UserID", userID.ToString() } { "UserID", userID.ToString() }
}; };
if (sessionID != UUID.Zero) if (sessionID != UUID.Zero)
{ {
requestArgs["SessionID"] = sessionID.ToString(); requestArgs["SessionID"] = sessionID.ToString();
@ -158,13 +159,13 @@ namespace OpenSim.Services.Connectors.SimianGrid
public bool LogoutAgent(UUID sessionID) public bool LogoutAgent(UUID sessionID)
{ {
// m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for agent with sessionID " + sessionID); // m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for agent with sessionID " + sessionID);
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "RemoveSession" }, { "RequestMethod", "RemoveSession" },
{ "SessionID", sessionID.ToString() } { "SessionID", sessionID.ToString() }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean(); bool success = response["Success"].AsBoolean();
@ -177,13 +178,13 @@ namespace OpenSim.Services.Connectors.SimianGrid
public bool LogoutRegionAgents(UUID regionID) public bool LogoutRegionAgents(UUID regionID)
{ {
// m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for all agents in region " + regionID); // m_log.InfoFormat("[SIMIAN PRESENCE CONNECTOR]: Logout requested for all agents in region " + regionID);
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "RemoveSessions" }, { "RequestMethod", "RemoveSessions" },
{ "SceneID", regionID.ToString() } { "SceneID", regionID.ToString() }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean(); bool success = response["Success"].AsBoolean();
@ -202,49 +203,46 @@ namespace OpenSim.Services.Connectors.SimianGrid
public PresenceInfo GetAgent(UUID sessionID) public PresenceInfo GetAgent(UUID sessionID)
{ {
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent with sessionID " + sessionID); OSDMap sessionResponse = GetSessionDataFromSessionID(sessionID);
if (sessionResponse == null)
NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "GetSession" }, m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session {0}: {1}",sessionID.ToString(),sessionResponse["Message"].AsString());
{ "SessionID", sessionID.ToString() } return null;
};
OSDMap sessionResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
if (sessionResponse["Success"].AsBoolean())
{
UUID userID = sessionResponse["UserID"].AsUUID();
m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID);
requestArgs = new NameValueCollection
{
{ "RequestMethod", "GetUser" },
{ "UserID", userID.ToString() }
};
OSDMap userResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
if (userResponse["Success"].AsBoolean())
return ResponseToPresenceInfo(sessionResponse, userResponse);
else
m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + userResponse["Message"].AsString());
} }
else
UUID userID = sessionResponse["UserID"].AsUUID();
OSDMap userResponse = GetUserData(userID);
if (userResponse == null)
{ {
m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session " + sessionID + ": " + sessionResponse["Message"].AsString()); m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}: {1}",userID.ToString(),userResponse["Message"].AsString());
return null;
} }
return null; return ResponseToPresenceInfo(sessionResponse);
} }
public PresenceInfo[] GetAgents(string[] userIDs) public PresenceInfo[] GetAgents(string[] userIDs)
{ {
List<PresenceInfo> presences = new List<PresenceInfo>(userIDs.Length); List<PresenceInfo> presences = new List<PresenceInfo>();
for (int i = 0; i < userIDs.Length; i++) NameValueCollection requestArgs = new NameValueCollection
{ {
UUID userID; { "RequestMethod", "GetSessions" },
if (UUID.TryParse(userIDs[i], out userID) && userID != UUID.Zero) { "UserIDList", String.Join(",",userIDs) }
presences.AddRange(GetSessions(userID)); };
OSDMap sessionListResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
if (! sessionListResponse["Success"].AsBoolean())
{
m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve sessions: {0}",sessionListResponse["Message"].AsString());
return null;
}
OSDArray sessionList = sessionListResponse["Sessions"] as OSDArray;
for (int i = 0; i < sessionList.Count; i++)
{
OSDMap sessionInfo = sessionList[i] as OSDMap;
presences.Add(ResponseToPresenceInfo(sessionInfo));
} }
return presences.ToArray(); return presences.ToArray();
@ -262,7 +260,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
public bool LoggedOut(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) public bool LoggedOut(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt)
{ {
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Logging out user " + userID); // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Logging out user " + userID);
// Remove the session to mark this user offline // Remove the session to mark this user offline
if (!LogoutAgent(sessionID)) if (!LogoutAgent(sessionID))
@ -270,11 +268,11 @@ namespace OpenSim.Services.Connectors.SimianGrid
// Save our last position as user data // Save our last position as user data
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "AddUserData" }, { "RequestMethod", "AddUserData" },
{ "UserID", userID.ToString() }, { "UserID", userID.ToString() },
{ "LastLocation", SerializeLocation(regionID, lastPosition, lastLookAt) } { "LastLocation", SerializeLocation(regionID, lastPosition, lastLookAt) }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean(); bool success = response["Success"].AsBoolean();
@ -287,14 +285,14 @@ namespace OpenSim.Services.Connectors.SimianGrid
public bool SetHome(string userID, UUID regionID, Vector3 position, Vector3 lookAt) public bool SetHome(string userID, UUID regionID, Vector3 position, Vector3 lookAt)
{ {
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Setting home location for user " + userID); // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Setting home location for user " + userID);
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "AddUserData" }, { "RequestMethod", "AddUserData" },
{ "UserID", userID.ToString() }, { "UserID", userID.ToString() },
{ "HomeLocation", SerializeLocation(regionID, position, lookAt) } { "HomeLocation", SerializeLocation(regionID, position, lookAt) }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean(); bool success = response["Success"].AsBoolean();
@ -312,23 +310,14 @@ namespace OpenSim.Services.Connectors.SimianGrid
public GridUserInfo GetGridUserInfo(string user) public GridUserInfo GetGridUserInfo(string user)
{ {
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent " + user); // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent " + user);
UUID userID = new UUID(user); UUID userID = new UUID(user);
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID); OSDMap userResponse = GetUserData(userID);
if (userResponse != null)
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod", "GetUser" },
{ "UserID", userID.ToString() }
};
OSDMap userResponse = WebUtil.PostToService(m_serverUrl, requestArgs);
if (userResponse["Success"].AsBoolean())
return ResponseToGridUserInfo(userResponse); return ResponseToGridUserInfo(userResponse);
else
m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + userResponse["Message"].AsString());
m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}: {1}",userID,userResponse["Message"].AsString());
return null; return null;
} }
@ -338,65 +327,49 @@ namespace OpenSim.Services.Connectors.SimianGrid
private OSDMap GetUserData(UUID userID) private OSDMap GetUserData(UUID userID)
{ {
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID); // m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting user data for " + userID);
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "GetUser" }, { "RequestMethod", "GetUser" },
{ "UserID", userID.ToString() } { "UserID", userID.ToString() }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
if (response["Success"].AsBoolean() && response["User"] is OSDMap) if (response["Success"].AsBoolean() && response["User"] is OSDMap)
return response; return response;
else
m_log.Warn("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for " + userID + ": " + response["Message"].AsString());
m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve user data for {0}; {1}",userID.ToString(),response["Message"].AsString());
return null; return null;
} }
private List<PresenceInfo> GetSessions(UUID userID) private OSDMap GetSessionDataFromSessionID(UUID sessionID)
{ {
List<PresenceInfo> presences = new List<PresenceInfo>(1); NameValueCollection requestArgs = new NameValueCollection
OSDMap userResponse = GetUserData(userID);
if (userResponse != null)
{
// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting sessions for " + userID);
NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "GetSession" }, { "RequestMethod", "GetSession" },
{ "UserID", userID.ToString() } { "SessionID", sessionID.ToString() }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
if (response["Success"].AsBoolean()) if (response["Success"].AsBoolean())
{ return response;
PresenceInfo presence = ResponseToPresenceInfo(response, userResponse);
if (presence != null)
presences.Add(presence);
}
// else
// {
// m_log.Debug("[SIMIAN PRESENCE CONNECTOR]: No session returned for " + userID + ": " + response["Message"].AsString());
// }
}
return presences; m_log.WarnFormat("[SIMIAN PRESENCE CONNECTOR]: Failed to retrieve session data for {0}; {1}",sessionID.ToString(),response["Message"].AsString());
return null;
} }
private bool UpdateSession(UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) private bool UpdateSession(UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt)
{ {
// Save our current location as session data // Save our current location as session data
NameValueCollection requestArgs = new NameValueCollection NameValueCollection requestArgs = new NameValueCollection
{ {
{ "RequestMethod", "UpdateSession" }, { "RequestMethod", "UpdateSession" },
{ "SessionID", sessionID.ToString() }, { "SessionID", sessionID.ToString() },
{ "SceneID", regionID.ToString() }, { "SceneID", regionID.ToString() },
{ "ScenePosition", lastPosition.ToString() }, { "ScenePosition", lastPosition.ToString() },
{ "SceneLookAt", lastLookAt.ToString() } { "SceneLookAt", lastLookAt.ToString() }
}; };
OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs);
bool success = response["Success"].AsBoolean(); bool success = response["Success"].AsBoolean();
@ -407,7 +380,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
return success; return success;
} }
private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse, OSDMap userResponse) private PresenceInfo ResponseToPresenceInfo(OSDMap sessionResponse)
{ {
if (sessionResponse == null) if (sessionResponse == null)
return null; return null;