From df5e4a1e5b8ef0f02b6b796a1f3fd72671a81a79 Mon Sep 17 00:00:00 2001
From: Mic Bowman
Date: Wed, 29 Dec 2010 20:47:51 -0800
Subject: Standardize the way WebRequests are made in the
SimulationServiceConnector. Added debugging calls for tracking performance of
web requests.
---
.../Simulation/SimulationServiceConnector.cs | 553 +++++----------------
1 file changed, 113 insertions(+), 440 deletions(-)
(limited to 'OpenSim/Services/Connectors/Simulation')
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 4e3cfa5..4facc4a 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -75,469 +75,193 @@ namespace OpenSim.Services.Connectors.Simulation
return "agent/";
}
+ ///
+ ///
+ ///
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
{
- HttpWebRequest AgentCreateRequest = null;
- reason = String.Empty;
-
- if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
- {
- string response = GetResponse(AgentCreateRequest, out reason);
- bool success = true;
- UnpackResponse(response, out success, out reason);
- return success;
- }
-
- return false;
- }
-
-
- protected bool SendRequest(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason, out HttpWebRequest AgentCreateRequest)
- {
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start");
+
reason = String.Empty;
- AgentCreateRequest = null;
-
if (destination == null)
{
- reason = "Destination is null";
m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Given destination is null");
return false;
}
string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
-
- AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri);
- AgentCreateRequest.Method = "POST";
- AgentCreateRequest.ContentType = "application/json";
- AgentCreateRequest.Timeout = 10000;
- //AgentCreateRequest.KeepAlive = false;
- //AgentCreateRequest.Headers.Add("Authorization", authKey);
-
- // Fill it in
- OSDMap args = PackCreateAgentArguments(aCircuit, destination, flags);
- if (args == null)
- return false;
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
+
try
{
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
+ OSDMap args = aCircuit.PackAgentCircuitData();
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildCreate: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+ args["teleport_flags"] = OSD.FromString(flags.ToString());
- Stream os = null;
- try
- { // send the Post
- AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = AgentCreateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}",
- uri, destination.RegionName, destination.RegionLocX, destination.RegionLocY);
- }
- //catch (WebException ex)
- catch
- {
- //m_log.ErrorFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on ChildAgentUpdate {0}", ex.Message);
- reason = "cannot contact remote region";
+ OSDMap result = WebUtil.PostToService(uri,args);
+ if (result["Success"].AsBoolean())
+ return true;
+
+ reason = result["Message"] != null ? result["Message"].AsString() : "error";
return false;
}
- finally
- {
- if (os != null)
- os.Close();
- }
-
- return true;
- }
-
- protected string GetResponse(HttpWebRequest AgentCreateRequest, out string reason)
- {
- // Let's wait for the response
- //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
- reason = string.Empty;
-
- WebResponse webResponse = null;
- StreamReader sr = null;
- string response = string.Empty;
- try
- {
- webResponse = AgentCreateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on DoCreateChildAgentCall post");
- }
- else
- {
-
- sr = new StreamReader(webResponse.GetResponseStream());
- response = sr.ReadToEnd().Trim();
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", response);
- }
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
- reason = "Destination did not reply";
- return string.Empty;
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- return response;
- }
-
- protected void UnpackResponse(string response, out bool result, out string reason)
- {
- result = true;
- reason = string.Empty;
- if (!String.IsNullOrEmpty(response))
- {
- try
- {
- // we assume we got an OSDMap back
- OSDMap r = Util.GetOSDMap(response);
- result = r["success"].AsBoolean();
- reason = r["reason"].AsString();
- }
- catch (NullReferenceException e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
-
- // check for old style response
- if (response.ToLower().StartsWith("true"))
- result = true;
-
- result = false;
- }
- }
- }
-
- protected virtual OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion destination, uint flags)
- {
- OSDMap args = null;
- try
- {
- args = aCircuit.PackAgentCircuitData();
- }
catch (Exception e)
{
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackAgentCircuitData failed with exception: " + e.Message);
- return null;
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
+ reason = e.Message;
}
-
- // Add the input arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
- args["teleport_flags"] = OSD.FromString(flags.ToString());
-
- return args;
+
+ return false;
}
+ ///
+ /// Send complete data about an agent in this region to a neighbor
+ ///
public bool UpdateAgent(GridRegion destination, AgentData data)
{
return UpdateAgent(destination, (IAgentData)data);
}
+ ///
+ /// Send updated position information about an agent in this region to a neighbor
+ /// This operation may be called very frequently if an avatar is moving about in
+ /// the region.
+ ///
public bool UpdateAgent(GridRegion destination, AgentPosition data)
{
+ // we need a better throttle for these
+ return false;
+
return UpdateAgent(destination, (IAgentData)data);
}
+ ///
+ /// This is the worker function to send AgentData to a neighbor region
+ ///
private bool UpdateAgent(GridRegion destination, IAgentData cAgentData)
{
- // Eventually, we want to use a caps url instead of the agentID
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start");
+ // Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/";
- HttpWebRequest ChildUpdateRequest = (HttpWebRequest)WebRequest.Create(uri);
- ChildUpdateRequest.Method = "PUT";
- ChildUpdateRequest.ContentType = "application/json";
- ChildUpdateRequest.Timeout = 30000;
- //ChildUpdateRequest.KeepAlive = false;
-
- // Fill it in
- OSDMap args = null;
try
{
- args = cAgentData.Pack();
- }
- catch (Exception e)
- {
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackUpdateMessage failed with exception: " + e.Message);
- }
- // Add the input arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
- try
- {
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
-
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildUpdate: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
+ OSDMap args = cAgentData.Pack();
- Stream os = null;
- try
- { // send the Post
- ChildUpdateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = ChildUpdateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted AgentUpdate request to remote sim {0}", uri);
- }
- catch (WebException ex)
- //catch
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on AgentUpdate {0}", ex.Message);
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
- return false;
+ OSDMap result = WebUtil.PutToService(uri,args);
+ return result["Success"].AsBoolean();
}
- finally
- {
- if (os != null)
- os.Close();
- }
-
- // Let's wait for the response
- //m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after ChildAgentUpdate");
-
- WebResponse webResponse = null;
- StreamReader sr = null;
- try
- {
- webResponse = ChildUpdateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ChilAgentUpdate post");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ChilAgentUpdate from {0}: {1}", uri, ex.Message);
- // ignore, really
- }
- finally
+ catch (Exception e)
{
- if (sr != null)
- sr.Close();
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
}
- return true;
+ return false;
}
+ ///
+ /// Not sure what sequence causes this function to be invoked. The only calling
+ /// path is through the GET method
+ ///
public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
{
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start");
+
agent = null;
+
// Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
- request.Method = "GET";
- request.Timeout = 10000;
- //request.Headers.Add("authorization", ""); // coming soon
-
- HttpWebResponse webResponse = null;
- string reply = string.Empty;
- StreamReader sr = null;
try
{
- webResponse = (HttpWebResponse)request.GetResponse();
- if (webResponse == null)
+ OSDMap result = WebUtil.GetFromService(uri);
+ if (result["Success"].AsBoolean())
{
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent get ");
+ // OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
+ OSDMap args = (OSDMap)result["_Result"];
+ if (args != null)
+ {
+ agent = new CompleteAgentData();
+ agent.Unpack(args);
+ return true;
+ }
}
-
- sr = new StreamReader(webResponse.GetResponseStream());
- reply = sr.ReadToEnd().Trim();
-
-
}
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent get {0}", ex.Message);
- // ignore, really
- return false;
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- if (webResponse.StatusCode == HttpStatusCode.OK)
+ catch (Exception e)
{
- // we know it's jason
- OSDMap args = Util.GetOSDMap(reply);
- if (args == null)
- {
- return false;
- }
-
- agent = new CompleteAgentData();
- agent.Unpack(args);
- return true;
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
}
return false;
}
+ ///
+ ///
public bool QueryAccess(GridRegion destination, UUID id)
{
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start");
+
IPEndPoint ext = destination.ExternalEndPoint;
if (ext == null) return false;
+
// Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
- request.Method = "QUERYACCESS";
- request.Timeout = 10000;
- //request.Headers.Add("authorization", ""); // coming soon
-
- HttpWebResponse webResponse = null;
- string reply = string.Empty;
- StreamReader sr = null;
try
{
- webResponse = (HttpWebResponse)request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent query ");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- reply = sr.ReadToEnd().Trim();
-
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent query {0}", ex.Message);
- // ignore, really
- return false;
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"QUERYACCESS",10000);
+ return result["Success"].AsBoolean();
}
- finally
+ catch (Exception e)
{
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString());
}
-
- if (webResponse.StatusCode == HttpStatusCode.OK)
- {
- try
- {
- bool result;
-
- result = bool.Parse(reply);
-
- return result;
- }
- catch
- {
- return false;
- }
- }
-
+
return false;
}
+ ///
+ ///
public bool ReleaseAgent(UUID origin, UUID id, string uri)
{
- WebRequest request = WebRequest.Create(uri);
- request.Method = "DELETE";
- request.Timeout = 10000;
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: ReleaseAgent start");
- StreamReader sr = null;
try
{
- WebResponse webResponse = request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ReleaseAgent");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ReleaseAgent {0}", ex.Message);
- return false;
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
}
- finally
+ catch (Exception e)
{
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] ReleaseAgent failed with exception; {0}",e.ToString());
}
-
+
return true;
}
+ ///
+ ///
public bool CloseAgent(GridRegion destination, UUID id)
{
- string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start");
- WebRequest request = WebRequest.Create(uri);
- request.Method = "DELETE";
- request.Timeout = 10000;
+ string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- StreamReader sr = null;
try
{
- WebResponse webResponse = request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent delete ");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete from {0}: {1}", destination.RegionName, ex.Message);
- return false;
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
}
- finally
+ catch (Exception e)
{
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CloseAgent failed with exception; {0}",e.ToString());
}
return true;
@@ -552,97 +276,46 @@ namespace OpenSim.Services.Connectors.Simulation
return "object/";
}
+ ///
+ ///
+ ///
public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
{
- string uri
- = destination.ServerURI + ObjectPath() + sog.UUID + "/";
- //m_log.Debug(" >>> DoCreateObjectCall <<< " + uri);
-
- WebRequest ObjectCreateRequest = WebRequest.Create(uri);
- ObjectCreateRequest.Method = "POST";
- ObjectCreateRequest.ContentType = "application/json";
- ObjectCreateRequest.Timeout = 10000;
-
- OSDMap args = new OSDMap(2);
- args["sog"] = OSD.FromString(sog.ToXml2());
- args["extra"] = OSD.FromString(sog.ExtraToXmlString());
- args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
- string state = sog.GetStateSnapshot();
- if (state.Length > 0)
- args["state"] = OSD.FromString(state);
- // Add the input general arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
- try
- {
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start");
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of CreateObject: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
+ string uri = destination.ServerURI + ObjectPath() + sog.UUID + "/";
- Stream os = null;
try
- { // send the Post
- ObjectCreateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = ObjectCreateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateObject request to remote sim {0}", uri);
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on CreateObject {0}", ex.Message);
- return false;
- }
- finally
{
- if (os != null)
- os.Close();
- }
+ OSDMap args = new OSDMap(2);
- // Let's wait for the response
- //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
+ args["sog"] = OSD.FromString(sog.ToXml2());
+ args["extra"] = OSD.FromString(sog.ExtraToXmlString());
+ args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
- StreamReader sr = null;
- try
- {
- WebResponse webResponse = ObjectCreateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: Null reply on CreateObject post");
- return false;
- }
+ string state = sog.GetStateSnapshot();
+ if (state.Length > 0)
+ args["state"] = OSD.FromString(state);
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", reply);
+ // Add the input general arguments
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+ OSDMap result = WebUtil.PostToService(uri,args);
}
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of CreateObject {0}", ex.Message);
- return false;
- }
- finally
+ catch (Exception e)
{
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString());
}
return true;
}
+ ///
+ ///
+ ///
public bool CreateObject(GridRegion destination, UUID userID, UUID itemID)
{
// TODO, not that urgent
--
cgit v1.1