From df5e4a1e5b8ef0f02b6b796a1f3fd72671a81a79 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Wed, 29 Dec 2010 20:47:51 -0800 Subject: [PATCH 01/79] Standardize the way WebRequests are made in the SimulationServiceConnector. Added debugging calls for tracking performance of web requests. --- OpenSim/Framework/WebUtil.cs | 168 ++++- .../Hypergrid/GatekeeperServiceConnector.cs | 72 ++- .../Simulation/SimulationServiceConnector.cs | 573 ++++-------------- 3 files changed, 327 insertions(+), 486 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 1c856af89e..1cd90544a8 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -50,6 +50,8 @@ namespace OpenSim.Framework LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); + private static int m_requestNumber = 0; + /// /// Send LLSD to an HTTP client in application/llsd+json form /// @@ -122,13 +124,146 @@ namespace OpenSim.Framework return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } }; } + /// + /// PUT JSON-encoded data to a web service that returns LLSD or + /// JSON data + /// + public static OSDMap PutToService(string url, OSDMap data) + { + return ServiceOSDRequest(url,data,"PUT",10000); + } + + public static OSDMap PostToService(string url, OSDMap data) + { + return ServiceOSDRequest(url,data,"POST",10000); + } + + public static OSDMap GetFromService(string url) + { + return ServiceOSDRequest(url,null,"GET",10000); + } + + public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout) + { + int reqnum = m_requestNumber++; + m_log.WarnFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + + string errorMessage = "unknown error"; + int tickstart = Util.EnvironmentTickCount(); + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Method = method; + request.Timeout = timeout; + //request.KeepAlive = false; + + // If there is some input, write it into the request + if (data != null) + { + string strBuffer = OSDParser.SerializeJsonString(data); + byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); + + request.ContentType = "application/json"; + request.ContentLength = buffer.Length; //Count bytes to send + using (Stream requestStream = request.GetRequestStream()) + { + requestStream.Write(buffer, 0, strBuffer.Length); //Send it + } + } + + using (WebResponse webResponse = request.GetResponse()) + { + using (Stream responseStream = webResponse.GetResponseStream()) + { + string responseStr = null; + responseStr = responseStream.GetStreamString(); + m_log.WarnFormat("[WEB UTIL]: <{0}> response is <{1}>",reqnum,responseStr); + return CanonicalizeResults(responseStr); + } + } + } + catch (WebException we) + { + errorMessage = we.Message; + if (we.Status == WebExceptionStatus.ProtocolError) + { + HttpWebResponse webResponse = (HttpWebResponse)we.Response; + errorMessage = String.Format("[{0}] {1}",webResponse.StatusCode,webResponse.StatusDescription); + } + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + finally + { + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + if (tickdiff > 100) + m_log.WarnFormat("[WEB UTIL]: request <{0}> took {1} milliseconds",reqnum,tickdiff); + } + + m_log.WarnFormat("[WEB UTIL] <{0}> request failed: {1}",reqnum,errorMessage); + return ErrorResponseMap(errorMessage); + } + + /// + /// Since there are no consistencies in the way web requests are + /// formed, we need to do a little guessing about the result format. + /// Keys: + /// Success|success == the success fail of the request + /// _RawResult == the raw string that came back + /// _Result == the OSD unpacked string + /// + private static OSDMap CanonicalizeResults(string response) + { + OSDMap result = new OSDMap(); + + // Default values + result["Success"] = OSD.FromBoolean(true); + result["success"] = OSD.FromBoolean(true); + result["_RawResult"] = OSD.FromString(response); + result["_Result"] = new OSDMap(); + + if (response.Equals("true",System.StringComparison.OrdinalIgnoreCase)) + return result; + + if (response.Equals("false",System.StringComparison.OrdinalIgnoreCase)) + { + result["Success"] = OSD.FromBoolean(false); + result["success"] = OSD.FromBoolean(false); + return result; + } + + try + { + OSD responseOSD = OSDParser.Deserialize(response); + if (responseOSD.Type == OSDType.Map) + { + result["_Result"] = (OSDMap)responseOSD; + return result; + } + } + catch (Exception e) + { + // don't need to treat this as an error... we're just guessing anyway + m_log.DebugFormat("[WEB UTIL] couldn't decode result: <{0}>",response); + } + + return result; + } + /// /// POST URL-encoded form data to a web service that returns LLSD or /// JSON data /// public static OSDMap PostToService(string url, NameValueCollection data) { + int reqnum = m_requestNumber++; + string method = data["RequestMethod"] != null ? data["RequestMethod"] : "unknown"; + m_log.WarnFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); + string errorMessage; + int tickstart = Util.EnvironmentTickCount(); try { @@ -139,7 +274,7 @@ namespace OpenSim.Framework request.Method = "POST"; request.ContentLength = requestData.Length; request.ContentType = "application/x-www-form-urlencoded"; - + Stream requestStream = request.GetRequestStream(); requestStream.Write(requestData, 0, requestData.Length); requestStream.Close(); @@ -169,15 +304,42 @@ namespace OpenSim.Framework } } } + catch (WebException we) + { + errorMessage = we.Message; + if (we.Status == WebExceptionStatus.ProtocolError) + { + HttpWebResponse webResponse = (HttpWebResponse)we.Response; + errorMessage = String.Format("[{0}] {1}",webResponse.StatusCode,webResponse.StatusDescription); + } + } catch (Exception ex) { - m_log.Warn("POST to URL " + url + " failed: " + ex); errorMessage = ex.Message; } + finally + { + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + if (tickdiff > 100) + m_log.WarnFormat("[WEB UTIL]: request <{0}> took {1} milliseconds",reqnum,tickdiff); + } - return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } }; + m_log.WarnFormat("[WEB UTIL]: <{0}> request failed: {1}",reqnum,errorMessage); + return ErrorResponseMap(errorMessage); } + /// + /// Create a response map for an error, trying to keep + /// the result formats consistent + /// + private static OSDMap ErrorResponseMap(string msg) + { + OSDMap result = new OSDMap(); + result["Success"] = "False"; + result["Message"] = OSD.FromString("Service request failed: " + msg); + return result; + } + #region Uri /// diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index a1d9167c5a..6c69fec9a1 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -283,46 +283,52 @@ namespace OpenSim.Services.Connectors.Hypergrid public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason) { - HttpWebRequest AgentCreateRequest = null; + m_log.WarnFormat("[GATEKEEPER SERVICE CONNECTOR]: CreateAgent start"); + myipaddress = String.Empty; reason = String.Empty; - if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest)) + if (destination == null) { - string response = GetResponse(AgentCreateRequest, out reason); - bool success = true; - UnpackResponse(response, out success, out reason, out myipaddress); - return success; + m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Given destination is null"); + return false; + } + + string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/"; + + try + { + OSDMap args = aCircuit.PackAgentCircuitData(); + + 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()); + + OSDMap result = WebUtil.PostToService(uri,args); + if (result["Success"].AsBoolean()) + { + OSDMap unpacked = (OSDMap)result["_Result"]; + + if (unpacked != null) + { + reason = unpacked["reason"].AsString(); + myipaddress = unpacked["your_ip"].AsString(); + return unpacked["success"].AsBoolean(); + } + } + + reason = result["Message"] != null ? result["Message"].AsString() : "error"; + return false; + } + catch (Exception e) + { + m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString()); + reason = e.Message; } return false; } - - protected void UnpackResponse(string response, out bool result, out string reason, out string ipaddress) - { - result = true; - reason = string.Empty; - ipaddress = 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(); - ipaddress = r["your_ip"].AsString(); - } - catch (NullReferenceException e) - { - m_log.InfoFormat("[GATEKEEPER SERVICE CONNECTOR]: exception on UnpackResponse of DoCreateChildAgentCall {0}", e.Message); - reason = "Internal error"; - result = false; - } - } - } - - } } diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 4e3cfa56a8..4facc4a908 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; + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start"); + 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) - { - 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); - - } - 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. - } - - 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"; - 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; - } - // 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()); + try + { + OSDMap args = aCircuit.PackAgentCircuitData(); - return args; + 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()); + + OSDMap result = WebUtil.PostToService(uri,args); + if (result["Success"].AsBoolean()) + return true; + + reason = result["Message"] != null ? result["Message"].AsString() : "error"; + return false; + } + catch (Exception e) + { + m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString()); + reason = e.Message; + } + + 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(); + OSDMap args = cAgentData.Pack(); + + 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.PutToService(uri,args); + return result["Success"].AsBoolean(); } 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. + m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString()); } - 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); - - return false; - } - 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 - { - if (sr != null) - sr.Close(); - } - - 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) + catch (Exception e) { - 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) - { - // 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(); - - + OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"QUERYACCESS",10000); + return result["Success"].AsBoolean(); } - catch (WebException ex) + catch (Exception e) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent query {0}", ex.Message); - // ignore, really - return false; + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString()); } - finally - { - if (sr != null) - sr.Close(); - } - - 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); - + OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000); } - catch (WebException ex) + catch (Exception e) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ReleaseAgent {0}", ex.Message); - return false; + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] ReleaseAgent failed with exception; {0}",e.ToString()); } - finally - { - if (sr != null) - sr.Close(); - } - + return true; } + /// + /// public bool CloseAgent(GridRegion destination, UUID id) { + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start"); + string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/"; - WebRequest request = WebRequest.Create(uri); - request.Method = "DELETE"; - request.Timeout = 10000; - - 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); - + OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000); } - catch (WebException ex) + catch (Exception e) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete from {0}: {1}", destination.RegionName, ex.Message); - return false; - } - finally - { - 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); + m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start"); - WebRequest ObjectCreateRequest = WebRequest.Create(uri); - ObjectCreateRequest.Method = "POST"; - ObjectCreateRequest.ContentType = "application/json"; - ObjectCreateRequest.Timeout = 10000; + string uri = destination.ServerURI + ObjectPath() + sog.UUID + "/"; - 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); + 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()); + + OSDMap result = WebUtil.PostToService(uri,args); } 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. - } - - 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(); - } - - // Let's wait for the response - //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall"); - - StreamReader sr = null; - try - { - WebResponse webResponse = ObjectCreateRequest.GetResponse(); - if (webResponse == null) - { - m_log.Warn("[REMOTE SIMULATION CONNECTOR]: Null reply on CreateObject post"); - return false; - } - - sr = new StreamReader(webResponse.GetResponseStream()); - //reply = sr.ReadToEnd().Trim(); - sr.ReadToEnd().Trim(); - //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", reply); - - } - catch (WebException ex) - { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of CreateObject {0}", ex.Message); - return false; - } - finally - { - 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 From 9971766256e422aeb320827a51f041f3b732575b Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 31 Dec 2010 15:45:08 +0100 Subject: [PATCH 02/79] Implement Scope ID lookup on GetLandData. Stacked regions were not handled properly --- .../Land/LandServiceInConnectorModule.cs | 3 +- .../Land/LocalLandServiceConnector.cs | 3 +- .../Land/RemoteLandServiceConnector.cs | 7 +- .../World/Land/LandManagementModule.cs | 66 +++++++++---------- OpenSim/Server/Handlers/Land/LandHandlers.cs | 2 +- .../Connectors/Land/LandServiceConnector.cs | 4 +- .../Neighbour/NeighbourServiceConnector.cs | 2 +- OpenSim/Services/Interfaces/ILandService.cs | 2 +- 8 files changed, 46 insertions(+), 43 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs index 23251c9b1c..fcc69e949f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs @@ -37,6 +37,7 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Server.Base; using OpenSim.Server.Handlers.Base; using OpenSim.Services.Interfaces; +using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land @@ -121,7 +122,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land #region ILandService - public LandData GetLandData(ulong regionHandle, uint x, uint y, out byte regionAccess) + public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) { m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {1}", regionHandle, m_Scenes.Count); diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs index e15f624d70..86c0b85891 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs @@ -35,6 +35,7 @@ using OpenSim.Server.Base; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; +using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land { @@ -116,7 +117,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land #region ILandService - public LandData GetLandData(ulong regionHandle, uint x, uint y, out byte regionAccess) + public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) { regionAccess = 2; m_log.DebugFormat("[LAND CONNECTOR]: request for land data in {0} at {1}, {2}", diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/RemoteLandServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/RemoteLandServiceConnector.cs index 252d9e7286..766ef81ea1 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/RemoteLandServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/RemoteLandServiceConnector.cs @@ -36,6 +36,7 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Services.Interfaces; using OpenSim.Server.Base; +using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land @@ -109,13 +110,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land #region ILandService - public override LandData GetLandData(ulong regionHandle, uint x, uint y, out byte regionAccess) + public override LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) { - LandData land = m_LocalService.GetLandData(regionHandle, x, y, out regionAccess); + LandData land = m_LocalService.GetLandData(scopeID, regionHandle, x, y, out regionAccess); if (land != null) return land; - return base.GetLandData(regionHandle, x, y, out regionAccess); + return base.GetLandData(scopeID, regionHandle, x, y, out regionAccess); } #endregion ILandService diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index ac4705c222..8a309f1aca 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1510,40 +1510,40 @@ namespace OpenSim.Region.CoreModules.World.Land if (parcelID == UUID.Zero) return; - ExtendedLandData data = - (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), - delegate(string id) - { - UUID parcel = UUID.Zero; - UUID.TryParse(id, out parcel); - // assume we've got the parcelID we just computed in RemoteParcelRequest - ExtendedLandData extLandData = new ExtendedLandData(); - Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, - out extLandData.X, out extLandData.Y); - m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", - extLandData.RegionHandle, extLandData.X, extLandData.Y); + ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), + delegate(string id) + { + UUID parcel = UUID.Zero; + UUID.TryParse(id, out parcel); + // assume we've got the parcelID we just computed in RemoteParcelRequest + ExtendedLandData extLandData = new ExtendedLandData(); + Util.ParseFakeParcelID(parcel, out extLandData.RegionHandle, + out extLandData.X, out extLandData.Y); + m_log.DebugFormat("[LAND] got parcelinfo request for regionHandle {0}, x/y {1}/{2}", + extLandData.RegionHandle, extLandData.X, extLandData.Y); - // for this region or for somewhere else? - if (extLandData.RegionHandle == m_scene.RegionInfo.RegionHandle) - { - extLandData.LandData = this.GetLandObject(extLandData.X, extLandData.Y).LandData; - extLandData.RegionAccess = m_scene.RegionInfo.AccessLevel; - } - else - { - ILandService landService = m_scene.RequestModuleInterface(); - extLandData.LandData = landService.GetLandData(extLandData.RegionHandle, - extLandData.X, - extLandData.Y, - out extLandData.RegionAccess); - if (extLandData.LandData == null) - { - // we didn't find the region/land => don't cache - return null; - } - } - return extLandData; - }); + // for this region or for somewhere else? + if (extLandData.RegionHandle == m_scene.RegionInfo.RegionHandle) + { + extLandData.LandData = this.GetLandObject(extLandData.X, extLandData.Y).LandData; + extLandData.RegionAccess = m_scene.RegionInfo.AccessLevel; + } + else + { + ILandService landService = m_scene.RequestModuleInterface(); + extLandData.LandData = landService.GetLandData(m_scene.RegionInfo.ScopeID, + extLandData.RegionHandle, + extLandData.X, + extLandData.Y, + out extLandData.RegionAccess); + if (extLandData.LandData == null) + { + // we didn't find the region/land => don't cache + return null; + } + } + return extLandData; + }); if (data != null) // if we found some data, send it { diff --git a/OpenSim/Server/Handlers/Land/LandHandlers.cs b/OpenSim/Server/Handlers/Land/LandHandlers.cs index 561f285a4b..b45289a788 100644 --- a/OpenSim/Server/Handlers/Land/LandHandlers.cs +++ b/OpenSim/Server/Handlers/Land/LandHandlers.cs @@ -67,7 +67,7 @@ namespace OpenSim.Server.Handlers.Land m_log.DebugFormat("[LAND HANDLER]: Got request for land data at {0}, {1} for region {2}", x, y, regionHandle); byte regionAccess; - LandData landData = m_LocalService.GetLandData(regionHandle, x, y, out regionAccess); + LandData landData = m_LocalService.GetLandData(UUID.Zero, regionHandle, x, y, out regionAccess); Hashtable hash = new Hashtable(); if (landData != null) { diff --git a/OpenSim/Services/Connectors/Land/LandServiceConnector.cs b/OpenSim/Services/Connectors/Land/LandServiceConnector.cs index 4b25ac819a..252f7a1d16 100644 --- a/OpenSim/Services/Connectors/Land/LandServiceConnector.cs +++ b/OpenSim/Services/Connectors/Land/LandServiceConnector.cs @@ -64,7 +64,7 @@ namespace OpenSim.Services.Connectors m_GridService = gridServices; } - public virtual LandData GetLandData(ulong regionHandle, uint x, uint y, out byte regionAccess) + public virtual LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) { LandData landData = null; Hashtable hash = new Hashtable(); @@ -80,7 +80,7 @@ namespace OpenSim.Services.Connectors { uint xpos = 0, ypos = 0; Utils.LongToUInts(regionHandle, out xpos, out ypos); - GridRegion info = m_GridService.GetRegionByPosition(UUID.Zero, (int)xpos, (int)ypos); + GridRegion info = m_GridService.GetRegionByPosition(scopeID, (int)xpos, (int)ypos); if (info != null) // just to be sure { XmlRpcRequest request = new XmlRpcRequest("land_data", paramList); diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs index 93da10eeab..9e444c49bc 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServiceConnector.cs @@ -71,7 +71,7 @@ namespace OpenSim.Services.Connectors { uint x = 0, y = 0; Utils.LongToUInts(regionHandle, out x, out y); - GridRegion regInfo = m_GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + GridRegion regInfo = m_GridService.GetRegionByPosition(thisRegion.ScopeID, (int)x, (int)y); if ((regInfo != null) && // Don't remote-call this instance; that's a startup hickup !((regInfo.ExternalHostName == thisRegion.ExternalHostName) && (regInfo.HttpPort == thisRegion.HttpPort))) diff --git a/OpenSim/Services/Interfaces/ILandService.cs b/OpenSim/Services/Interfaces/ILandService.cs index 7a12aff951..63d9a271c3 100644 --- a/OpenSim/Services/Interfaces/ILandService.cs +++ b/OpenSim/Services/Interfaces/ILandService.cs @@ -33,6 +33,6 @@ namespace OpenSim.Services.Interfaces { public interface ILandService { - LandData GetLandData(ulong regionHandle, uint x, uint y, out byte regionAccess); + LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess); } } From c48ddbfef162c758bd4759d4100f8d3e081b37a7 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 31 Dec 2010 15:53:31 +0100 Subject: [PATCH 03/79] Fix scoping for prim region crossings --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 +- OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a3251aae58..e5cefe4e92 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1515,7 +1515,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // If we fail to cross the border, then reset the position of the scene object on that border. uint x = 0, y = 0; Utils.LongToUInts(newRegionHandle, out x, out y); - GridRegion destination = scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) { grp.OffsetForNewRegion(oldGroupPosition); diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 8a309f1aca..4f8e2059e5 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1557,7 +1557,7 @@ namespace OpenSim.Region.CoreModules.World.Land // most likely still cached from building the extLandData entry uint x = 0, y = 0; Utils.LongToUInts(data.RegionHandle, out x, out y); - info = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + info = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y); } // we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark. m_log.DebugFormat("[LAND] got parcelinfo for parcel {0} in region {1}; sending...", From e1664b8d3812c20bb83f465583ffd153dafc98cd Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 3 Jan 2011 19:42:26 +0000 Subject: [PATCH 04/79] Fix child agent scoping --- .../Region/Framework/Scenes/SceneCommunicationService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 88e084eecd..69ebe9efde 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -193,7 +193,7 @@ namespace OpenSim.Region.Framework.Scenes } } - public delegate void SendChildAgentDataUpdateDelegate(AgentPosition cAgentData, ulong regionHandle); + public delegate void SendChildAgentDataUpdateDelegate(AgentPosition cAgentData, UUID scopeID, ulong regionHandle); /// /// This informs all neighboring regions about the settings of it's child agent. @@ -202,7 +202,7 @@ namespace OpenSim.Region.Framework.Scenes /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc. /// /// - private void SendChildAgentDataUpdateAsync(AgentPosition cAgentData, ulong regionHandle) + private void SendChildAgentDataUpdateAsync(AgentPosition cAgentData, UUID scopeID, ulong regionHandle) { //m_log.Info("[INTERGRID]: Informing neighbors about my agent in " + m_regionInfo.RegionName); try @@ -245,7 +245,7 @@ namespace OpenSim.Region.Framework.Scenes if (regionHandle != m_regionInfo.RegionHandle) { SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync; - d.BeginInvoke(cAgentData, regionHandle, + d.BeginInvoke(cAgentData, m_regionInfo.ScopeID, regionHandle, SendChildAgentDataUpdateCompleted, d); } @@ -273,7 +273,7 @@ namespace OpenSim.Region.Framework.Scenes //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); uint x = 0, y = 0; Utils.LongToUInts(regionHandle, out x, out y); - GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y); + GridRegion destination = m_scene.GridService.GetRegionByPosition(m_regionInfo.ScopeID, (int)x, (int)y); m_scene.SimulationService.CloseAgent(destination, agentID); } From 07cc032081e10495bcaa6c586fe7de3b1cf55916 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 2 Jan 2011 01:29:22 +0100 Subject: [PATCH 05/79] Allow cross-scope friendships to work, and also allow other cross scope name resolution --- OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 2 +- .../Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs | 2 +- .../Framework/UserManagement/UserManagementModule.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index b3f0a2516a..4d74b2a0a0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -489,7 +489,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends im.imSessionID = im.fromAgentID; // Try the local sim - UserAccount account = UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, agentID); + UserAccount account = UserAccountService.GetUserAccount(UUID.Zero, agentID); im.fromAgentName = (account == null) ? "Unknown" : account.FirstName + " " + account.LastName; if (LocalFriendshipOffered(friendID, im)) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs index 496f2abdfb..1b53a42dec 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsRequestHandler.cs @@ -116,7 +116,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (!UUID.TryParse(request["ToID"].ToString(), out toID)) return FailureResult(); - UserAccount account = m_FriendsModule.UserAccountService.GetUserAccount(m_FriendsModule.Scene.RegionInfo.ScopeID, fromID); + UserAccount account = m_FriendsModule.UserAccountService.GetUserAccount(UUID.Zero, fromID); string name = (account == null) ? "Unknown" : account.FirstName + " " + account.LastName; GridInstantMessage im = new GridInstantMessage(m_FriendsModule.Scene, fromID, name, toID, diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index bf84100ef5..4cc6905a0f 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -183,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement return returnstring; } - UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, uuid); + UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(UUID.Zero, uuid); if (account != null) { From 528619865073dae262487de9142f859b0bdf256d Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 3 Jan 2011 19:56:56 +0100 Subject: [PATCH 06/79] Add permissions hooks for object transfers --- .../Framework/Scenes/Scene.Permissions.cs | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index 66439ab29d..e1fedf4bd0 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -43,6 +43,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool PropagatePermissionsHandler(); public delegate bool RezObjectHandler(int objectCount, UUID owner, Vector3 objectPosition, Scene scene); public delegate bool DeleteObjectHandler(UUID objectID, UUID deleter, Scene scene); + public delegate bool TransferObjectHandler(UUID objectID, UUID recipient, Scene scene); public delegate bool TakeObjectHandler(UUID objectID, UUID stealer, Scene scene); public delegate bool TakeCopyObjectHandler(UUID objectID, UUID userID, Scene inScene); public delegate bool DuplicateObjectHandler(int objectCount, UUID objectID, UUID owner, Scene scene, Vector3 objectPosition); @@ -80,10 +81,12 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool CreateObjectInventoryHandler(int invType, UUID objectID, UUID userID); public delegate bool CopyObjectInventoryHandler(UUID itemID, UUID objectID, UUID userID); public delegate bool DeleteObjectInventoryHandler(UUID itemID, UUID objectID, UUID userID); + public delegate bool TransferObjectInventoryHandler(UUID itemID, UUID objectID, UUID userID); public delegate bool CreateUserInventoryHandler(int invType, UUID userID); public delegate bool EditUserInventoryHandler(UUID itemID, UUID userID); public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID); public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID); + public delegate bool TransferUserInventoryHandler(UUID itemID, UUID userID, UUID recipientID); public delegate bool TeleportHandler(UUID userID, Scene scene); public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); public delegate bool InteractWithPrimMediaHandler(UUID userID, UUID primID, int face); @@ -107,6 +110,7 @@ namespace OpenSim.Region.Framework.Scenes public event PropagatePermissionsHandler OnPropagatePermissions; public event RezObjectHandler OnRezObject; public event DeleteObjectHandler OnDeleteObject; + public event TransferObjectHandler OnTransferObject; public event TakeObjectHandler OnTakeObject; public event TakeCopyObjectHandler OnTakeCopyObject; public event DuplicateObjectHandler OnDuplicateObject; @@ -144,10 +148,12 @@ namespace OpenSim.Region.Framework.Scenes public event CreateObjectInventoryHandler OnCreateObjectInventory; public event CopyObjectInventoryHandler OnCopyObjectInventory; public event DeleteObjectInventoryHandler OnDeleteObjectInventory; + public event TransferObjectInventoryHandler OnTransferObjectInventory; public event CreateUserInventoryHandler OnCreateUserInventory; public event EditUserInventoryHandler OnEditUserInventory; public event CopyUserInventoryHandler OnCopyUserInventory; public event DeleteUserInventoryHandler OnDeleteUserInventory; + public event TransferUserInventoryHandler OnTransferUserInventory; public event TeleportHandler OnTeleport; public event ControlPrimMediaHandler OnControlPrimMedia; public event InteractWithPrimMediaHandler OnInteractWithPrimMedia; @@ -264,10 +270,27 @@ namespace OpenSim.Region.Framework.Scenes } } -// m_log.DebugFormat( -// "[SCENE PERMISSIONS]: CanDeleteObject() fired for object {0}, deleter {1}, result {2}", -// objectID, deleter, result); - + return result; + } + + public bool CanTransferObject(UUID objectID, UUID recipient) + { + bool result = true; + + TransferObjectHandler handler = OnTransferObject; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (TransferObjectHandler h in list) + { + if (h(objectID, recipient, m_scene) == false) + { + result = false; + break; + } + } + } + return result; } @@ -917,6 +940,21 @@ namespace OpenSim.Region.Framework.Scenes return true; } + public bool CanTransferObjectInventory(UUID itemID, UUID objectID, UUID userID) + { + TransferObjectInventoryHandler handler = OnTransferObjectInventory; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (TransferObjectInventoryHandler h in list) + { + if (h(itemID, objectID, userID) == false) + return false; + } + } + return true; + } + /// /// Check whether the specified user is allowed to create the given inventory type in their inventory. /// @@ -1001,6 +1039,21 @@ namespace OpenSim.Region.Framework.Scenes return true; } + public bool CanTransferUserInventory(UUID itemID, UUID userID, UUID recipientID) + { + TransferUserInventoryHandler handler = OnTransferUserInventory; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (TransferUserInventoryHandler h in list) + { + if (h(itemID, userID, recipientID) == false) + return false; + } + } + return true; + } + public bool CanTeleport(UUID userID) { TeleportHandler handler = OnTeleport; From e0da281e3d70fbe1752815f5a7ae4b3ed0cf15ba Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Mon, 3 Jan 2011 17:16:22 -0800 Subject: [PATCH 07/79] Cleaned up debugging messages in the WebRequest handlers --- OpenSim/Framework/WebUtil.cs | 13 ++++++++----- .../Hypergrid/GatekeeperServiceConnector.cs | 2 +- .../Simulation/SimulationServiceConnector.cs | 14 +++++++------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 1cd90544a8..a00ea88bf9 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -146,7 +146,7 @@ namespace OpenSim.Framework public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout) { int reqnum = m_requestNumber++; - m_log.WarnFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); string errorMessage = "unknown error"; int tickstart = Util.EnvironmentTickCount(); @@ -177,7 +177,7 @@ namespace OpenSim.Framework { string responseStr = null; responseStr = responseStream.GetStreamString(); - m_log.WarnFormat("[WEB UTIL]: <{0}> response is <{1}>",reqnum,responseStr); + // m_log.DebugFormat("[WEB UTIL]: <{0}> response is <{1}>",reqnum,responseStr); return CanonicalizeResults(responseStr); } } @@ -197,9 +197,11 @@ namespace OpenSim.Framework } finally { + // This just dumps a warning for any operation that takes more than 100 ms int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > 100) - m_log.WarnFormat("[WEB UTIL]: request <{0}> took {1} milliseconds",reqnum,tickdiff); + m_log.WarnFormat("[WEB UTIL]: request <{0}> (URI:{1}, METHOD:{2}) took {3} milliseconds", + reqnum,url,method,tickdiff); } m_log.WarnFormat("[WEB UTIL] <{0}> request failed: {1}",reqnum,errorMessage); @@ -260,7 +262,7 @@ namespace OpenSim.Framework { int reqnum = m_requestNumber++; string method = data["RequestMethod"] != null ? data["RequestMethod"] : "unknown"; - m_log.WarnFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); + m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); string errorMessage; int tickstart = Util.EnvironmentTickCount(); @@ -321,7 +323,8 @@ namespace OpenSim.Framework { int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > 100) - m_log.WarnFormat("[WEB UTIL]: request <{0}> took {1} milliseconds",reqnum,tickdiff); + m_log.WarnFormat("[WEB UTIL]: request <{0}> (URI:{1}, METHOD:{2}) took {3} milliseconds", + reqnum,url,method,tickdiff); } m_log.WarnFormat("[WEB UTIL]: <{0}> request failed: {1}",reqnum,errorMessage); diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index 6c69fec9a1..1aa3282dac 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -283,7 +283,7 @@ namespace OpenSim.Services.Connectors.Hypergrid public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason) { - m_log.WarnFormat("[GATEKEEPER SERVICE CONNECTOR]: CreateAgent start"); + // m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: CreateAgent start"); myipaddress = String.Empty; reason = String.Empty; diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 4facc4a908..b183364b51 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -80,7 +80,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start"); reason = String.Empty; if (destination == null) @@ -143,7 +143,7 @@ namespace OpenSim.Services.Connectors.Simulation /// private bool UpdateAgent(GridRegion destination, IAgentData cAgentData) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start"); // Eventually, we want to use a caps url instead of the agentID string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/"; @@ -174,7 +174,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start"); agent = null; @@ -208,7 +208,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool QueryAccess(GridRegion destination, UUID id) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start"); IPEndPoint ext = destination.ExternalEndPoint; if (ext == null) return false; @@ -233,7 +233,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool ReleaseAgent(UUID origin, UUID id, string uri) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: ReleaseAgent start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ReleaseAgent start"); try { @@ -251,7 +251,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool CloseAgent(GridRegion destination, UUID id) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start"); string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/"; @@ -281,7 +281,7 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall) { - m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start"); + // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start"); string uri = destination.ServerURI + ObjectPath() + sog.UUID + "/"; From 6a5d52b4c8493b93ddf93e6af7a8a7ea98b3863f Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Tue, 4 Jan 2011 09:12:32 -0800 Subject: [PATCH 08/79] removed the early return on agentupdates, this was debugging code --- .../Connectors/Simulation/SimulationServiceConnector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index b183364b51..f34c2bd59f 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -133,7 +133,7 @@ namespace OpenSim.Services.Connectors.Simulation public bool UpdateAgent(GridRegion destination, AgentPosition data) { // we need a better throttle for these - return false; + // return false; return UpdateAgent(destination, (IAgentData)data); } From db558591259587bbf79c2358350385e0bbb5d286 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 4 Jan 2011 11:30:08 -0800 Subject: [PATCH 09/79] Guard against null Animator. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 46234f9666..0648c586f6 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2499,7 +2499,8 @@ namespace OpenSim.Region.Framework.Scenes // m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); avatar.ControllingClient.SendAvatarDataImmediate(this); - Animator.SendAnimPackToClient(avatar.ControllingClient); + if (Animation != null) + Animator.SendAnimPackToClient(avatar.ControllingClient); } /// From fbde9b1136e831542869e42995466dc5df101ee5 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 4 Jan 2011 11:33:15 -0800 Subject: [PATCH 10/79] Note to self: try to make only 3 things at the same time. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0648c586f6..3a401968cc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2499,7 +2499,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); avatar.ControllingClient.SendAvatarDataImmediate(this); - if (Animation != null) + if (Animator != null) Animator.SendAnimPackToClient(avatar.ControllingClient); } From 4ac58093bf7fd89c473be259c0a6ca8524879245 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 4 Jan 2011 23:23:42 +0000 Subject: [PATCH 11/79] Make the default for the very verbose XMLRPC groups debug setting false rather than true! --- .../Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 4aab87fb3c..a8dec63def 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs @@ -123,8 +123,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups m_log.InfoFormat("[GROUPS]: Initializing {0}", this.Name); m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); - m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true); - + m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false); } } From 0c165bc4217bdae27e3268980bdbc21809e77c12 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 5 Jan 2011 07:14:09 -0800 Subject: [PATCH 12/79] Commented a verbose Debug message in LLUDPServer that got uncommented at some point. --- OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 149ae9e350..e54cfc21ea 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -648,7 +648,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP IClientAPI client; if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView)) { - m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); + //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); return; } From 984a9b408534d42f18bd072f70f9e2b31a691f9f Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Wed, 5 Jan 2011 14:32:00 -0800 Subject: [PATCH 13/79] Added more performance checks to the HTTP server. Each request coming through the WebUtil fns has a request id in the header that can match the request to the actual work done by the service --- .../Servers/HttpServer/BaseHttpServer.cs | 16 ++- OpenSim/Framework/WebUtil.cs | 115 +++++++++++------- 2 files changed, 83 insertions(+), 48 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 3343f608a5..86ad7aa693 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -346,9 +346,15 @@ namespace OpenSim.Framework.Servers.HttpServer /// public virtual void HandleRequest(OSHttpRequest request, OSHttpResponse response) { + string reqnum = "unknown"; + int tickstart = Environment.TickCount; + try { - //m_log.Debug("[BASE HTTP SERVER]: Handling request to " + request.RawUrl); + // OpenSim.Framework.WebUtil.OSHeaderRequestID + if (request.Headers["opensim-request-id"] != null) + reqnum = String.Format("{0}:{1}",request.RemoteIPEndPoint,request.Headers["opensim-request-id"]); + // m_log.DebugFormat("[BASE HTTP SERVER]: <{0}> handle request for {1}",reqnum,request.RawUrl); Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true); @@ -576,6 +582,14 @@ namespace OpenSim.Framework.Servers.HttpServer m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e); SendHTML500(response); } + finally + { + // Every month or so this will wrap and give bad numbers, not really a problem + // since its just for reporting, 200ms limit can be adjusted + int tickdiff = Environment.TickCount - tickstart; + if (tickdiff > 200) + m_log.InfoFormat("[BASE HTTP SERVER]: slow request <{0}> for {1} took {2} ms",reqnum,request.RawUrl,tickdiff); + } } private bool TryGetStreamHandler(string handlerKey, out IRequestHandler streamHandler) diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index a00ea88bf9..d88d09517f 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -51,7 +51,15 @@ namespace OpenSim.Framework MethodBase.GetCurrentMethod().DeclaringType); private static int m_requestNumber = 0; - + + // this is the header field used to communicate the local request id + // used for performance and debugging + public const string OSHeaderRequestID = "opensim-request-id"; + + // number of milliseconds a call can take before it is considered + // a "long" call for warning & debugging purposes + public const int LongCallTime = 200; + /// /// Send LLSD to an HTTP client in application/llsd+json form /// @@ -146,34 +154,41 @@ namespace OpenSim.Framework public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout) { int reqnum = m_requestNumber++; - m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); + // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method); string errorMessage = "unknown error"; int tickstart = Util.EnvironmentTickCount(); + int tickdata = 0; + try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = method; request.Timeout = timeout; - //request.KeepAlive = false; - + request.KeepAlive = false; + request.MaximumAutomaticRedirections = 10; + request.ReadWriteTimeout = timeout / 4; + request.Headers[OSHeaderRequestID] = reqnum.ToString(); + // If there is some input, write it into the request if (data != null) { string strBuffer = OSDParser.SerializeJsonString(data); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); - + request.ContentType = "application/json"; request.ContentLength = buffer.Length; //Count bytes to send using (Stream requestStream = request.GetRequestStream()) - { - requestStream.Write(buffer, 0, strBuffer.Length); //Send it - } + requestStream.Write(buffer, 0, buffer.Length); //Send it } - using (WebResponse webResponse = request.GetResponse()) + // capture how much time was spent writing, this may seem silly + // but with the number concurrent requests, this often blocks + tickdata = Util.EnvironmentTickCountSubtract(tickstart); + + using (WebResponse response = request.GetResponse()) { - using (Stream responseStream = webResponse.GetResponseStream()) + using (Stream responseStream = response.GetResponseStream()) { string responseStr = null; responseStr = responseStream.GetStreamString(); @@ -199,12 +214,12 @@ namespace OpenSim.Framework { // This just dumps a warning for any operation that takes more than 100 ms int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); - if (tickdiff > 100) - m_log.WarnFormat("[WEB UTIL]: request <{0}> (URI:{1}, METHOD:{2}) took {3} milliseconds", - reqnum,url,method,tickdiff); + if (tickdiff > LongCallTime) + m_log.InfoFormat("[WEB UTIL]: osd request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", + reqnum,url,method,tickdiff,tickdata); } - m_log.WarnFormat("[WEB UTIL] <{0}> request failed: {1}",reqnum,errorMessage); + m_log.WarnFormat("[WEB UTIL] <{0}> osd request failed: {1}",reqnum,errorMessage); return ErrorResponseMap(errorMessage); } @@ -248,7 +263,7 @@ namespace OpenSim.Framework catch (Exception e) { // don't need to treat this as an error... we're just guessing anyway - m_log.DebugFormat("[WEB UTIL] couldn't decode result: <{0}>",response); + m_log.DebugFormat("[WEB UTIL] couldn't decode <{0}>: {1}",response,e.Message); } return result; @@ -259,27 +274,45 @@ namespace OpenSim.Framework /// JSON data /// public static OSDMap PostToService(string url, NameValueCollection data) + { + return ServiceFormRequest(url,data,10000); + } + + public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout) { int reqnum = m_requestNumber++; - string method = data["RequestMethod"] != null ? data["RequestMethod"] : "unknown"; - m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); - - string errorMessage; + string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; + // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method); + + string errorMessage = "unknown error"; int tickstart = Util.EnvironmentTickCount(); + int tickdata = 0; try { - string queryString = BuildQueryString(data); - byte[] requestData = System.Text.Encoding.UTF8.GetBytes(queryString); - + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; - request.ContentLength = requestData.Length; - request.ContentType = "application/x-www-form-urlencoded"; + request.Timeout = timeout; + request.KeepAlive = false; + request.MaximumAutomaticRedirections = 10; + request.ReadWriteTimeout = timeout / 4; + request.Headers[OSHeaderRequestID] = reqnum.ToString(); - Stream requestStream = request.GetRequestStream(); - requestStream.Write(requestData, 0, requestData.Length); - requestStream.Close(); + if (data != null) + { + string queryString = BuildQueryString(data); + byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); + + request.ContentLength = buffer.Length; + request.ContentType = "application/x-www-form-urlencoded"; + using (Stream requestStream = request.GetRequestStream()) + requestStream.Write(buffer, 0, buffer.Length); + } + + // capture how much time was spent writing, this may seem silly + // but with the number concurrent requests, this often blocks + tickdata = Util.EnvironmentTickCountSubtract(tickstart); using (WebResponse response = request.GetResponse()) { @@ -287,22 +320,10 @@ namespace OpenSim.Framework { string responseStr = null; - try - { - responseStr = responseStream.GetStreamString(); - OSD responseOSD = OSDParser.Deserialize(responseStr); - if (responseOSD.Type == OSDType.Map) - return (OSDMap)responseOSD; - else - errorMessage = "Response format was invalid."; - } - catch (Exception ex) - { - if (!String.IsNullOrEmpty(responseStr)) - errorMessage = "Failed to parse the response:\n" + responseStr; - else - errorMessage = "Failed to retrieve the response: " + ex.Message; - } + responseStr = responseStream.GetStreamString(); + OSD responseOSD = OSDParser.Deserialize(responseStr); + if (responseOSD.Type == OSDType.Map) + return (OSDMap)responseOSD; } } } @@ -322,12 +343,12 @@ namespace OpenSim.Framework finally { int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); - if (tickdiff > 100) - m_log.WarnFormat("[WEB UTIL]: request <{0}> (URI:{1}, METHOD:{2}) took {3} milliseconds", - reqnum,url,method,tickdiff); + if (tickdiff > LongCallTime) + m_log.InfoFormat("[WEB UTIL]: form request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing", + reqnum,url,method,tickdiff,tickdata); } - m_log.WarnFormat("[WEB UTIL]: <{0}> request failed: {1}",reqnum,errorMessage); + m_log.WarnFormat("[WEB UTIL]: <{0}> form request failed: {1}",reqnum,errorMessage); return ErrorResponseMap(errorMessage); } From 0b44e99730fde43d88698927c5ced59f5a8eab53 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Wed, 5 Jan 2011 14:51:11 -0800 Subject: [PATCH 14/79] comment out a couple simian debug messages --- .../Connectors/SimianGrid/SimianAvatarServiceConnector.cs | 4 +--- .../Connectors/SimianGrid/SimianGridServiceConnector.cs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs index 65a02df390..810399c3ee 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs @@ -159,9 +159,7 @@ namespace OpenSim.Services.Connectors.SimianGrid return false; } -// DEBUG ON - m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR] save appearance for {0}",userID); -// DEBUG OFF + // m_log.DebugFormat("[SIMIAN AVATAR CONNECTOR] save appearance for {0}",userID); NameValueCollection requestArgs = new NameValueCollection { diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index 2f61538771..9c72a614fb 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -305,7 +305,7 @@ namespace OpenSim.Services.Connectors.SimianGrid { "Enabled", "1" } }; - m_log.WarnFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString()); + //m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString()); OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); From 5b43f9cac47267a5400001445b05f137ae452ee7 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 6 Jan 2011 12:47:13 -0800 Subject: [PATCH 15/79] HG bug fix. Must wait for client's UDP contact before getting scene presence. --- OpenSim/Region/Framework/Scenes/Scene.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index e27b2ba7ab..12fd813e0c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2592,12 +2592,19 @@ namespace OpenSim.Region.Framework.Scenes // and the scene presence and the client, if they exist try { - ScenePresence sp = GetScenePresence(agentID); - PresenceService.LogoutAgent(sp.ControllingClient.SessionId); - + // We need to wait for the client to make UDP contact first. + // It's the UDP contact that creates the scene presence + ScenePresence sp = WaitGetScenePresence(agentID); if (sp != null) - sp.ControllingClient.Close(); + { + PresenceService.LogoutAgent(sp.ControllingClient.SessionId); + sp.ControllingClient.Close(); + } + else + { + m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID); + } // BANG! SLASH! m_authenticateHandler.RemoveCircuit(agentID); From 21dedb573be61a52cbbcc519f999f6046e20e070 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 6 Jan 2011 12:48:28 -0800 Subject: [PATCH 16/79] HG map tile fetch: handle cached images appropriately. --- .../Hypergrid/GatekeeperServiceConnector.cs | 16 ++++++++++++---- OpenSim/Services/GridService/HypergridLinker.cs | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index 1aa3282dac..8ab323ad41 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -158,10 +158,17 @@ namespace OpenSim.Services.Connectors.Hypergrid try { WebClient c = new WebClient(); - //m_log.Debug("JPEG: " + imageURL); string name = regionID.ToString(); filename = Path.Combine(storagePath, name + ".jpg"); - c.DownloadFile(imageURL, filename); + m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: Map image at {0}, cached at {1}", imageURL, filename); + if (!File.Exists(filename)) + { + m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: downloading..."); + c.DownloadFile(imageURL, filename); + } + else + m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: using cached image"); + bitmap = new Bitmap(filename); //m_log.Debug("Size: " + m.PhysicalDimension.Height + "-" + m.PhysicalDimension.Width); byte[] imageData = OpenJPEG.EncodeFromImage(bitmap, true); @@ -172,10 +179,11 @@ namespace OpenSim.Services.Connectors.Hypergrid ass.Data = imageData; - m_AssetService.Store(ass); + mapTile = ass.FullID; // finally - mapTile = ass.FullID; + m_AssetService.Store(ass); + } catch // LEGIT: Catching problems caused by OpenJPEG p/invoke { diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index c02c81306f..16fcc65492 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -324,7 +324,7 @@ namespace OpenSim.Services.GridService regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL, m_MapTileDirectory); AddHyperlinkRegion(regInfo, handle); - m_log.Info("[HYPERGRID LINKER]: Successfully linked to region_uuid " + regInfo.RegionID); + m_log.InfoFormat("[HYPERGRID LINKER]: Successfully linked to region_uuid {0} with image {1}", regInfo.RegionID, regInfo.TerrainImage); return true; } From 81587466e72cfb989c0cb3fa74ae5ff6e7f861bb Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 6 Jan 2011 12:53:54 -0800 Subject: [PATCH 17/79] Map search: changed the flag sent to the client. It was 2 (???), now it's 0. This makes HG map tiles work on map search -- a longstanding annoyance. My map search tests were all ok, but since I don't understand these flag values, this may break something related to map search. --- .../Region/CoreModules/World/WorldMap/MapSearchModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index bdd1a0b7c5..cc28a5b2ff 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs @@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap GridRegion info = m_scene.GridService.GetRegionByName(m_scene.RegionInfo.ScopeID, mapName); if (info != null) regionInfos.Add(info); } - + m_log.DebugFormat("[MAPSEARCHMODULE]: search returned {0} regions", regionInfos.Count); List blocks = new List(); MapBlockData data; @@ -128,14 +128,14 @@ namespace OpenSim.Region.CoreModules.World.WorldMap data.Agents = 0; data.Access = 255; data.MapImageId = UUID.Zero; - data.Name = mapName; + data.Name = ""; // mapName; data.RegionFlags = 0; data.WaterHeight = 0; // not used data.X = 0; data.Y = 0; blocks.Add(data); - remoteClient.SendMapBlock(blocks, 2); + remoteClient.SendMapBlock(blocks, 0); } // private Scene GetClientScene(IClientAPI client) From fda56618e154c2fcbf76d57abfc66eb94156221e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 6 Jan 2011 16:17:43 -0800 Subject: [PATCH 18/79] Deal with possibly un-initialized scripts in object transfers. Mantis #5310 --- .../Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 8e712b60fe..783791f512 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -864,7 +864,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public Dictionary GetVars() { - return m_Script.GetVars(); + if (m_Script != null) + return m_Script.GetVars(); + else + return new Dictionary(); } public void SetVars(Dictionary vars) From 32a3f330eddfe2975e59ae7289b6a0033fb858e3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 6 Jan 2011 17:42:16 -0800 Subject: [PATCH 19/79] Canonicalize URL endings for the UserAgentServiceConnector. --- .../Connectors/Hypergrid/UserAgentServiceConnector.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 7ddcfa61ae..c40a3474a3 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -60,7 +60,9 @@ namespace OpenSim.Services.Connectors.Hypergrid { Uri m_Uri = new Uri(m_ServerURL); IPAddress ip = Util.GetHostFromDNS(m_Uri.Host); - m_ServerURL = m_ServerURL.Replace(m_Uri.Host, ip.ToString()); ; + m_ServerURL = m_ServerURL.Replace(m_Uri.Host, ip.ToString()); + if (!m_ServerURL.EndsWith("/")) + m_ServerURL += "/"; } catch (Exception e) { @@ -87,6 +89,8 @@ namespace OpenSim.Services.Connectors.Hypergrid throw new Exception("UserAgent connector init error"); } m_ServerURL = serviceURI; + if (!m_ServerURL.EndsWith("/")) + m_ServerURL += "/"; m_log.DebugFormat("[USER AGENT CONNECTOR]: UserAgentServiceConnector started for {0}", m_ServerURL); } From 52f88f5739980bb53d126949725bf38daf5e0800 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 7 Jan 2011 10:04:39 -0800 Subject: [PATCH 20/79] Spawn a threadlet upon receiving requests to close agents. The operation may take too long, and we don't need to keep the caller waiting. --- .../Simulation/LocalSimulationConnector.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 37b403e8cc..2dd0099f83 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -300,7 +300,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation if (s.RegionInfo.RegionID == destination.RegionID) { //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent"); - return s.IncomingCloseAgent(id); + // Let's spawn a threadlet right here, because this may take + // a while + Util.FireAndForget(delegate { s.IncomingCloseAgent(id); }); + return true; } } //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); From c18bcf3d8db61fd704b229da77fb3ecc190fa742 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 7 Jan 2011 10:25:49 -0800 Subject: [PATCH 21/79] A bit more frugal on the caller side of closing agents, now that the receiving end is async. No need for so much concurrency. --- .../Scenes/SceneCommunicationService.cs | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs index 69ebe9efde..f8ff308893 100644 --- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs @@ -258,13 +258,17 @@ namespace OpenSim.Region.Framework.Scenes } - public delegate void SendCloseChildAgentDelegate(UUID agentID, ulong regionHandle); + //public delegate void SendCloseChildAgentDelegate(UUID agentID, ulong regionHandle); + //private void SendCloseChildAgentCompleted(IAsyncResult iar) + //{ + // SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState; + // icon.EndInvoke(iar); + //} /// - /// This Closes child agents on neighboring regions - /// Calls an asynchronous method to do so.. so it doesn't lag the sim. + /// Closes a child agent on a given region /// - protected void SendCloseChildAgentAsync(UUID agentID, ulong regionHandle) + protected void SendCloseChildAgent(UUID agentID, ulong regionHandle) { m_log.Debug("[INTERGRID]: Sending close agent to " + regionHandle); @@ -277,21 +281,21 @@ namespace OpenSim.Region.Framework.Scenes m_scene.SimulationService.CloseAgent(destination, agentID); } - private void SendCloseChildAgentCompleted(IAsyncResult iar) - { - SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState; - icon.EndInvoke(iar); - } - + /// + /// Closes a child agents in a collection of regions. Does so asynchronously + /// so that the caller doesn't wait. + /// + /// + /// public void SendCloseChildAgentConnections(UUID agentID, List regionslst) { - foreach (ulong handle in regionslst) + Util.FireAndForget(delegate { - SendCloseChildAgentDelegate d = SendCloseChildAgentAsync; - d.BeginInvoke(agentID, handle, - SendCloseChildAgentCompleted, - d); - } + foreach (ulong handle in regionslst) + { + SendCloseChildAgent(agentID, handle); + } + }); } public List RequestNamedRegions(string name, int maxNumber) From 8c0e156b4d534cbc9ad21805529804610b7c78eb Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 7 Jan 2011 11:38:54 -0800 Subject: [PATCH 22/79] Make HG map search consistent with new syntax for link-region, i.e. http://foo.org. Old syntax (foo.org) is still supported, but has surprising results when ppl search again, because internally the HG link names start with http. --- .../World/WorldMap/MapSearchModule.cs | 2 +- .../Services/GridService/HypergridLinker.cs | 80 ++++++++++--------- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs index cc28a5b2ff..a9e46d04c2 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapSearchModule.cs @@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap GridRegion info = m_scene.GridService.GetRegionByName(m_scene.RegionInfo.ScopeID, mapName); if (info != null) regionInfos.Add(info); } - m_log.DebugFormat("[MAPSEARCHMODULE]: search returned {0} regions", regionInfos.Count); + m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions", mapName, regionInfos.Count); List blocks = new List(); MapBlockData data; diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index 16fcc65492..588c1dd0ed 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -162,6 +162,7 @@ namespace OpenSim.Services.GridService #region Link Region + // from map search public GridRegion LinkRegion(UUID scopeID, string regionDescriptor) { string reason = string.Empty; @@ -171,7 +172,7 @@ namespace OpenSim.Services.GridService private static Random random = new Random(); - // From the command line link-region + // From the command line link-region (obsolete) and the map public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, out string reason) { return TryLinkRegionToCoords(scopeID, mapName, xloc, yloc, UUID.Zero, out reason); @@ -180,45 +181,48 @@ namespace OpenSim.Services.GridService public GridRegion TryLinkRegionToCoords(UUID scopeID, string mapName, int xloc, int yloc, UUID ownerID, out string reason) { reason = string.Empty; - string host = "127.0.0.1"; - string portstr; - string regionName = ""; - uint port = 0; - string[] parts = mapName.Split(new char[] { ':' }); - if (parts.Length >= 1) + GridRegion regInfo = null; + + if (!mapName.StartsWith("http")) { - host = parts[0]; + string host = "127.0.0.1"; + string portstr; + string regionName = ""; + uint port = 0; + string[] parts = mapName.Split(new char[] { ':' }); + if (parts.Length >= 1) + { + host = parts[0]; + } + if (parts.Length >= 2) + { + portstr = parts[1]; + //m_log.Debug("-- port = " + portstr); + if (!UInt32.TryParse(portstr, out port)) + regionName = parts[1]; + } + // always take the last one + if (parts.Length >= 3) + { + regionName = parts[2]; + } + + + bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); + if (success) + { + regInfo.RegionName = mapName; + return regInfo; + } } - if (parts.Length >= 2) + else { - portstr = parts[1]; - //m_log.Debug("-- port = " + portstr); - if (!UInt32.TryParse(portstr, out port)) + string[] parts = mapName.Split(new char[] {' '}); + string regionName = String.Empty; + if (parts.Length > 1) regionName = parts[1]; - } - // always take the last one - if (parts.Length >= 3) - { - regionName = parts[2]; - } - - //// Sanity check. - //try - //{ - // Util.GetHostFromDNS(host); - //} - //catch - //{ - // reason = "Malformed hostname"; - // return null; - //} - - GridRegion regInfo; - bool success = TryCreateLink(scopeID, xloc, yloc, regionName, port, host, ownerID, out regInfo, out reason); - if (success) - { - regInfo.RegionName = mapName; - return regInfo; + if (TryCreateLink(scopeID, xloc, yloc, regionName, 0, null, parts[0], ownerID, out regInfo, out reason)) + return regInfo; } return null; @@ -231,7 +235,7 @@ namespace OpenSim.Services.GridService public bool TryCreateLink(UUID scopeID, int xloc, int yloc, string remoteRegionName, uint externalPort, string externalHostName, string serverURI, UUID ownerID, out GridRegion regInfo, out string reason) { - m_log.DebugFormat("[HYPERGRID LINKER]: Link to {0}:{1}, in {2}-{3}", + m_log.DebugFormat("[HYPERGRID LINKER]: Link to {0} {1}, in {2}-{3}", ((serverURI == null) ? (externalHostName + ":" + externalPort) : serverURI), remoteRegionName, xloc / Constants.RegionSize, yloc / Constants.RegionSize); @@ -324,7 +328,7 @@ namespace OpenSim.Services.GridService regInfo.TerrainImage = m_GatekeeperConnector.GetMapImage(regionID, imageURL, m_MapTileDirectory); AddHyperlinkRegion(regInfo, handle); - m_log.InfoFormat("[HYPERGRID LINKER]: Successfully linked to region_uuid {0} with image {1}", regInfo.RegionID, regInfo.TerrainImage); + m_log.InfoFormat("[HYPERGRID LINKER]: Successfully linked to region {0} with image {1}", regInfo.RegionName, regInfo.TerrainImage); return true; } From 02e661f8dd8e714bd357ce4091a79cf282228b26 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 7 Jan 2011 11:39:22 -0800 Subject: [PATCH 23/79] Minor additional debug message. --- .../Framework/EntityTransfer/EntityTransferModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index e5cefe4e92..8bf2bf86dd 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1203,6 +1203,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.Debug("[ENTITY TRANSFER MODULE]: Completed inform client about neighbour " + endPoint.ToString()); } + if (!regionAccepted) + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Region {0} did not accept agent: {1}", reg.RegionName, reason); } /// From a1c5de0f94ecdf614dba3aaae7aaa60ceefa09c9 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 7 Jan 2011 12:32:47 -0800 Subject: [PATCH 24/79] Try to fix a IAR problem reported by nebadon, where save iar seems stuck forever. --- OpenSim/Region/Framework/Scenes/UuidGatherer.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 3978a7d3ae..83906d745f 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -86,6 +86,10 @@ namespace OpenSim.Region.Framework.Scenes /// The assets gathered public void GatherAssetUuids(UUID assetUuid, AssetType assetType, IDictionary assetUuids) { + // avoid infinite loops + if (assetUuids.ContainsKey(assetUuid)) + return; + try { assetUuids[assetUuid] = assetType; From df7fb207a87b1b07a00600d5b66e717ac2332b4f Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Sat, 8 Jan 2011 13:33:07 -0800 Subject: [PATCH 25/79] Moved the map tile processing used by the Simian Grid Frontend into a separate region module. Configuration settings added to the defaults ini file. Others may find this useful for pushing map tiles to a separate server. --- .../SimianGrid/SimianGridMaptileModule.cs | 261 ++++++++++++++++++ .../SimianGrid/SimianGridServiceConnector.cs | 86 ------ bin/OpenSimDefaults.ini | 8 + 3 files changed, 269 insertions(+), 86 deletions(-) create mode 100644 OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs new file mode 100644 index 0000000000..dd8fe2b800 --- /dev/null +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridMaptileModule.cs @@ -0,0 +1,261 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Net; +using System.IO; +using System.Timers; +using System.Drawing; +using System.Drawing.Imaging; + +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace OpenSim.Region.OptionalModules.Simian +{ + /// + /// + /// + /// + + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SimianGridMaptile")] + public class SimianGridMaptile : ISharedRegionModule + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private bool m_enabled = false; + private string m_serverUrl = String.Empty; + private Dictionary m_scenes = new Dictionary(); + + private int m_refreshtime = 0; + private int m_lastrefresh = 0; + private System.Timers.Timer m_refreshTimer = new System.Timers.Timer(); + + #region ISharedRegionModule + + public Type ReplaceableInterface { get { return null; } } + public string Name { get { return "SimianGridMaptile"; } } + public void RegionLoaded(Scene scene) { } + public void Close() { } + + /// + /// + /// + public void Initialise(IConfigSource source) + { + IConfig config = source.Configs["SimianGridMaptiles"]; + if (config == null) + return; + + if (! config.GetBoolean("Enabled", false)) + return; + + m_serverUrl = config.GetString("MaptileURL"); + if (String.IsNullOrEmpty(m_serverUrl)) + return; + + m_refreshtime = Convert.ToInt32(config.GetString("RefreshTime")); + if (m_refreshtime <= 0) + return; + + m_log.InfoFormat("[SIMIAN MAPTILE] enabled with refresh timeout {0} and URL {1}", + m_refreshtime,m_serverUrl); + + m_enabled = true; + } + + /// + /// + /// + public void PostInitialise() + { + if (m_enabled) + { + m_refreshTimer.Enabled = true; + m_refreshTimer.AutoReset = true; + m_refreshTimer.Interval = 5 * 60 * 1000; // every 5 minutes + m_refreshTimer.Elapsed += new ElapsedEventHandler(HandleMaptileRefresh); + } + } + + + /// + /// + /// + public void AddRegion(Scene scene) + { + if (! m_enabled) + return; + + // Every shared region module has to maintain an indepedent list of + // currently running regions + lock (m_scenes) + m_scenes[scene.RegionInfo.RegionID] = scene; + } + + /// + /// + /// + public void RemoveRegion(Scene scene) + { + if (! m_enabled) + return; + + lock (m_scenes) + m_scenes.Remove(scene.RegionInfo.RegionID); + } + + #endregion ISharedRegionModule + + /// + /// + /// + private void HandleMaptileRefresh(object sender, EventArgs ea) + { + // this approach is a bit convoluted becase we want to wait for the + // first upload to happen on startup but after all the objects are + // loaded and initialized + if (m_lastrefresh > 0 && Util.EnvironmentTickCountSubtract(m_lastrefresh) < m_refreshtime) + return; + + m_log.DebugFormat("[SIMIAN MAPTILE] map refresh fired"); + lock (m_scenes) + { + foreach (IScene scene in m_scenes.Values) + { + try + { + UploadMapTile(scene); + } + catch (Exception ex) + { + m_log.WarnFormat("[SIMIAN MAPTILE] something bad happened {0}",ex.Message); + } + } + } + + m_lastrefresh = Util.EnvironmentTickCount(); + } + + /// + /// + /// + private void UploadMapTile(IScene scene) + { + m_log.DebugFormat("[SIMIAN MAPTILE]: upload maptile for {0}",scene.RegionInfo.RegionName); + + // Create a PNG map tile and upload it to the AddMapTile API + byte[] pngData = Utils.EmptyBytes; + IMapImageGenerator tileGenerator = scene.RequestModuleInterface(); + if (tileGenerator == null) + { + m_log.Warn("[SIMIAN MAPTILE]: Cannot upload PNG map tile without an ImageGenerator"); + return; + } + + using (Image mapTile = tileGenerator.CreateMapTile()) + { + using (MemoryStream stream = new MemoryStream()) + { + mapTile.Save(stream, ImageFormat.Png); + pngData = stream.ToArray(); + } + } + + List postParameters = new List() + { + new MultipartForm.Parameter("X", scene.RegionInfo.RegionLocX.ToString()), + new MultipartForm.Parameter("Y", scene.RegionInfo.RegionLocY.ToString()), + new MultipartForm.File("Tile", "tile.png", "image/png", pngData) + }; + + string errorMessage = null; + int tickstart = Util.EnvironmentTickCount(); + + // Make the remote storage request + try + { + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_serverUrl); + request.Timeout = 20000; + request.ReadWriteTimeout = 5000; + + using (HttpWebResponse response = MultipartForm.Post(request, postParameters)) + { + using (Stream responseStream = response.GetResponseStream()) + { + string responseStr = responseStream.GetStreamString(); + OSD responseOSD = OSDParser.Deserialize(responseStr); + if (responseOSD.Type == OSDType.Map) + { + OSDMap responseMap = (OSDMap)responseOSD; + if (responseMap["Success"].AsBoolean()) + return; + + errorMessage = "Upload failed: " + responseMap["Message"].AsString(); + } + else + { + errorMessage = "Response format was invalid:\n" + responseStr; + } + } + } + } + catch (WebException we) + { + errorMessage = we.Message; + if (we.Status == WebExceptionStatus.ProtocolError) + { + HttpWebResponse webResponse = (HttpWebResponse)we.Response; + errorMessage = String.Format("[{0}] {1}", + webResponse.StatusCode,webResponse.StatusDescription); + } + } + catch (Exception ex) + { + errorMessage = ex.Message; + } + finally + { + // This just dumps a warning for any operation that takes more than 100 ms + int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); + m_log.DebugFormat("[SIMIAN MAPTILE]: map tile uploaded in {0}ms",tickdiff); + } + + m_log.WarnFormat("[SIMIAN MAPTILE]: Failed to store {0} byte tile for {1}: {2}", + pngData.Length, scene.RegionInfo.RegionName, errorMessage); + } + } +} \ No newline at end of file diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index 9c72a614fb..18a31670bc 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -28,8 +28,6 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Net; using System.Reflection; @@ -102,13 +100,6 @@ namespace OpenSim.Services.Connectors.SimianGrid public string RegisterRegion(UUID scopeID, GridRegion regionInfo) { - // Generate and upload our map tile in PNG format to the SimianGrid AddMapTile service -// Scene scene; -// if (m_scenes.TryGetValue(regionInfo.RegionID, out scene)) -// UploadMapTile(scene); -// else -// m_log.Warn("Registering region " + regionInfo.RegionName + " (" + regionInfo.RegionID + ") that we are not tracking"); - Vector3d minPosition = new Vector3d(regionInfo.RegionLocX, regionInfo.RegionLocY, 0.0); Vector3d maxPosition = minPosition + new Vector3d(Constants.RegionSize, Constants.RegionSize, 4096.0); @@ -380,83 +371,6 @@ namespace OpenSim.Services.Connectors.SimianGrid #endregion IGridService - private void UploadMapTile(IScene scene) - { - string errorMessage = null; - - // Create a PNG map tile and upload it to the AddMapTile API - byte[] pngData = Utils.EmptyBytes; - IMapImageGenerator tileGenerator = scene.RequestModuleInterface(); - if (tileGenerator == null) - { - m_log.Warn("[SIMIAN GRID CONNECTOR]: Cannot upload PNG map tile without an IMapImageGenerator"); - return; - } - - using (Image mapTile = tileGenerator.CreateMapTile()) - { - using (MemoryStream stream = new MemoryStream()) - { - mapTile.Save(stream, ImageFormat.Png); - pngData = stream.ToArray(); - } - } - - List postParameters = new List() - { - new MultipartForm.Parameter("X", scene.RegionInfo.RegionLocX.ToString()), - new MultipartForm.Parameter("Y", scene.RegionInfo.RegionLocY.ToString()), - new MultipartForm.File("Tile", "tile.png", "image/png", pngData) - }; - - // Make the remote storage request - try - { - HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI); - - HttpWebResponse response = MultipartForm.Post(request, postParameters); - using (Stream responseStream = response.GetResponseStream()) - { - string responseStr = null; - - try - { - responseStr = responseStream.GetStreamString(); - OSD responseOSD = OSDParser.Deserialize(responseStr); - if (responseOSD.Type == OSDType.Map) - { - OSDMap responseMap = (OSDMap)responseOSD; - if (responseMap["Success"].AsBoolean()) - m_log.Info("[SIMIAN GRID CONNECTOR]: Uploaded " + pngData.Length + " byte PNG map tile to AddMapTile"); - else - errorMessage = "Upload failed: " + responseMap["Message"].AsString(); - } - else - { - errorMessage = "Response format was invalid:\n" + responseStr; - } - } - catch (Exception ex) - { - if (!String.IsNullOrEmpty(responseStr)) - errorMessage = "Failed to parse the response:\n" + responseStr; - else - errorMessage = "Failed to retrieve the response: " + ex.Message; - } - } - } - catch (WebException ex) - { - errorMessage = ex.Message; - } - - if (!String.IsNullOrEmpty(errorMessage)) - { - m_log.WarnFormat("[SIMIAN GRID CONNECTOR]: Failed to store {0} byte PNG map tile for {1}: {2}", - pngData.Length, scene.RegionInfo.RegionName, errorMessage.Replace('\n', ' ')); - } - } - private GridRegion GetNearestRegion(Vector3d position, bool onlyEnabled) { NameValueCollection requestArgs = new NameValueCollection diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 8437ece651..90284530f4 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -1240,6 +1240,14 @@ ; Enable media on a prim facilities Enabled = true; +;; +;; If you are using a simian grid frontend you can enable +;; this module to upload tile images for the mapping fn +;; +[SimianGridMaptiles] + Enabled = False + MaptileURL = "http://www.mygrid.com/Grid/" + RefreshTime = 3600 ;; ;; These are defaults that are overwritten below in [Architecture]. From eab0951a591bc2576d6b361a6fa4c75f683bfa54 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 8 Jan 2011 15:49:51 -0800 Subject: [PATCH 26/79] Fixes the issue of hung archives. Problem was with SceneObjectSerializer. Also fixes a buglet in scene load xml command, where it was given the wrong argument index for filename. --- OpenSim/Region/Application/OpenSim.cs | 2 +- .../Scenes/Serialization/SceneObjectSerializer.cs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index e3b857351c..51eb396aa1 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -1146,7 +1146,7 @@ namespace OpenSim MainConsole.Instance.Output(String.Format("loadOffsets = <{0},{1},{2}>",loadOffset.X,loadOffset.Y,loadOffset.Z)); } } - m_sceneManager.LoadCurrentSceneFromXml(cmdparams[0], generateNewIDS, loadOffset); + m_sceneManager.LoadCurrentSceneFromXml(cmdparams[2], generateNewIDS, loadOffset); } else { diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 605521a0fa..57ae4fd24f 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1441,6 +1441,12 @@ namespace OpenSim.Region.Framework.Scenes.Serialization { TaskInventoryDictionary tinv = new TaskInventoryDictionary(); + if (reader.IsEmptyElement) + { + reader.Read(); + return tinv; + } + reader.ReadStartElement(name, String.Empty); while (reader.Name == "TaskInventoryItem") @@ -1474,6 +1480,12 @@ namespace OpenSim.Region.Framework.Scenes.Serialization { PrimitiveBaseShape shape = new PrimitiveBaseShape(); + if (reader.IsEmptyElement) + { + reader.Read(); + return shape; + } + reader.ReadStartElement(name, String.Empty); // Shape string nodeName = string.Empty; From 35a2961ccd1407153f9040e03f4a49b0e615e29f Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 8 Jan 2011 16:17:00 -0800 Subject: [PATCH 27/79] Added a -v|verbose option to save iar. --- .../Inventory/Archiver/InventoryArchiveWriteRequest.cs | 6 ++++++ .../Avatar/Inventory/Archiver/InventoryArchiverModule.cs | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs index 5e5f6c0590..dc4900f5a7 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveWriteRequest.cs @@ -139,6 +139,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver protected void SaveInvItem(InventoryItemBase inventoryItem, string path, Dictionary options, IUserAccountService userAccountService) { + if (options.ContainsKey("verbose")) + m_log.InfoFormat("[INVENTORY ARCHIVER]: Saving item {0} with asset {1}", inventoryItem.ID, inventoryItem.AssetID); + string filename = path + CreateArchiveItemName(inventoryItem); // Record the creator of this item for user record purposes (which might go away soon) @@ -162,6 +165,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver InventoryFolderBase inventoryFolder, string path, bool saveThisFolderItself, Dictionary options, IUserAccountService userAccountService) { + if (options.ContainsKey("verbose")) + m_log.InfoFormat("[INVENTORY ARCHIVER]: Saving folder {0}", inventoryFolder.Name); + if (saveThisFolderItself) { path += CreateArchiveFolderName(inventoryFolder); diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs index b1c2a3c683..1a96098f18 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs @@ -122,12 +122,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver scene.AddCommand( this, "save iar", - "save iar [--p|-profile=] []", + "save iar [--p|-profile=] [] [--v|-verbose]", "Save user inventory archive (IAR).", " is the user's first name." + Environment.NewLine + " is the user's last name." + Environment.NewLine + " is the path inside the user's inventory for the folder/item to be saved." + Environment.NewLine + "-p|--profile= adds the url of the profile service to the saved user information." + Environment.NewLine + + "-v|--verbose extra debug messages." + Environment.NewLine + " is the filesystem path at which to save the IAR." + string.Format(" If this is not given then the filename {0} in the current directory is used", DEFAULT_INV_BACKUP_FILENAME), HandleSaveInvConsoleCommand); @@ -394,6 +395,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver OptionSet ops = new OptionSet(); //ops.Add("v|version=", delegate(string v) { options["version"] = v; }); ops.Add("p|profile=", delegate(string v) { options["profile"] = v; }); + ops.Add("v|verbose", delegate(string v) { options["verbose"] = v; }); List mainParams = ops.Parse(cmdparams); From 0fabe0e5a5ee37cad77aeebf84660f9daef95d2e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 8 Jan 2011 16:33:33 -0800 Subject: [PATCH 28/79] Added more debug messages under the -verbose option. --- .../Region/CoreModules/World/Archiver/AssetsRequest.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index 5da165666d..b88869882f 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs @@ -249,14 +249,18 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (asset != null) { -// m_log.DebugFormat("[ARCHIVER]: Writing asset {0}", id); + if (m_options.ContainsKey("verbose")) + m_log.InfoFormat("[ARCHIVER]: Writing asset {0}", id); + m_foundAssetUuids.Add(asset.FullID); m_assetsArchiver.WriteAsset(PostProcess(asset)); } else { -// m_log.DebugFormat("[ARCHIVER]: Recording asset {0} as not found", id); + if (m_options.ContainsKey("verbose")) + m_log.InfoFormat("[ARCHIVER]: Recording asset {0} as not found", id); + m_notFoundAssetUuids.Add(new UUID(id)); } From e80bcc0049c9e60e052969aaf8582fa2b867f879 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 9 Jan 2011 16:52:41 -0800 Subject: [PATCH 29/79] Improved debug messages to track what is going on with the XFF header --- .../Server/Handlers/Hypergrid/HomeAgentHandlers.cs | 2 ++ OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | 2 ++ .../Services/HypergridService/UserAgentService.cs | 12 +++++++----- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs index a5ec4f2b08..0066bd4d62 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs @@ -217,6 +217,8 @@ namespace OpenSim.Server.Handlers.Hypergrid Hashtable headers = (Hashtable)request["headers"]; if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) { + m_log.DebugFormat("[HOME AGENT HANDLER]: XFF is {0}", headers["X-Forwarded-For"]); + IPEndPoint ep = Util.GetClientIPFromXFF((string)headers["X-Forwarded-For"]); if (ep != null) return ep.Address.ToString(); diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 24ae81ff0f..9c41bcbd9c 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -202,6 +202,8 @@ namespace OpenSim.Server.Handlers.Simulation Hashtable headers = (Hashtable)request["headers"]; if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) { + m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers["X-Forwarded-For"]); + IPEndPoint ep = Util.GetClientIPFromXFF((string)headers["X-Forwarded-For"]); if (ep != null) return ep.Address.ToString(); diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 12dda48164..3ead180a0b 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -155,7 +155,7 @@ namespace OpenSim.Services.HypergridService string myExternalIP = string.Empty; string gridName = gatekeeper.ServerURI; - m_log.DebugFormat("[USER AGENT SERVICE]: m_grid - {0}, gn - {1}", m_GridName, gridName); + m_log.DebugFormat("[USER AGENT SERVICE]: this grid: {0}, desired grid: {1}", m_GridName, gridName); if (m_GridName == gridName) success = m_GatekeeperService.LoginAgent(agentCircuit, finalDestination, out reason); @@ -266,11 +266,13 @@ namespace OpenSim.Services.HypergridService if (m_TravelingAgents.ContainsKey(sessionID)) { - m_log.DebugFormat("[USER AGENT SERVICE]: Comparing with login IP {0} and MyIP {1}", - m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress); - - return m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || + bool result = m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed + + m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}", + reportedIP, m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress, result); + + return result; } return false; From dd154f74036f6f78c936f557e89da1293a4ce342 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 6 Jan 2011 19:12:25 +0100 Subject: [PATCH 30/79] Fix god mode perms adjustment --- OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 39ebaefcab..90f1d6efe1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1010,6 +1010,8 @@ namespace OpenSim.Region.Framework.Scenes item.BasePermissions = perms; } } + m_inventorySerial++; + HasInventoryChanged = true; } public bool ContainsScripts() From 7cfe17b5b39bb6e99abe24ae27c60b51165abe21 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 12 Jan 2011 21:25:38 +0000 Subject: [PATCH 31/79] Partial permissions fix for boxed items. --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 10 ++++++++++ .../Framework/Scenes/SceneObjectPartInventory.cs | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index dc2ce4874d..bc6b165668 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2131,5 +2131,15 @@ namespace OpenSim.Region.Framework.Scenes m_sceneGraph.LinkObjects(root, children); } + + private string PermissionString(uint permissions) + { + PermissionMask perms = (PermissionMask)permissions & + (PermissionMask.Move | + PermissionMask.Copy | + PermissionMask.Transfer | + PermissionMask.Modify); + return perms.ToString(); + } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 90f1d6efe1..900130a85d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -946,6 +946,13 @@ namespace OpenSim.Region.Framework.Scenes { foreach (TaskInventoryItem item in m_items.Values) { + if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) + mask &= ~((uint)PermissionMask.Copy >> 13); + if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0) + mask &= ~((uint)PermissionMask.Transfer >> 13); + if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0) + mask &= ~((uint)PermissionMask.Modify >> 13); + if (item.InvType != (int)InventoryType.Object) { if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0) From f75a3ee7628f4f0f75cad825d8ffc8195258583f Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 11 Jan 2011 14:59:55 +0100 Subject: [PATCH 32/79] Use ToString() rather than a cast (more robust) --- OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 91e03acccd..298d664a64 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs @@ -558,7 +558,7 @@ namespace OpenSim.Region.ScriptEngine.Shared else if (m_data[itemIndex] is Int32) return new LSLInteger((int)m_data[itemIndex]); else if (m_data[itemIndex] is LSL_Types.LSLString) - return new LSLInteger((string)m_data[itemIndex]); + return new LSLInteger(m_data[itemIndex].ToString()); else throw new InvalidCastException(); } From 914e4b319ee0adba72bfbfebd878827bfdfde843 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 12 Jan 2011 21:39:13 +0000 Subject: [PATCH 33/79] Fix direct item give permissions --- .../InventoryAccess/InventoryAccessModule.cs | 26 ++++++----- .../World/Objects/BuySell/BuySellModule.cs | 2 +- .../Framework/Scenes/Scene.Inventory.cs | 44 ++++++++++++++++--- .../Scenes/SceneObjectGroup.Inventory.cs | 2 +- .../Scenes/SceneObjectPartInventory.cs | 22 +++++++--- 5 files changed, 73 insertions(+), 23 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 1ebccd1af1..f2cc16c693 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -434,10 +434,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask; - // Magic number badness. Maybe this deserves an enum. - // bit 4 (16) is the "Slam" bit, it means treat as passed - // and apply next owner perms on rez - item.CurrentPermissions |= 16; // Slam! + item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; } else { @@ -641,7 +638,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess rootPart.Description = item.Description; group.SetGroup(remoteClient.ActiveGroupId, remoteClient); - if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0) + if ((rootPart.OwnerID != item.Owner) || + (item.CurrentPermissions & 16) != 0 || // Magic number + (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) { //Need to kill the for sale here rootPart.ObjectSaleType = 0; @@ -651,9 +650,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { foreach (SceneObjectPart part in group.Parts) { - part.EveryoneMask = item.EveryOnePermissions; - part.NextOwnerMask = item.NextPermissions; - part.GroupMask = 0; // DO NOT propagate here + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) + part.EveryoneMask = item.EveryOnePermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) + part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) + part.GroupMask = item.GroupPermissions; } group.ApplyNextOwnerPermissions(); @@ -669,8 +671,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess part.Inventory.ChangeInventoryOwner(item.Owner); part.GroupMask = 0; // DO NOT propagate here } - part.EveryoneMask = item.EveryOnePermissions; - part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) + part.EveryoneMask = item.EveryOnePermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) + part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) + part.GroupMask = item.GroupPermissions; } rootPart.TrimPermissions(); diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index 568ba198bd..be399ff65b 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -215,7 +215,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.NextOwnerMask; item.GroupPermissions = part.GroupMask & part.NextOwnerMask; - item.CurrentPermissions |= 16; // Slam! + item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; item.CreationDate = Util.UnixTimeSinceEpoch(); if (m_scene.AddInventoryItem(item)) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index bc6b165668..19fa6c5499 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -326,10 +326,17 @@ namespace OpenSim.Region.Framework.Scenes { if (UUID.Zero == transactionID) { + item.Flags = itemUpd.Flags; item.Name = itemUpd.Name; item.Description = itemUpd.Description; + if (item.NextPermissions != (itemUpd.NextPermissions & item.BasePermissions)) + item.Flags |= (uint)InventoryItemFlags.ObjectOverwriteNextOwner; item.NextPermissions = itemUpd.NextPermissions & item.BasePermissions; + if (item.EveryOnePermissions != (itemUpd.EveryOnePermissions & item.BasePermissions)) + item.Flags |= (uint)InventoryItemFlags.ObjectOverwriteEveryone; item.EveryOnePermissions = itemUpd.EveryOnePermissions & item.BasePermissions; + if (item.GroupPermissions != (itemUpd.GroupPermissions & item.BasePermissions)) + item.Flags |= (uint)InventoryItemFlags.ObjectOverwriteGroup; item.GroupPermissions = itemUpd.GroupPermissions & item.BasePermissions; item.GroupID = itemUpd.GroupID; item.GroupOwned = itemUpd.GroupOwned; @@ -344,9 +351,12 @@ namespace OpenSim.Region.Framework.Scenes // TODO: Check if folder changed and move item //item.NextPermissions = itemUpd.Folder; item.InvType = itemUpd.InvType; + + if (item.SalePrice != itemUpd.SalePrice || + item.SaleType != itemUpd.SaleType) + item.Flags |= (uint)InventoryItemFlags.ObjectSlamSale; item.SalePrice = itemUpd.SalePrice; item.SaleType = itemUpd.SaleType; - item.Flags = itemUpd.Flags; InventoryService.UpdateItem(item); } @@ -527,7 +537,8 @@ namespace OpenSim.Region.Framework.Scenes // Assign to the actual item. Make sure the slam bit is // set, if it wasn't set before. itemCopy.BasePermissions = basePerms; - itemCopy.CurrentPermissions = ownerPerms | 16; // Slam + itemCopy.CurrentPermissions = ownerPerms; + itemCopy.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; itemCopy.NextPermissions = item.NextPermissions; @@ -1043,7 +1054,7 @@ namespace OpenSim.Region.Framework.Scenes else agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; - agentItem.CurrentPermissions |= 16; // Slam + agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; agentItem.NextPermissions = taskItem.NextPermissions; agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; @@ -1254,7 +1265,7 @@ namespace OpenSim.Region.Framework.Scenes (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); destTaskItem.BasePermissions = srcTaskItem.BasePermissions & (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); - destTaskItem.CurrentPermissions |= 16; // Slam! + destTaskItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; } } @@ -1435,6 +1446,8 @@ namespace OpenSim.Region.Framework.Scenes // Base ALWAYS has move currentItem.BasePermissions |= (uint)PermissionMask.Move; + itemInfo.Flags = currentItem.Flags; + // Check if we're allowed to mess with permissions if (!Permissions.IsGod(remoteClient.AgentId)) // Not a god { @@ -1452,6 +1465,14 @@ namespace OpenSim.Region.Framework.Scenes // Owner can't change base, and can change other // only up to base itemInfo.BasePermissions = currentItem.BasePermissions; + if (itemInfo.EveryonePermissions != currentItem.EveryonePermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteEveryone; + if (itemInfo.GroupPermissions != currentItem.GroupPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteGroup; + if (itemInfo.CurrentPermissions != currentItem.CurrentPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteOwner; + if (itemInfo.NextPermissions != currentItem.NextPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteNextOwner; itemInfo.EveryonePermissions &= currentItem.BasePermissions; itemInfo.GroupPermissions &= currentItem.BasePermissions; itemInfo.CurrentPermissions &= currentItem.BasePermissions; @@ -1459,6 +1480,19 @@ namespace OpenSim.Region.Framework.Scenes } } + else + { + if (itemInfo.BasePermissions != currentItem.BasePermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteBase; + if (itemInfo.EveryonePermissions != currentItem.EveryonePermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteEveryone; + if (itemInfo.GroupPermissions != currentItem.GroupPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteGroup; + if (itemInfo.CurrentPermissions != currentItem.CurrentPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteOwner; + if (itemInfo.NextPermissions != currentItem.NextPermissions) + itemInfo.Flags |= (uint)InventoryItemFlags.ObjectOverwriteNextOwner; + } // Next ALWAYS has move itemInfo.NextPermissions |= (uint)PermissionMask.Move; @@ -1667,7 +1701,7 @@ namespace OpenSim.Region.Framework.Scenes srcTaskItem.NextPermissions; destTaskItem.BasePermissions = srcTaskItem.BasePermissions & srcTaskItem.NextPermissions; - destTaskItem.CurrentPermissions |= 16; // Slam! + destTaskItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 982e280244..e8095c0831 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs @@ -122,7 +122,7 @@ namespace OpenSim.Region.Framework.Scenes taskItem.NextPermissions = item.NextPermissions; // We're adding this to a prim we don't own. Force // owner change - taskItem.CurrentPermissions |= 16; // Slam + taskItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; } else { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 900130a85d..91bb3a52dd 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -629,14 +629,19 @@ namespace OpenSim.Region.Framework.Scenes group.SetGroup(m_part.GroupID, null); - if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) + // TODO: Remove magic number badness + if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { foreach (SceneObjectPart part in partList) { - part.EveryoneMask = item.EveryonePermissions; - part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) + part.EveryoneMask = item.EveryonePermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) + part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) + part.GroupMask = item.GroupPermissions; } group.ApplyNextOwnerPermissions(); @@ -645,15 +650,20 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectPart part in partList) { - if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) + // TODO: Remove magic number badness + if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } - part.EveryoneMask = item.EveryonePermissions; - part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) + part.EveryoneMask = item.EveryonePermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) + part.NextOwnerMask = item.NextPermissions; + if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) + part.GroupMask = item.GroupPermissions; } rootPart.TrimPermissions(); From 705f4e1e4be44e6b96d028b3445681145a0c4d8f Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 12 Jan 2011 21:46:49 +0000 Subject: [PATCH 34/79] Dont' trust the viewer! Fix a permission slam error caused by trusting the viewer too much. --- .../Framework/InventoryAccess/InventoryAccessModule.cs | 6 ++++++ OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index f2cc16c693..7bb8789f16 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -637,6 +637,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess rootPart.Name = item.Name; rootPart.Description = item.Description; + if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0) + { + rootPart.ObjectSaleType = item.SaleType; + rootPart.SalePrice = item.SalePrice; + } + group.SetGroup(remoteClient.ActiveGroupId, remoteClient); if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0 || // Magic number diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 19fa6c5499..e2d96d9a37 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -326,7 +326,6 @@ namespace OpenSim.Region.Framework.Scenes { if (UUID.Zero == transactionID) { - item.Flags = itemUpd.Flags; item.Name = itemUpd.Name; item.Description = itemUpd.Description; if (item.NextPermissions != (itemUpd.NextPermissions & item.BasePermissions)) From 69c8cc787f0bcecd617aeeff3d2776ba159d82ee Mon Sep 17 00:00:00 2001 From: BlueWall Date: Thu, 13 Jan 2011 11:39:50 -0500 Subject: [PATCH 35/79] Make FireAndForgetWrapper a singleton class Made FireAndForgetWrapper a singleton class to allow us to drop dependancy on the BclExtras35 library. BclExtras is broken in Mono 2.8.2 and we used the library in only one function. --- OpenSim/Framework/Util.cs | 27 ++++++++++++++++++++++++--- bin/BclExtras35.dll | Bin 153600 -> 0 bytes prebuild.xml | 2 -- 3 files changed, 24 insertions(+), 5 deletions(-) delete mode 100644 bin/BclExtras35.dll diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 8d1671a885..d1d8736062 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -46,7 +46,7 @@ using System.Threading; using log4net; using Nini.Config; using Nwc.XmlRpc; -using BclExtras; +// using BclExtras; using OpenMetaverse; using OpenMetaverse.StructuredData; using Amib.Threading; @@ -1375,8 +1375,29 @@ namespace OpenSim.Framework /// /// Created to work around a limitation in Mono with nested delegates /// - private class FireAndForgetWrapper + private sealed class FireAndForgetWrapper { + private static volatile FireAndForgetWrapper instance; + private static object syncRoot = new Object(); + + public static FireAndForgetWrapper Instance { + get { + + if (instance == null) + { + lock (syncRoot) + { + if (instance == null) + { + instance = new FireAndForgetWrapper(); + } + } + } + + return instance; + } + } + public void FireAndForget(System.Threading.WaitCallback callback) { callback.BeginInvoke(null, EndFireAndForget, callback); @@ -1445,7 +1466,7 @@ namespace OpenSim.Framework ThreadPool.QueueUserWorkItem(callback, obj); break; case FireAndForgetMethod.BeginInvoke: - FireAndForgetWrapper wrapper = Singleton.GetInstance(); + FireAndForgetWrapper wrapper = FireAndForgetWrapper.Instance; wrapper.FireAndForget(callback, obj); break; case FireAndForgetMethod.SmartThreadPool: diff --git a/bin/BclExtras35.dll b/bin/BclExtras35.dll deleted file mode 100644 index 7a7480a3a174bb26fadd394ba7b8566d61cda0ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153600 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 - @@ -1597,7 +1596,6 @@ - From 30320077a292ba98f054794f9f817628bf2be0f9 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 14 Jan 2011 01:01:02 +0100 Subject: [PATCH 36/79] Fix slam bits being lost when editing perms in prim inventory --- OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 91bb3a52dd..004e20c254 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -695,7 +695,6 @@ namespace OpenSim.Region.Framework.Scenes { item.ParentID = m_part.UUID; item.ParentPartID = m_part.UUID; - item.Flags = m_items[item.ItemID].Flags; // If group permissions have been set on, check that the groupID is up to date in case it has // changed since permissions were last set. From 66f99ae2677c4cfc26d2376c1de9e8e5d7022dfd Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 11:03:46 -0800 Subject: [PATCH 37/79] More debug messages to help track the XFF header problem. --- OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs | 2 ++ OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs index 0066bd4d62..814a8d9581 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs @@ -223,6 +223,8 @@ namespace OpenSim.Server.Handlers.Hypergrid if (ep != null) return ep.Address.ToString(); } + else + m_log.WarnFormat("[HOME AGENT HANDLER]: No XFF header"); // Oops return Util.GetCallerIP(request); diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 9c41bcbd9c..b572cb3bce 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -208,6 +208,9 @@ namespace OpenSim.Server.Handlers.Simulation if (ep != null) return ep.Address.ToString(); } + else + m_log.WarnFormat("[AGENT HANDLER]: No XFF header"); + // Oops return Util.GetCallerIP(request); From 0aeb8981b2b147e2caf2614fbfe59bd7e4340aee Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 11:19:20 -0800 Subject: [PATCH 38/79] Brute force debug for XFF issue --- OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index b572cb3bce..96821ec86d 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -200,6 +200,13 @@ namespace OpenSim.Server.Handlers.Simulation // We're behind a proxy Hashtable headers = (Hashtable)request["headers"]; + + foreach (object o in headers.Keys) + { + if (o != null) + m_log.DebugFormat("[XXX] {0}", o.ToString()); + } + if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) { m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers["X-Forwarded-For"]); From 479d72ac975fd34f43d76c0ab20f869cb07fb6fc Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 11:37:39 -0800 Subject: [PATCH 39/79] Account for some component along the way lower-casing the HTTP header keys. (XFF header issue) --- .../Handlers/Hypergrid/HomeAgentHandlers.cs | 21 ++++++++++------ .../Handlers/Simulation/AgentHandlers.cs | 25 ++++++++----------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs index 814a8d9581..968c1e64c3 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs @@ -215,16 +215,21 @@ namespace OpenSim.Server.Handlers.Hypergrid // We're behind a proxy Hashtable headers = (Hashtable)request["headers"]; - if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) - { - m_log.DebugFormat("[HOME AGENT HANDLER]: XFF is {0}", headers["X-Forwarded-For"]); + string xff = "X-Forwarded-For"; + if (headers.ContainsKey(xff.ToLower())) + xff = xff.ToLower(); - IPEndPoint ep = Util.GetClientIPFromXFF((string)headers["X-Forwarded-For"]); - if (ep != null) - return ep.Address.ToString(); + if (!headers.ContainsKey(xff) || headers[xff] == null) + { + m_log.WarnFormat("[AGENT HANDLER]: No XFF header"); + return Util.GetCallerIP(request); } - else - m_log.WarnFormat("[HOME AGENT HANDLER]: No XFF header"); + + m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers[xff]); + + IPEndPoint ep = Util.GetClientIPFromXFF((string)headers[xff]); + if (ep != null) + return ep.Address.ToString(); // Oops return Util.GetCallerIP(request); diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 96821ec86d..57672a815f 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -200,24 +200,21 @@ namespace OpenSim.Server.Handlers.Simulation // We're behind a proxy Hashtable headers = (Hashtable)request["headers"]; + string xff = "X-Forwarded-For"; + if (headers.ContainsKey(xff.ToLower())) + xff = xff.ToLower(); - foreach (object o in headers.Keys) + if (!headers.ContainsKey(xff) || headers[xff] == null) { - if (o != null) - m_log.DebugFormat("[XXX] {0}", o.ToString()); - } - - if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) - { - m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers["X-Forwarded-For"]); - - IPEndPoint ep = Util.GetClientIPFromXFF((string)headers["X-Forwarded-For"]); - if (ep != null) - return ep.Address.ToString(); - } - else m_log.WarnFormat("[AGENT HANDLER]: No XFF header"); + return Util.GetCallerIP(request); + } + m_log.DebugFormat("[AGENT HANDLER]: XFF is {0}", headers[xff]); + + IPEndPoint ep = Util.GetClientIPFromXFF((string)headers[xff]); + if (ep != null) + return ep.Address.ToString(); // Oops return Util.GetCallerIP(request); From 5e35651efc98fd140a454c2dd6c5e826573f9dd6 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 11:45:13 -0800 Subject: [PATCH 40/79] Protect World Map module, RequestMapItemsAsync, from badly formed URLs. --- .../CoreModules/World/WorldMap/WorldMapModule.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index f9d28b964e..e0f36a2081 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs @@ -641,7 +641,17 @@ namespace OpenSim.Region.CoreModules.World.WorldMap lock (m_openRequests) m_openRequests.Add(requestID, mrs); - WebRequest mapitemsrequest = WebRequest.Create(httpserver); + WebRequest mapitemsrequest = null; + try + { + mapitemsrequest = WebRequest.Create(httpserver); + } + catch (Exception e) + { + m_log.DebugFormat("[WORLD MAP]: Access to {0} failed with {1}", httpserver, e); + return new OSDMap(); + } + mapitemsrequest.Method = "POST"; mapitemsrequest.ContentType = "application/xml+llsd"; OSDMap RAMap = new OSDMap(); From 59c2cd04ba056b85eb4873e472b95826a1cc13b5 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 12:35:19 -0800 Subject: [PATCH 41/79] DEBUG DEBUG DEBUG --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 ++++ OpenSim/Services/HypergridService/UserAgentService.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3a401968cc..8e4aaf16f7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -839,6 +839,7 @@ namespace OpenSim.Region.Framework.Scenes m_rootRegionHandle = m_scene.RegionInfo.RegionHandle; m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); + m_log.DebugFormat("[XXX] MakeRoot 1"); // Moved this from SendInitialData to ensure that m_appearance is initialized // before the inventory is processed in MakeRootAgent. This fixes a race condition @@ -899,6 +900,7 @@ namespace OpenSim.Region.Framework.Scenes } AddToPhysicalScene(isFlying); + m_log.DebugFormat("[XXX] MakeRoot 2"); if (m_appearance != null) { @@ -941,7 +943,9 @@ namespace OpenSim.Region.Framework.Scenes presence.Animator.SendAnimPackToClient(ControllingClient); }); + m_log.DebugFormat("[XXX] MakeRoot 3"); m_scene.EventManager.TriggerOnMakeRootAgent(this); + m_log.DebugFormat("[XXX] MakeRoot 4"); } ///

diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 3ead180a0b..d5842fbf3e 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -269,7 +269,7 @@ namespace OpenSim.Services.HypergridService bool result = m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed - m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}", + m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {2}; result is {3}", reportedIP, m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress, result); return result; From 4bcee1dfb4337fca342fd29916d5da3b4c7db954 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 13:07:02 -0800 Subject: [PATCH 42/79] Revert "DEBUG DEBUG DEBUG" This reverts commit 59c2cd04ba056b85eb4873e472b95826a1cc13b5. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 ---- OpenSim/Services/HypergridService/UserAgentService.cs | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 8e4aaf16f7..3a401968cc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -839,7 +839,6 @@ namespace OpenSim.Region.Framework.Scenes m_rootRegionHandle = m_scene.RegionInfo.RegionHandle; m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); - m_log.DebugFormat("[XXX] MakeRoot 1"); // Moved this from SendInitialData to ensure that m_appearance is initialized // before the inventory is processed in MakeRootAgent. This fixes a race condition @@ -900,7 +899,6 @@ namespace OpenSim.Region.Framework.Scenes } AddToPhysicalScene(isFlying); - m_log.DebugFormat("[XXX] MakeRoot 2"); if (m_appearance != null) { @@ -943,9 +941,7 @@ namespace OpenSim.Region.Framework.Scenes presence.Animator.SendAnimPackToClient(ControllingClient); }); - m_log.DebugFormat("[XXX] MakeRoot 3"); m_scene.EventManager.TriggerOnMakeRootAgent(this); - m_log.DebugFormat("[XXX] MakeRoot 4"); } /// diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index d5842fbf3e..3ead180a0b 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -269,7 +269,7 @@ namespace OpenSim.Services.HypergridService bool result = m_TravelingAgents[sessionID].ClientIPAddress == reportedIP || m_TravelingAgents[sessionID].MyIpAddress == reportedIP; // NATed - m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {2}; result is {3}", + m_log.DebugFormat("[USER AGENT SERVICE]: Comparing {0} with login IP {1} and MyIP {1}; result is {3}", reportedIP, m_TravelingAgents[sessionID].ClientIPAddress, m_TravelingAgents[sessionID].MyIpAddress, result); return result; From aecaadd3bdb8013addde47731e12427e2acc8994 Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 17 Jan 2011 13:10:09 -0800 Subject: [PATCH 43/79] objectId in AvatarAnimation packet should be UUID.Zero for non-overridden animations --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index ee4f04ea83..c765e68e35 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3466,8 +3466,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock(); ani.AnimationSourceList[i].ObjectID = objectIDs[i]; - if (objectIDs[i] == UUID.Zero) - ani.AnimationSourceList[i].ObjectID = sourceAgentId; } ani.Header.Reliable = false; OutPacket(ani, ThrottleOutPacketType.Task); From 81552099d6eaf1142cde4bbe864dfa1e752af5e5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 17 Jan 2011 23:45:25 +0000 Subject: [PATCH 44/79] Fix UnackedBytes client stack statistic as seen in "show queues" Bytes were being wrongly added again on a resend --- OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 2 -- .../Region/ClientStack/LindenUDP/UnackedPacketCollection.cs | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index e54cfc21ea..fe5156e9fe 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -585,8 +585,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Stats tracking Interlocked.Increment(ref udpClient.PacketsSent); - if (isReliable) - Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength); // Put the UDP payload on the wire AsyncBeginSend(buffer); diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs index 4cb4aeec02..d762bef134 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.Net; +using System.Threading; using OpenMetaverse; namespace OpenSim.Region.ClientStack.LindenUDP @@ -77,6 +78,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void Add(OutgoingPacket packet) { m_pendingAdds.Enqueue(packet); + Interlocked.Add(ref packet.Client.UnackedBytes, packet.Buffer.DataLength); } /// @@ -166,7 +168,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_packets.Remove(pendingRemove.SequenceNumber); // Update stats - System.Threading.Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength); + Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength); if (!pendingRemove.FromResend) { From 6e58996b4d9db202cd7795a37bd687362effef48 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 17 Jan 2011 23:57:50 +0000 Subject: [PATCH 45/79] refactor: remove redundant null checks --- .../LindenUDP/UnackedPacketCollection.cs | 45 +++++++------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs index d762bef134..9d40688ac6 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/UnackedPacketCollection.cs @@ -141,46 +141,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP private void ProcessQueues() { // Process all the pending adds - OutgoingPacket pendingAdd; - if (m_pendingAdds != null) - { - while (m_pendingAdds.TryDequeue(out pendingAdd)) - { - if (pendingAdd != null && m_packets != null) - { - m_packets[pendingAdd.SequenceNumber] = pendingAdd; - } - } - } + while (m_pendingAdds.TryDequeue(out pendingAdd)) + m_packets[pendingAdd.SequenceNumber] = pendingAdd; // Process all the pending removes, including updating statistics and round-trip times PendingAck pendingRemove; OutgoingPacket ackedPacket; - if (m_pendingRemoves != null) + while (m_pendingRemoves.TryDequeue(out pendingRemove)) { - while (m_pendingRemoves.TryDequeue(out pendingRemove)) + if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) { - if (m_pendingRemoves != null && m_packets != null) + m_packets.Remove(pendingRemove.SequenceNumber); + + // Update stats + Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength); + + if (!pendingRemove.FromResend) { - if (m_packets.TryGetValue(pendingRemove.SequenceNumber, out ackedPacket)) - { - m_packets.Remove(pendingRemove.SequenceNumber); - - // Update stats - Interlocked.Add(ref ackedPacket.Client.UnackedBytes, -ackedPacket.Buffer.DataLength); - - if (!pendingRemove.FromResend) - { - // Calculate the round-trip time for this packet and its ACK - int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount; - if (rtt > 0) - ackedPacket.Client.UpdateRoundTrip(rtt); - } - } + // Calculate the round-trip time for this packet and its ACK + int rtt = pendingRemove.RemoveTime - ackedPacket.TickCount; + if (rtt > 0) + ackedPacket.Client.UpdateRoundTrip(rtt); } } } } } -} +} \ No newline at end of file From 8233ef25ba53357bec02a9e3ad4759ef8d01ea1b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 18 Jan 2011 00:10:34 +0000 Subject: [PATCH 46/79] Reduce amount of debug lopgging put out by some simiangrid connectors. Please re-enable if needed. --- .../SimianGrid/SimianGridServiceConnector.cs | 2 +- .../SimianInventoryServiceConnector.cs | 4 +-- .../SimianPresenceServiceConnector.cs | 27 +++++++++---------- .../SimianUserAccountServiceConnector.cs | 8 +++--- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index 18a31670bc..b62459eee2 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -175,7 +175,7 @@ namespace OpenSim.Services.Connectors.SimianGrid } } - m_log.Debug("[SIMIAN GRID CONNECTOR]: Found " + regions.Count + " neighbors for region " + regionID); +// m_log.Debug("[SIMIAN GRID CONNECTOR]: Found " + regions.Count + " neighbors for region " + regionID); return regions; } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index 61f3fbedf1..39df1f5233 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs @@ -757,7 +757,7 @@ namespace OpenSim.Services.Connectors.SimianGrid } } - m_log.Debug("[SIMIAN INVENTORY CONNECTOR]: Parsed " + invFolders.Count + " folders from SimianGrid response"); +// m_log.Debug("[SIMIAN INVENTORY CONNECTOR]: Parsed " + invFolders.Count + " folders from SimianGrid response"); return invFolders; } @@ -824,7 +824,7 @@ namespace OpenSim.Services.Connectors.SimianGrid } } - m_log.Debug("[SIMIAN INVENTORY CONNECTOR]: Parsed " + invItems.Count + " items from SimianGrid response"); +// m_log.Debug("[SIMIAN INVENTORY CONNECTOR]: Parsed " + invItems.Count + " items from SimianGrid response"); return invItems; } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs index 8141420a1e..678f738abb 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianPresenceServiceConnector.cs @@ -158,7 +158,7 @@ namespace OpenSim.Services.Connectors.SimianGrid 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 { @@ -177,7 +177,7 @@ namespace OpenSim.Services.Connectors.SimianGrid 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 { @@ -202,7 +202,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public PresenceInfo GetAgent(UUID sessionID) { - m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent with sessionID " + sessionID); +// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting session data for agent with sessionID " + sessionID); NameValueCollection requestArgs = new NameValueCollection { @@ -262,7 +262,7 @@ namespace OpenSim.Services.Connectors.SimianGrid 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 if (!LogoutAgent(sessionID)) @@ -287,7 +287,7 @@ namespace OpenSim.Services.Connectors.SimianGrid 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 { @@ -312,10 +312,10 @@ namespace OpenSim.Services.Connectors.SimianGrid 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); - 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 { @@ -338,7 +338,7 @@ namespace OpenSim.Services.Connectors.SimianGrid 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 { @@ -362,7 +362,7 @@ namespace OpenSim.Services.Connectors.SimianGrid OSDMap userResponse = GetUserData(userID); if (userResponse != null) { - m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting sessions for " + userID); +// m_log.DebugFormat("[SIMIAN PRESENCE CONNECTOR]: Requesting sessions for " + userID); NameValueCollection requestArgs = new NameValueCollection { @@ -377,10 +377,10 @@ namespace OpenSim.Services.Connectors.SimianGrid if (presence != null) presences.Add(presence); } - else - { - m_log.Debug("[SIMIAN PRESENCE CONNECTOR]: No session returned for " + userID + ": " + response["Message"].AsString()); - } +// else +// { +// m_log.Debug("[SIMIAN PRESENCE CONNECTOR]: No session returned for " + userID + ": " + response["Message"].AsString()); +// } } return presences; @@ -424,7 +424,6 @@ namespace OpenSim.Services.Connectors.SimianGrid { if (userResponse != null && userResponse["User"] is OSDMap) { - GridUserInfo info = new GridUserInfo(); info.Online = true; diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 9c150ee417..91e2976586 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -157,7 +157,7 @@ namespace OpenSim.Services.Connectors.SimianGrid { List accounts = new List(); - m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Searching for user accounts with name query " + query); +// m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Searching for user accounts with name query " + query); NameValueCollection requestArgs = new NameValueCollection { @@ -193,7 +193,7 @@ namespace OpenSim.Services.Connectors.SimianGrid public bool StoreUserAccount(UserAccount data) { - m_log.InfoFormat("[SIMIAN ACCOUNT CONNECTOR]: Storing user account for " + data.Name); +// m_log.InfoFormat("[SIMIAN ACCOUNT CONNECTOR]: Storing user account for " + data.Name); NameValueCollection requestArgs = new NameValueCollection { @@ -250,7 +250,7 @@ namespace OpenSim.Services.Connectors.SimianGrid private UserAccount GetUser(NameValueCollection requestArgs) { string lookupValue = (requestArgs.Count > 1) ? requestArgs[1] : "(Unknown)"; - m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Looking up user account with query: " + lookupValue); +// m_log.DebugFormat("[SIMIAN ACCOUNT CONNECTOR]: Looking up user account with query: " + lookupValue); OSDMap response = WebUtil.PostToService(m_serverUrl, requestArgs); if (response["Success"].AsBoolean()) @@ -325,4 +325,4 @@ namespace OpenSim.Services.Connectors.SimianGrid } } } -} +} \ No newline at end of file From 523628dca30ea46c4da103f06e71931c36b7c063 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 18 Jan 2011 00:14:58 +0000 Subject: [PATCH 47/79] minor: remove mono compiler warnings --- .../Connectors/SimianGrid/SimianGridServiceConnector.cs | 4 ++-- OpenSim/Services/Connectors/Simulation/EstateDataService.cs | 6 +++--- .../Services/Connectors/Simulation/SimulationDataService.cs | 6 +++--- .../Connectors/Simulation/SimulationServiceConnector.cs | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index b62459eee2..918544f1f6 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -56,7 +56,7 @@ namespace OpenSim.Services.Connectors.SimianGrid MethodBase.GetCurrentMethod().DeclaringType); private string m_ServerURI = String.Empty; - private bool m_Enabled = false; +// private bool m_Enabled = false; public SimianGridServiceConnector() { } public SimianGridServiceConnector(string serverURI) @@ -93,7 +93,7 @@ namespace OpenSim.Services.Connectors.SimianGrid if (!serviceUrl.EndsWith("/") && !serviceUrl.EndsWith("=")) serviceUrl = serviceUrl + '/'; m_ServerURI = serviceUrl; - m_Enabled = true; +// m_Enabled = true; } #region IGridService diff --git a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs index 8a8b46d89b..b6df5a2595 100644 --- a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs +++ b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs @@ -43,9 +43,9 @@ namespace OpenSim.Services.Connectors { public class EstateDataService : ServiceBase, IEstateDataService { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); protected IEstateDataStore m_database; diff --git a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs index 0df9380547..ccef50b473 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationDataService.cs @@ -43,9 +43,9 @@ namespace OpenSim.Services.Connectors { public class SimulationDataService : ServiceBase, ISimulationDataService { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); protected ISimulationDataStore m_database; diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index f34c2bd59f..143c2968a3 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -237,7 +237,7 @@ namespace OpenSim.Services.Connectors.Simulation try { - OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000); + WebUtil.ServiceOSDRequest(uri, null, "DELETE", 10000); } catch (Exception e) { @@ -257,7 +257,7 @@ namespace OpenSim.Services.Connectors.Simulation try { - OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000); + WebUtil.ServiceOSDRequest(uri, null, "DELETE", 10000); } catch (Exception e) { @@ -303,7 +303,7 @@ namespace OpenSim.Services.Connectors.Simulation args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); - OSDMap result = WebUtil.PostToService(uri,args); + WebUtil.PostToService(uri, args); } catch (Exception e) { From c544f0d0c5fcea625107c0eff25be8aa0586564a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 18 Jan 2011 00:25:24 +0000 Subject: [PATCH 48/79] Prune some of the excess logging for client logins. Didn't touch the appearance related stuff. --- OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 6 +++--- OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs | 2 +- .../Region/CoreModules/Avatar/Assets/GetTextureModule.cs | 4 ++-- OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 +++--- OpenSim/Services/LLLoginService/LLLoginResponse.cs | 2 +- OpenSim/Services/LLLoginService/LLLoginService.cs | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index fe5156e9fe..571624b36f 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -857,9 +857,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Acknowledge the UseCircuitCode packet SendAckImmediate(remoteEndPoint, packet.Header.Sequence); - m_log.DebugFormat( - "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", - buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); +// m_log.DebugFormat( +// "[LLUDPSERVER]: Handling UseCircuitCode request from {0} took {1}ms", +// buffer.RemoteEndPoint, (DateTime.Now - startTime).Milliseconds); } private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs index 36aaab31dc..8347e35ac9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs @@ -102,7 +102,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets { UUID capID = UUID.Random(); - m_log.Info("[GETMESH]: /CAPS/" + capID); +// m_log.Info("[GETMESH]: /CAPS/" + capID); caps.RegisterHandler("GetMesh", new RestHTTPHandler("GET", "/CAPS/" + capID, delegate(Hashtable m_dhttpMethod) diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs index 1f60e36dea..6fb8b4625c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs @@ -105,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps { UUID capID = UUID.Random(); - m_log.InfoFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); +// m_log.InfoFormat("[GETTEXTURE]: /CAPS/{0} in region {1}", capID, m_scene.RegionInfo.RegionName); caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture)); } @@ -171,7 +171,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps /// False for "caller try another codec"; true otherwise private bool FetchTexture(OSHttpRequest httpRequest, OSHttpResponse httpResponse, UUID textureID, string format) { - m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format); +// m_log.DebugFormat("[GETTEXTURE]: {0} with requested format {1}", textureID, format); AssetBase texture; string fullID = textureID.ToString(); diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs index c011776ff9..008233bf55 100644 --- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs +++ b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs @@ -63,7 +63,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps { UUID capuuid = UUID.Random(); - m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); +// m_log.InfoFormat("[OBJECTADD]: {0}", "/CAPS/OA/" + capuuid + "/"); caps.RegisterHandler("ObjectAdd", new RestHTTPHandler("POST", "/CAPS/OA/" + capuuid + "/", diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3a401968cc..7b942028a9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1161,9 +1161,9 @@ namespace OpenSim.Region.Framework.Scenes friendsModule.SendFriendsOnlineIfNeeded(ControllingClient); } - m_log.DebugFormat( - "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", - client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", +// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); } /// diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index f985ab21ba..ebd6f7c1cf 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs @@ -661,7 +661,7 @@ namespace OpenSim.Services.LLLoginService protected virtual ArrayList GetInventoryLibrary(ILibraryService library) { Dictionary rootFolders = library.GetAllFolders(); - m_log.DebugFormat("[LLOGIN]: Library has {0} folders", rootFolders.Count); +// m_log.DebugFormat("[LLOGIN]: Library has {0} folders", rootFolders.Count); //Dictionary rootFolders = new Dictionary(); ArrayList folderHashes = new ArrayList(); diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 281b6e3d52..75688706cb 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -282,7 +282,7 @@ namespace OpenSim.Services.LLLoginService // Get active gestures List gestures = m_InventoryService.GetActiveGestures(account.PrincipalID); - m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); +// m_log.DebugFormat("[LLOGIN SERVICE]: {0} active gestures", gestures.Count); // // Login the presence From 3083c517a01b4265434f9286aa1c95b2b513549b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 18 Jan 2011 00:29:10 +0000 Subject: [PATCH 49/79] minor: resolve some mono compiler warnings --- .../Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- OpenSim/Services/HypergridService/GatekeeperService.cs | 2 +- OpenSim/Services/HypergridService/HGInventoryService.cs | 2 +- OpenSim/Services/HypergridService/UserAccountCache.cs | 7 ++++--- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 004e20c254..cff2cf4be7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -849,7 +849,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void RequestInventoryFile(IClientAPI client, IXfer xferManager) { - bool changed = CreateInventoryFile(); + CreateInventoryFile(); if (m_inventorySerial == 0) // No inventory { diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7b942028a9..03cd90f8d0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1108,7 +1108,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void CompleteMovement(IClientAPI client) { - DateTime startTime = DateTime.Now; +// DateTime startTime = DateTime.Now; m_log.DebugFormat( "[SCENE PRESENCE]: Completing movement of {0} into region {1}", diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index bbddd874c6..b66bfed42f 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -303,7 +303,7 @@ namespace OpenSim.Services.HypergridService return m_UserAgentService.VerifyAgent(aCircuit.SessionID, aCircuit.ServiceSessionID); else { - Object[] args = new Object[] { userURL }; +// Object[] args = new Object[] { userURL }; IUserAgentService userAgentService = new UserAgentServiceConnector(userURL); if (userAgentService != null) { diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs index 9ee1ae4c5f..4b026986ba 100644 --- a/OpenSim/Services/HypergridService/HGInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGInventoryService.cs @@ -53,7 +53,7 @@ namespace OpenSim.Services.HypergridService LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - protected new IXInventoryData m_Database; + protected IXInventoryData m_Database; private string m_ProfileServiceURL; private IUserAccountService m_UserAccountService; diff --git a/OpenSim/Services/HypergridService/UserAccountCache.cs b/OpenSim/Services/HypergridService/UserAccountCache.cs index 3e9aea10eb..65f9dd5d31 100644 --- a/OpenSim/Services/HypergridService/UserAccountCache.cs +++ b/OpenSim/Services/HypergridService/UserAccountCache.cs @@ -13,9 +13,10 @@ namespace OpenSim.Services.HypergridService { private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours! - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); + private ExpiringCache m_UUIDCache; private IUserAccountService m_UserAccountService; From 624bf23abb3f7cf58447c73cff5187963945a15a Mon Sep 17 00:00:00 2001 From: dahlia Date: Mon, 17 Jan 2011 16:39:53 -0800 Subject: [PATCH 50/79] force objectId to UUID.Zero for non-overridden animations in AvatarAnimation packet --- OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index c765e68e35..e43e3c9b34 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3465,7 +3465,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP ani.AnimationList[i].AnimSequenceID = seqs[i]; ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock(); - ani.AnimationSourceList[i].ObjectID = objectIDs[i]; + if (objectIDs[i].Equals(sourceAgentId)) + ani.AnimationSourceList[i].ObjectID = UUID.Zero; + else + ani.AnimationSourceList[i].ObjectID = objectIDs[i]; } ani.Header.Reliable = false; OutPacket(ani, ThrottleOutPacketType.Task); From 31144a62b34cf84cbc2c5508924294334fb76979 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 17 Jan 2011 21:22:32 +0100 Subject: [PATCH 51/79] Change gesture activation to not quash any other flags --- .../Region/CoreModules/Avatar/Gestures/GesturesModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs index 7303fe7828..914990cdb4 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs @@ -69,7 +69,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures item = invService.GetItem(item); if (item != null) { - item.Flags = 1; + item.Flags |= 1; invService.UpdateItem(item); } else @@ -85,7 +85,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures item = invService.GetItem(item); if (item != null) { - item.Flags = 0; + item.Flags &= ~1; invService.UpdateItem(item); } else @@ -93,4 +93,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures "[GESTURES]: Unable to find gesture to deactivate {0} for {1}", gestureId, client.Name); } } -} \ No newline at end of file +} From 75644e0f6e08e5b5866af3a44afcf1308b9513f1 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 Jan 2011 00:55:08 +0100 Subject: [PATCH 52/79] Prevent activation and deactivation of gestures from clobbering the slam bits --- OpenSim/Data/MySQL/MySQLInventoryData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs index 2dca3eb6a9..9d70acbeeb 100644 --- a/OpenSim/Data/MySQL/MySQLInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs @@ -867,7 +867,7 @@ namespace OpenSim.Data.MySQL dbcon.Open(); using (MySqlCommand sqlCmd = new MySqlCommand( - "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1", dbcon)) + "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags & 1", dbcon)) { sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); From c98d1cffe222085378ef8a9935f956882eae4ee9 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 17:40:48 -0800 Subject: [PATCH 53/79] Removed the call to sceneViewer.Reset upon MakeRoot and ChildAgentUpdate, because Reset hangs for a long time waiting for the lock. That is a problem in itself -- that long holding of the lock by some thread -- but let's just avoid it altogether. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3a401968cc..f811f3e11a 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -928,10 +928,6 @@ namespace OpenSim.Region.Framework.Scenes //else // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid); - // On the next prim update, all objects will be sent - // - m_sceneViewer.Reset(); - m_isChildAgent = false; // send the animations of the other presences to me @@ -2952,10 +2948,6 @@ namespace OpenSim.Region.Framework.Scenes if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0) ControllingClient.SetChildAgentThrottle(cAgentData.Throttles); - // Sends out the objects in the user's draw distance if m_sendTasksToChild is true. - if (m_scene.m_seeIntoRegionFromNeighbor) - m_sceneViewer.Reset(); - //cAgentData.AVHeight; m_rootRegionHandle = cAgentData.RegionHandle; //m_velocity = cAgentData.Velocity; From f73c90c63389cbdf568fd66840268b913f7f84da Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 17 Jan 2011 17:52:03 -0800 Subject: [PATCH 54/79] Put the 'new' back to avoid a warning. Yes, we want to hide it. --- OpenSim/Services/HypergridService/HGInventoryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Services/HypergridService/HGInventoryService.cs b/OpenSim/Services/HypergridService/HGInventoryService.cs index 4b026986ba..9ee1ae4c5f 100644 --- a/OpenSim/Services/HypergridService/HGInventoryService.cs +++ b/OpenSim/Services/HypergridService/HGInventoryService.cs @@ -53,7 +53,7 @@ namespace OpenSim.Services.HypergridService LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - protected IXInventoryData m_Database; + protected new IXInventoryData m_Database; private string m_ProfileServiceURL; private IUserAccountService m_UserAccountService; From 06e225bc0b881ca38f73b2598263c90c4bd129f2 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 Jan 2011 01:31:14 +0000 Subject: [PATCH 55/79] Also fix MySQLXInventoryData --- OpenSim/Data/MySQL/MySQLXInventoryData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Data/MySQL/MySQLXInventoryData.cs b/OpenSim/Data/MySQL/MySQLXInventoryData.cs index 3c73095fc3..287c4dda7b 100644 --- a/OpenSim/Data/MySQL/MySQLXInventoryData.cs +++ b/OpenSim/Data/MySQL/MySQLXInventoryData.cs @@ -130,7 +130,7 @@ namespace OpenSim.Data.MySQL { using (MySqlCommand cmd = new MySqlCommand()) { - cmd.CommandText = String.Format("select * from inventoryitems where avatarId = ?uuid and assetType = ?type and flags = 1", m_Realm); + cmd.CommandText = String.Format("select * from inventoryitems where avatarId = ?uuid and assetType = ?type and flags & 1", m_Realm); cmd.Parameters.AddWithValue("?uuid", principalID.ToString()); cmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); From 9f7b37b37cb746c603642df3c99e90f6ed0059ce Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 18 Jan 2011 01:48:28 +0000 Subject: [PATCH 56/79] Fix build break --- OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs index 914990cdb4..7df2beb5df 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gestures/GesturesModule.cs @@ -85,7 +85,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gestures item = invService.GetItem(item); if (item != null) { - item.Flags &= ~1; + item.Flags &= ~(uint)1; invService.UpdateItem(item); } else From 7f000ea88e3fb09ae1e6cb725ff6c32bef03e3bd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 19 Jan 2011 00:33:25 +0000 Subject: [PATCH 57/79] Correct "show queues" to show queued packet numbers for each client instead of bytes. Byte amounts aren't actually available - this was a misunderstanding of TokenBucket.Content. But raw packet numbers are. --- OpenSim/Region/Application/OpenSim.cs | 24 +++++++++---------- .../ClientStack/LindenUDP/LLUDPClient.cs | 18 +++++++------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 51eb396aa1..07c1e6779c 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -1014,22 +1014,22 @@ namespace OpenSim report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type", ""); report.AppendFormat( - "{0,9} {1,9} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", - "Packets", - "Packets", + "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", + "Pkts", + "Pkts", "Bytes", - "Bytes", - "Bytes", - "Bytes", - "Bytes", - "Bytes", - "Bytes", - "Bytes", - "Bytes"); + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts"); report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); report.AppendFormat( - "{0,9} {1,9} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", + "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", "Out", "In", "Unacked", diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index e02783ad4d..d4c33075eb 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs @@ -256,18 +256,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP public string GetStats() { return string.Format( - "{0,9} {1,9} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}", + "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}", PacketsSent, PacketsReceived, UnackedBytes, - m_throttleCategories[(int)ThrottleOutPacketType.Resend].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Land].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Wind].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Cloud].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Task].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Texture].Content, - m_throttleCategories[(int)ThrottleOutPacketType.Asset].Content, - m_throttleCategories[(int)ThrottleOutPacketType.State].Content); + m_packetOutboxes[(int)ThrottleOutPacketType.Resend].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Land].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Wind].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Cloud].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Task].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Texture].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.Asset].Count, + m_packetOutboxes[(int)ThrottleOutPacketType.State].Count); } public void SendPacketStats() From 97c0430093a7d66551b3502c5f4a81bae54d7250 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 19 Jan 2011 01:10:09 +0000 Subject: [PATCH 58/79] Downgrade and comment out some other caps messages for now --- .../Avatar/ObjectCaps/UploadObjectAssetModule.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs index 09b97196bf..e11e2524ce 100644 --- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs @@ -105,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps { UUID capID = UUID.Random(); - m_log.Info("[UploadObjectAssetModule]: /CAPS/" + capID); +// m_log.Debug("[UPLOAD OBJECT ASSET MODULE]: /CAPS/" + capID); caps.RegisterHandler("UploadObjectAsset", new RestHTTPHandler("POST", "/CAPS/OA/" + capID + "/", delegate(Hashtable m_dhttpMethod) @@ -156,7 +156,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps } catch (Exception ex) { - m_log.Error("[UploadObjectAssetModule]: Error deserializing message " + ex.ToString()); + m_log.Error("[UPLOAD OBJECT ASSET MODULE]: Error deserializing message " + ex.ToString()); message = null; } @@ -363,9 +363,8 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps responsedata["str_response_string"] = String.Format("local_id{0}", ConvertUintToBytes(allparts[0].LocalId)); return responsedata; - - } + private string ConvertUintToBytes(uint val) { byte[] resultbytes = Utils.UIntToBytes(val); @@ -374,4 +373,4 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps return String.Format("{0}", Convert.ToBase64String(resultbytes)); } } -} +} \ No newline at end of file From a42faca5b92f5c17c16b79fcf0df446d1aa08ae1 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 19 Jan 2011 01:13:10 +0000 Subject: [PATCH 59/79] With mic's permission, adjust long call time info messages to 500ms from 200ms --- OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs | 5 +++-- OpenSim/Framework/WebUtil.cs | 2 +- .../Assets/NewFileAgentInventoryVariablePriceModule.cs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 86ad7aa693..d4ee7ba56d 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -587,8 +587,9 @@ namespace OpenSim.Framework.Servers.HttpServer // Every month or so this will wrap and give bad numbers, not really a problem // since its just for reporting, 200ms limit can be adjusted int tickdiff = Environment.TickCount - tickstart; - if (tickdiff > 200) - m_log.InfoFormat("[BASE HTTP SERVER]: slow request <{0}> for {1} took {2} ms",reqnum,request.RawUrl,tickdiff); + if (tickdiff > 500) + m_log.InfoFormat( + "[BASE HTTP SERVER]: slow request <{0}> for {1} took {2} ms", reqnum, request.RawUrl, tickdiff); } } diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index d88d09517f..d731ac5882 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -58,7 +58,7 @@ namespace OpenSim.Framework // number of milliseconds a call can take before it is considered // a "long" call for warning & debugging purposes - public const int LongCallTime = 200; + public const int LongCallTime = 500; /// /// Send LLSD to an HTTP client in application/llsd+json form diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs index af26b2b5a3..63fad88dd2 100644 --- a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs @@ -104,7 +104,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets { UUID capID = UUID.Random(); - m_log.Info("[GETMESH]: /CAPS/" + capID); +// m_log.Debug("[NEW FILE AGENT INVENTORY VARIABLE PRICE]: /CAPS/" + capID); caps.RegisterHandler("NewFileAgentInventoryVariablePrice", new LLSDStreamhandler("POST", From 28fda1cab60d3a403537a0606416a7c008fe6183 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 19 Jan 2011 01:41:32 +0000 Subject: [PATCH 60/79] with mic's permission, reduce appearance, baked texture logging verbosity for now --- OpenSim/Framework/Capabilities/Caps.cs | 8 ++++---- .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs index dbb07817f6..c2f9c3ab7b 100644 --- a/OpenSim/Framework/Capabilities/Caps.cs +++ b/OpenSim/Framework/Capabilities/Caps.cs @@ -765,8 +765,8 @@ namespace OpenSim.Framework.Capabilities { try { - m_log.Debug("[CAPS]: UploadBakedTexture Request in region: " + - m_regionName); +// m_log.Debug("[CAPS]: UploadBakedTexture Request in region: " + +// m_regionName); string capsBase = "/CAPS/" + m_capsObjectPath; string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); @@ -1332,7 +1332,7 @@ namespace OpenSim.Framework.Capabilities newAssetID = UUID.Random(); uploaderPath = path; httpListener = httpServer; - m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID); +// m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID); } /// @@ -1360,7 +1360,7 @@ namespace OpenSim.Framework.Capabilities httpListener.RemoveStreamHandler("POST", uploaderPath); - m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID); +// m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID); return res; } diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 7d6d1912d7..ed0a290fd4 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -167,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory } } - m_log.InfoFormat("[AVFACTORY]: complete texture check for {0}",client.AgentId); + m_log.InfoFormat("[AVFACTORY]: complete texture check for {0}", client.AgentId); // If we only found default textures, then the appearance is not cached return (defonly ? false : true); @@ -187,7 +187,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return; } - m_log.InfoFormat("[AVFACTORY]: start SetAppearance for {0}",client.AgentId); +// m_log.InfoFormat("[AVFACTORY]: start SetAppearance for {0}", client.AgentId); // TODO: This is probably not necessary any longer, just assume the // textureEntry set implies that the appearance transaction is complete @@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory { changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; - m_log.InfoFormat("[AVFACTORY]: received texture update for {0}",client.AgentId); + m_log.InfoFormat("[AVFACTORY]: received texture update for {0}", client.AgentId); Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client,false); }); // This appears to be set only in the final stage of the appearance From d3dca7d25a405ec9f1f5a3272ea50e4cbdce551c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Wed, 19 Jan 2011 01:50:02 +0000 Subject: [PATCH 61/79] For now, comment out logging messages about IM sending, since these cause high spam for large group messaging --- .../Avatar/InstantMessage/MessageTransferModule.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs index 21a61a79a9..77c714710f 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs @@ -146,7 +146,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage if (!user.IsChildAgent) { // Local message - m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID); +// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID); user.ControllingClient.SendInstantMessage(im); // Message sent @@ -168,7 +168,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage // Local message ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; - m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); +// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); user.ControllingClient.SendInstantMessage(im); // Message sent @@ -177,7 +177,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage } } - m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); +// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); SendGridInstantMessageViaXMLRPC(im, result); return; From b0aebc6f3d8d0a9b086b4af3c8ad81c2daba7610 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 20 Jan 2011 21:41:48 +0000 Subject: [PATCH 62/79] minor: make "show info" help slightly clearer --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index cbab2dbc6a..865a0ed02f 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -175,7 +175,7 @@ namespace OpenSim.Framework.Servers m_console.Commands.AddCommand("base", false, "show info", "show info", - "Show general information", HandleShow); + "Show general information about the server", HandleShow); m_console.Commands.AddCommand("base", false, "show stats", "show stats", From f50780f4c2619e74def4c6d39ad5d763b9b64234 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 20 Jan 2011 21:56:48 +0000 Subject: [PATCH 63/79] remove unimplemented "show assets" command --- OpenSim/Region/Application/OpenSim.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 07c1e6779c..1832c3d772 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -283,10 +283,6 @@ namespace OpenSim "kick user [message]", "Kick a user off the simulator", KickUserCommand); - m_console.Commands.AddCommand("region", false, "show assets", - "show assets", - "Show asset data", HandleShow); - m_console.Commands.AddCommand("region", false, "show users", "show users [full]", "Show user data for users currently on the region", @@ -869,10 +865,6 @@ namespace OpenSim switch (showParams[0]) { - case "assets": - MainConsole.Instance.Output("Not implemented."); - break; - case "users": IList agents; if (showParams.Length > 1 && showParams[1] == "full") From 1baf63dbae8208172aa457963636116d42dbe9b3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 20 Jan 2011 22:57:12 +0000 Subject: [PATCH 64/79] Move "show queues" command out of OpenSim.cs and into a separate module. --- OpenSim/Region/Application/OpenSim.cs | 99 --------- .../Agent/UDP/Linden/LindenUDPModule.cs | 200 ++++++++++++++++++ 2 files changed, 200 insertions(+), 99 deletions(-) create mode 100644 OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 1832c3d772..00a97be415 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -301,13 +301,6 @@ namespace OpenSim m_console.Commands.AddCommand("region", false, "show regions", "show regions", "Show region data", HandleShow); - - m_console.Commands.AddCommand("region", false, "show queues", - "show queues [full]", - "Show queue data for each client", - "Without the 'full' option, only users actually on the region are shown." - + " With the 'full' option child agents of users in neighbouring regions are also shown.", - HandleShow); m_console.Commands.AddCommand("region", false, "show ratings", "show ratings", @@ -951,10 +944,6 @@ namespace OpenSim }); break; - case "queues": - Notice(GetQueuesReport(showParams)); - break; - case "ratings": m_sceneManager.ForEachScene( delegate(Scene scene) @@ -981,94 +970,6 @@ namespace OpenSim } } - /// - /// Generate UDP Queue data report for each client - /// - /// - /// - private string GetQueuesReport(string[] showParams) - { - bool showChildren = false; - - if (showParams.Length > 1 && showParams[1] == "full") - showChildren = true; - - StringBuilder report = new StringBuilder(); - - int columnPadding = 2; - int maxNameLength = 18; - int maxRegionNameLength = 14; - int maxTypeLength = 4; - int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - - report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", ""); - report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", ""); - report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type", ""); - - report.AppendFormat( - "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", - "Pkts", - "Pkts", - "Bytes", - "Pkts", - "Pkts", - "Pkts", - "Pkts", - "Pkts", - "Pkts", - "Pkts", - "Pkts"); - - report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); - report.AppendFormat( - "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", - "Out", - "In", - "Unacked", - "Resend", - "Land", - "Wind", - "Cloud", - "Task", - "Texture", - "Asset", - "State"); - - m_sceneManager.ForEachScene( - delegate(Scene scene) - { - scene.ForEachClient( - delegate(IClientAPI client) - { - if (client is IStatsCollector) - { - bool isChild = scene.PresenceChildStatus(client.AgentId); - if (isChild && !showChildren) - return; - - string name = client.Name; - string regionName = scene.RegionInfo.RegionName; - - report.AppendFormat( - "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", - name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); - report.AppendFormat( - "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", - regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); - report.AppendFormat( - "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", - isChild ? "Cd" : "Rt", ""); - - IStatsCollector stats = (IStatsCollector)client; - - report.AppendLine(stats.Report()); - } - }); - }); - - return report.ToString(); - } - /// /// Use XML2 format to serialize data to a file /// diff --git a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs new file mode 100644 index 0000000000..3240434a74 --- /dev/null +++ b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs @@ -0,0 +1,200 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using log4net; +using Mono.Addins; +using Nini.Config; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Statistics; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; + +namespace OpenSim.Region.CoreModules.UDP.Linden +{ + /// + /// A module that just holds commands for inspecting/changing the Linden UDP client stack + /// + /// + /// All actual client stack functionality remains in OpenSim.Region.ClientStack.LindenUDP + /// + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPModule")] + public class LindenUDPModule : ISharedRegionModule + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected Dictionary m_scenes = new Dictionary(); + + public string Name { get { return "Linden UDP Module"; } } + + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: INITIALIZED MODULE"); + } + + public void PostInitialise() + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: POST INITIALIZED MODULE"); + } + + public void Close() + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: CLOSED MODULE"); + } + + public void AddRegion(Scene scene) + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes[scene.RegionInfo.RegionID] = scene; + + scene.AddCommand( + this, "show queues", + "show queues [full]", + "Show queue data for each client", + "Without the 'full' option, only users actually on the region are shown." + + " With the 'full' option child agents of users in neighbouring regions are also shown.", + ShowQueuesReport); + } + + public void RemoveRegion(Scene scene) + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); + + lock (m_scenes) + m_scenes.Remove(scene.RegionInfo.RegionID); + } + + public void RegionLoaded(Scene scene) + { +// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); + } + + protected void ShowQueuesReport(string module, string[] cmd) + { + MainConsole.Instance.Output(GetQueuesReport(cmd)); + } + + /// + /// Generate UDP Queue data report for each client + /// + /// + /// + protected string GetQueuesReport(string[] showParams) + { + bool showChildren = false; + + if (showParams.Length > 2 && showParams[2] == "full") + showChildren = true; + + StringBuilder report = new StringBuilder(); + + int columnPadding = 2; + int maxNameLength = 18; + int maxRegionNameLength = 14; + int maxTypeLength = 4; + int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + + report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", ""); + report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", ""); + report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type", ""); + + report.AppendFormat( + "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", + "Pkts", + "Pkts", + "Bytes", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts", + "Pkts"); + + report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); + report.AppendFormat( + "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", + "Out", + "In", + "Unacked", + "Resend", + "Land", + "Wind", + "Cloud", + "Task", + "Texture", + "Asset", + "State"); + + lock (m_scenes) + { + foreach (Scene scene in m_scenes.Values) + { + scene.ForEachClient( + delegate(IClientAPI client) + { + if (client is IStatsCollector) + { + bool isChild = scene.PresenceChildStatus(client.AgentId); + if (isChild && !showChildren) + return; + + string name = client.Name; + string regionName = scene.RegionInfo.RegionName; + + report.AppendFormat( + "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", + name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); + report.AppendFormat( + "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", + regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); + report.AppendFormat( + "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", + isChild ? "Cd" : "Rt", ""); + + IStatsCollector stats = (IStatsCollector)client; + + report.AppendLine(stats.Report()); + } + }); + } + } + + return report.ToString(); + } + } +} \ No newline at end of file From df740d8e5c2ce5f43eac11917390b783b4d91230 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 20 Jan 2011 23:21:25 +0000 Subject: [PATCH 65/79] remove reference to CoreModules from ClientStack.LindenUDP client stack uses modules in the same way that scene does - through their interfaces --- .../Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs | 4 ++-- prebuild.xml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs index 3240434a74..11e3f4ac62 100644 --- a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs +++ b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs @@ -86,7 +86,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden "Show queue data for each client", "Without the 'full' option, only users actually on the region are shown." + " With the 'full' option child agents of users in neighbouring regions are also shown.", - ShowQueuesReport); + ShowQueuesReport); } public void RemoveRegion(Scene scene) @@ -195,6 +195,6 @@ namespace OpenSim.Region.CoreModules.UDP.Linden } return report.ToString(); - } + } } } \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index 854149b3f6..73cc81e717 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1556,7 +1556,6 @@ - From 58eb6b5fa3f95c2bd649329de5b1c9789e9861be Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 20 Jan 2011 23:22:45 +0000 Subject: [PATCH 66/79] minor: help text adjustment for "show queues" --- .../Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs index 11e3f4ac62..29583dc210 100644 --- a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs +++ b/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs @@ -84,8 +84,8 @@ namespace OpenSim.Region.CoreModules.UDP.Linden this, "show queues", "show queues [full]", "Show queue data for each client", - "Without the 'full' option, only users actually on the region are shown." - + " With the 'full' option child agents of users in neighbouring regions are also shown.", + "Without the 'full' option, only root agents are shown." + + " With the 'full' option child agents are also shown.", ShowQueuesReport); } From c383dbd06dd98ca96543c9bfdf9a7376a7e55cc2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 00:38:16 +0000 Subject: [PATCH 67/79] implement "show throttles" command for showing current agent throttles and the server settings. This is in a very crude state, currently. The LindenUDPModule was renamed LindenUDPInfoModule and moved to OptionalModules OptionalModules was given a direct reference to OpenSim.Region.ClientStack.LindenUDP so that it can inspect specific LindenUDP settings without having to generalize those to all client views (some of which may have no concept of the settings involved). This might be ess messy if OpenSim.Region.ClientStack.LindenUDP were a region module instead, like MXP, IRC and NPC --- .../ClientStack/LindenUDP/LLClientView.cs | 1 + .../ClientStack/LindenUDP/LLUDPServer.cs | 8 +- .../Agent/UDP/Linden/LindenUDPInfoModule.cs} | 150 ++++++++++++++++-- prebuild.xml | 109 ++++++------- 4 files changed, 201 insertions(+), 67 deletions(-) rename OpenSim/Region/{CoreModules/Agent/UDP/Linden/LindenUDPModule.cs => OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs} (50%) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index e43e3c9b34..5dab1bc35e 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -368,6 +368,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Properties public LLUDPClient UDPClient { get { return m_udpClient; } } + public LLUDPServer UDPServer { get { return m_udpServer; } } public IPEndPoint RemoteEndPoint { get { return m_udpClient.RemoteEndPoint; } } public UUID SecureSessionId { get { return m_secureSessionId; } } public IScene Scene { get { return m_scene; } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 571624b36f..df8ddbbd8b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -114,8 +114,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP //private UDPClientCollection m_clients = new UDPClientCollection(); /// Bandwidth throttle for this UDP server protected TokenBucket m_throttle; + /// Bandwidth throttle rates for this UDP server - protected ThrottleRates m_throttleRates; + public ThrottleRates ThrottleRates { get; private set; } + /// Manages authentication for agent circuits private AgentCircuitManager m_circuitManager; /// Reference to the scene this UDP server is attached to @@ -226,7 +228,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP #endregion BinaryStats m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps); - m_throttleRates = new ThrottleRates(configSource); + ThrottleRates = new ThrottleRates(configSource); } public void Start() @@ -922,7 +924,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo) { // Create the LLUDPClient - LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO); + LLUDPClient udpClient = new LLUDPClient(this, ThrottleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO); IClientAPI existingClient; if (!m_scene.TryGetClient(agentID, out existingClient)) diff --git a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs similarity index 50% rename from OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs rename to OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 29583dc210..480df31d7d 100644 --- a/OpenSim/Region/CoreModules/Agent/UDP/Linden/LindenUDPModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -36,19 +36,20 @@ using OpenMetaverse; using OpenSim.Framework; using OpenSim.Framework.Console; using OpenSim.Framework.Statistics; +using OpenSim.Region.ClientStack.LindenUDP; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.CoreModules.UDP.Linden { /// - /// A module that just holds commands for inspecting/changing the Linden UDP client stack + /// A module that just holds commands for inspecting the current state of the Linden UDP stack. /// /// /// All actual client stack functionality remains in OpenSim.Region.ClientStack.LindenUDP /// - [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPModule")] - public class LindenUDPModule : ISharedRegionModule + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")] + public class LindenUDPInfoModule : ISharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -60,22 +61,22 @@ namespace OpenSim.Region.CoreModules.UDP.Linden public void Initialise(IConfigSource source) { -// m_log.DebugFormat("[LINDEN UDP MODULE]: INITIALIZED MODULE"); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: INITIALIZED MODULE"); } public void PostInitialise() { -// m_log.DebugFormat("[LINDEN UDP MODULE]: POST INITIALIZED MODULE"); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: POST INITIALIZED MODULE"); } public void Close() { -// m_log.DebugFormat("[LINDEN UDP MODULE]: CLOSED MODULE"); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: CLOSED MODULE"); } public void AddRegion(Scene scene) { -// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName); lock (m_scenes) m_scenes[scene.RegionInfo.RegionID] = scene; @@ -86,12 +87,20 @@ namespace OpenSim.Region.CoreModules.UDP.Linden "Show queue data for each client", "Without the 'full' option, only root agents are shown." + " With the 'full' option child agents are also shown.", - ShowQueuesReport); + ShowQueuesReport); + + scene.AddCommand( + this, "show throttles", + "show throttles [full]", + "Show throttle settings for each client and for the server overall", + "Without the 'full' option, only root agents are shown." + + " With the 'full' option child agents are also shown.", + ShowThrottlesReport); } public void RemoveRegion(Scene scene) { -// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName); lock (m_scenes) m_scenes.Remove(scene.RegionInfo.RegionID); @@ -99,7 +108,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden public void RegionLoaded(Scene scene) { -// m_log.DebugFormat("[LINDEN UDP MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); +// m_log.DebugFormat("[LINDEN UDP INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName); } protected void ShowQueuesReport(string module, string[] cmd) @@ -107,6 +116,11 @@ namespace OpenSim.Region.CoreModules.UDP.Linden MainConsole.Instance.Output(GetQueuesReport(cmd)); } + protected void ShowThrottlesReport(string module, string[] cmd) + { + MainConsole.Instance.Output(GetThrottlesReport(cmd)); + } + /// /// Generate UDP Queue data report for each client /// @@ -194,7 +208,123 @@ namespace OpenSim.Region.CoreModules.UDP.Linden } } + return report.ToString(); + } + + /// + /// Show throttle data + /// + /// + /// + protected string GetThrottlesReport(string[] showParams) + { + bool showChildren = false; + + if (showParams.Length > 2 && showParams[2] == "full") + showChildren = true; + + StringBuilder report = new StringBuilder(); + + int columnPadding = 2; + int maxNameLength = 18; + int maxRegionNameLength = 14; + int maxTypeLength = 4; + int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + + report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", ""); + report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", ""); + report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type\n", ""); + + bool firstClient = true; + + lock (m_scenes) + { + foreach (Scene scene in m_scenes.Values) + { + scene.ForEachClient( + delegate(IClientAPI client) + { + if (client is LLClientView) + { + LLClientView llClient = client as LLClientView; + + if (firstClient) + { + report.AppendLine(GetServerThrottlesReport(llClient.UDPServer, scene)); + firstClient = false; + } + + bool isChild = scene.PresenceChildStatus(client.AgentId); + if (isChild && !showChildren) + return; + + string name = client.Name; + string regionName = scene.RegionInfo.RegionName; + + LLUDPClient llUdpClient = llClient.UDPClient; + ClientInfo ci = llUdpClient.GetClientInfo(); + + report.AppendFormat( + "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", + name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); + report.AppendFormat( + "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", + regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); + report.AppendFormat( + "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", + isChild ? "Cd" : "Rt", ""); + + report.Append((ci.totalThrottle * 8) / 1000 + " "); + report.Append((ci.resendThrottle * 8) / 1000 + " "); + report.Append((ci.landThrottle * 8) / 1000 + " "); + report.Append((ci.windThrottle * 8) / 1000 + " "); + report.Append((ci.cloudThrottle * 8) / 1000 + " "); + report.Append((ci.taskThrottle * 8) / 1000 + " "); + report.Append((ci.textureThrottle * 8) / 1000 + " "); + report.Append((ci.assetThrottle * 8) / 1000 + " "); + + report.AppendLine(); + } + }); + } + } + return report.ToString(); } + + protected string GetServerThrottlesReport(LLUDPServer udpServer, Scene scene) + { + StringBuilder report = new StringBuilder(); + + int columnPadding = 2; + int maxNameLength = 18; + int maxRegionNameLength = 14; + int maxTypeLength = 4; + int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + + string name = "SERVER LIMITS"; + string regionName = scene.RegionInfo.RegionName; + + report.AppendFormat( + "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", + name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); + report.AppendFormat( + "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", + regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); + report.AppendFormat( + "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "n/a", ""); + + ThrottleRates throttleRates = udpServer.ThrottleRates; + report.Append("n/a"); + report.Append((throttleRates.ResendLimit * 8) / 1000 + " "); + report.Append((throttleRates.LandLimit * 8) / 1000 + " "); + report.Append((throttleRates.WindLimit * 8) / 1000 + " "); + report.Append((throttleRates.CloudLimit * 8) / 1000 + " "); + report.Append((throttleRates.TaskLimit * 8) / 1000 + " "); + report.Append((throttleRates.TextureLimit * 8) / 1000 + " "); + report.Append((throttleRates.AssetLimit * 8) / 1000 + " "); + + return report.ToString(); + } } } \ No newline at end of file diff --git a/prebuild.xml b/prebuild.xml index 73cc81e717..0d6d6fb08d 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1439,60 +1439,6 @@ - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1606,6 +1552,61 @@ + + + + ../../../bin/ + + + + + ../../../bin/ + + + + ../../../bin/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 38debbc59fe29d2b0bb6ea1f075e43c960f53676 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 00:56:37 +0000 Subject: [PATCH 68/79] crudely refactor table generation code for "show queues" and "show throttles" --- .../Agent/UDP/Linden/LindenUDPInfoModule.cs | 71 ++++++++----------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 480df31d7d..0a256a140c 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -121,6 +121,14 @@ namespace OpenSim.Region.CoreModules.UDP.Linden MainConsole.Instance.Output(GetThrottlesReport(cmd)); } + protected string GetColumnEntry(string entry, int maxLength, int columnPadding) + { + return string.Format( + "{0,-" + maxLength + "}{1,-" + columnPadding + "}", + entry.Length > maxLength ? entry.Substring(0, maxLength) : entry, + ""); + } + /// /// Generate UDP Queue data report for each client /// @@ -140,10 +148,10 @@ namespace OpenSim.Region.CoreModules.UDP.Linden int maxRegionNameLength = 14; int maxTypeLength = 4; int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - - report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", ""); - report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", ""); - report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type", ""); + + report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); + report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); report.AppendFormat( "{0,7} {1,7} {2,9} {3,8} {4,7} {5,7} {6,7} {7,7} {8,9} {9,7} {10,7}\n", @@ -190,15 +198,9 @@ namespace OpenSim.Region.CoreModules.UDP.Linden string name = client.Name; string regionName = scene.RegionInfo.RegionName; - report.AppendFormat( - "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", - name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); - report.AppendFormat( - "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", - regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); - report.AppendFormat( - "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", - isChild ? "Cd" : "Rt", ""); + report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); + report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); IStatsCollector stats = (IStatsCollector)client; @@ -228,12 +230,11 @@ namespace OpenSim.Region.CoreModules.UDP.Linden int columnPadding = 2; int maxNameLength = 18; int maxRegionNameLength = 14; - int maxTypeLength = 4; - int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; - - report.AppendFormat("{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", "User", ""); - report.AppendFormat("{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", "Region", ""); - report.AppendFormat("{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "Type\n", ""); + int maxTypeLength = 4; + + report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); + report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry("Type\n", maxTypeLength, columnPadding)); bool firstClient = true; @@ -263,16 +264,10 @@ namespace OpenSim.Region.CoreModules.UDP.Linden LLUDPClient llUdpClient = llClient.UDPClient; ClientInfo ci = llUdpClient.GetClientInfo(); - - report.AppendFormat( - "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", - name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); - report.AppendFormat( - "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", - regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); - report.AppendFormat( - "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", - isChild ? "Cd" : "Rt", ""); + + report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); + report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); report.Append((ci.totalThrottle * 8) / 1000 + " "); report.Append((ci.resendThrottle * 8) / 1000 + " "); @@ -299,23 +294,17 @@ namespace OpenSim.Region.CoreModules.UDP.Linden int columnPadding = 2; int maxNameLength = 18; int maxRegionNameLength = 14; - int maxTypeLength = 4; - int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; + int maxTypeLength = 4; string name = "SERVER LIMITS"; string regionName = scene.RegionInfo.RegionName; - - report.AppendFormat( - "{0,-" + maxNameLength + "}{1,-" + columnPadding + "}", - name.Length > maxNameLength ? name.Substring(0, maxNameLength) : name, ""); - report.AppendFormat( - "{0,-" + maxRegionNameLength + "}{1,-" + columnPadding + "}", - regionName.Length > maxRegionNameLength ? regionName.Substring(0, maxRegionNameLength) : regionName, ""); - report.AppendFormat( - "{0,-" + maxTypeLength + "}{1,-" + columnPadding + "}", "n/a", ""); + + report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); + report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry("n/a", maxTypeLength, columnPadding)); ThrottleRates throttleRates = udpServer.ThrottleRates; - report.Append("n/a"); + report.Append("n/a "); report.Append((throttleRates.ResendLimit * 8) / 1000 + " "); report.Append((throttleRates.LandLimit * 8) / 1000 + " "); report.Append((throttleRates.WindLimit * 8) / 1000 + " "); From 9971fdbcd5910a73f81d0a970bc3d49aad6a7d95 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 22:31:46 +0000 Subject: [PATCH 69/79] properly format "show throttles" table --- .../Agent/UDP/Linden/LindenUDPInfoModule.cs | 81 +++++++++++++------ 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 0a256a140c..9a5f2ed927 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -230,11 +230,37 @@ namespace OpenSim.Region.CoreModules.UDP.Linden int columnPadding = 2; int maxNameLength = 18; int maxRegionNameLength = 14; - int maxTypeLength = 4; + int maxTypeLength = 4; + int totalInfoFieldsLength = maxNameLength + columnPadding + maxRegionNameLength + columnPadding + maxTypeLength + columnPadding; report.Append(GetColumnEntry("User", maxNameLength, columnPadding)); report.Append(GetColumnEntry("Region", maxRegionNameLength, columnPadding)); - report.Append(GetColumnEntry("Type\n", maxTypeLength, columnPadding)); + report.Append(GetColumnEntry("Type", maxTypeLength, columnPadding)); + + report.AppendFormat( + "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}\n", + "Total", + "Resend", + "Land", + "Wind", + "Cloud", + "Task", + "Texture", + "Asset"); + + report.AppendFormat("{0,-" + totalInfoFieldsLength + "}", ""); + report.AppendFormat( + "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}", + "kb/s", + "kb/s", + "kb/s", + "kb/s", + "kb/s", + "kb/s", + "kb/s", + "kb/s"); + + report.AppendLine(); bool firstClient = true; @@ -251,7 +277,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden if (firstClient) { - report.AppendLine(GetServerThrottlesReport(llClient.UDPServer, scene)); + report.AppendLine(GetServerThrottlesReport(llClient.UDPServer)); firstClient = false; } @@ -268,15 +294,17 @@ namespace OpenSim.Region.CoreModules.UDP.Linden report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); - - report.Append((ci.totalThrottle * 8) / 1000 + " "); - report.Append((ci.resendThrottle * 8) / 1000 + " "); - report.Append((ci.landThrottle * 8) / 1000 + " "); - report.Append((ci.windThrottle * 8) / 1000 + " "); - report.Append((ci.cloudThrottle * 8) / 1000 + " "); - report.Append((ci.taskThrottle * 8) / 1000 + " "); - report.Append((ci.textureThrottle * 8) / 1000 + " "); - report.Append((ci.assetThrottle * 8) / 1000 + " "); + + report.AppendFormat( + "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}\n", + (ci.totalThrottle * 8) / 1000, + (ci.resendThrottle * 8) / 1000, + (ci.landThrottle * 8) / 1000, + (ci.windThrottle * 8) / 1000, + (ci.cloudThrottle * 8) / 1000, + (ci.taskThrottle * 8) / 1000, + (ci.textureThrottle * 8) / 1000, + (ci.assetThrottle * 8) / 1000); report.AppendLine(); } @@ -287,31 +315,32 @@ namespace OpenSim.Region.CoreModules.UDP.Linden return report.ToString(); } - protected string GetServerThrottlesReport(LLUDPServer udpServer, Scene scene) + protected string GetServerThrottlesReport(LLUDPServer udpServer) { StringBuilder report = new StringBuilder(); int columnPadding = 2; int maxNameLength = 18; int maxRegionNameLength = 14; - int maxTypeLength = 4; + int maxTypeLength = 4; - string name = "SERVER LIMITS"; - string regionName = scene.RegionInfo.RegionName; + string name = "SERVER AGENT LIMITS"; report.Append(GetColumnEntry(name, maxNameLength, columnPadding)); - report.Append(GetColumnEntry(regionName, maxRegionNameLength, columnPadding)); - report.Append(GetColumnEntry("n/a", maxTypeLength, columnPadding)); + report.Append(GetColumnEntry("-", maxRegionNameLength, columnPadding)); + report.Append(GetColumnEntry("-", maxTypeLength, columnPadding)); ThrottleRates throttleRates = udpServer.ThrottleRates; - report.Append("n/a "); - report.Append((throttleRates.ResendLimit * 8) / 1000 + " "); - report.Append((throttleRates.LandLimit * 8) / 1000 + " "); - report.Append((throttleRates.WindLimit * 8) / 1000 + " "); - report.Append((throttleRates.CloudLimit * 8) / 1000 + " "); - report.Append((throttleRates.TaskLimit * 8) / 1000 + " "); - report.Append((throttleRates.TextureLimit * 8) / 1000 + " "); - report.Append((throttleRates.AssetLimit * 8) / 1000 + " "); + report.AppendFormat( + "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}", + "n/a", + (throttleRates.ResendLimit * 8) / 1000, + (throttleRates.LandLimit * 8) / 1000, + (throttleRates.WindLimit * 8) / 1000, + (throttleRates.CloudLimit * 8) / 1000, + (throttleRates.TaskLimit * 8) / 1000, + (throttleRates.TextureLimit * 8) / 1000, + (throttleRates.AssetLimit * 8) / 1000); return report.ToString(); } From 6ef7ea454c966b5eee2702a5fcbf9f48f85db48d Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 22:48:04 +0000 Subject: [PATCH 70/79] Remove old 2 year unused linden stack region module shell --- OpenSim/Client/Linden/LLClientStackModule.cs | 136 ------------------ .../Linden/Resources/LindenModules.addin.xml | 13 -- prebuild.xml | 40 ------ 3 files changed, 189 deletions(-) delete mode 100644 OpenSim/Client/Linden/LLClientStackModule.cs delete mode 100644 OpenSim/Client/Linden/Resources/LindenModules.addin.xml diff --git a/OpenSim/Client/Linden/LLClientStackModule.cs b/OpenSim/Client/Linden/LLClientStackModule.cs deleted file mode 100644 index f882d5d301..0000000000 --- a/OpenSim/Client/Linden/LLClientStackModule.cs +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Net; -using System.Reflection; -using System.Text; -using log4net; -using Nini.Config; -using OpenMetaverse; -using OpenSim.Region.ClientStack; -using OpenSim.Region.ClientStack.LindenUDP; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; - -namespace OpenSim.Client.Linden -{ - /// - /// Linden UDP Stack Region Module - /// - public class LLClientStackModule : INonSharedRegionModule - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - #region IRegionModule Members - - /// - /// Scene that contains the region's data - /// - protected Scene m_scene; - protected bool m_createClientStack = false; - protected IClientNetworkServer m_clientServer; - protected ClientStackManager m_clientStackManager; - protected IConfigSource m_source; - - protected string m_clientStackDll = "OpenSim.Region.ClientStack.LindenUDP.dll"; - - public void Initialise(IConfigSource source) - { - if (m_scene == null) - { - m_source = source; - - IConfig startupConfig = m_source.Configs["Startup"]; - if (startupConfig != null) - { - m_clientStackDll = startupConfig.GetString("clientstack_plugin", "OpenSim.Region.ClientStack.LindenUDP.dll"); - } - } - } - - public void AddRegion(Scene scene) - { - - } - - public void RemoveRegion(Scene scene) - { - - } - - public void RegionLoaded(Scene scene) - { - if (m_scene == null) - { - m_scene = scene; - } - - if ((m_scene != null) && (m_createClientStack)) - { - m_log.Info("[LLClientStackModule] Starting up LLClientStack."); - IPEndPoint endPoint = m_scene.RegionInfo.InternalEndPoint; - - uint port = (uint)endPoint.Port; - m_clientStackManager = new ClientStackManager(m_clientStackDll); - - m_clientServer - = m_clientStackManager.CreateServer(endPoint.Address, - ref port, m_scene.RegionInfo.ProxyOffset, m_scene.RegionInfo.m_allow_alternate_ports, m_source, - m_scene.AuthenticateHandler); - - m_clientServer.AddScene(m_scene); - - m_clientServer.Start(); - } - } - - public void Close() - { - - } - - public Type ReplaceableInterface - { - get { return null; } - } - - public string Name - { - get { return "LLClientStackModule"; } - } - - public bool IsSharedModule - { - get { return false; } - } - - #endregion - } -} diff --git a/OpenSim/Client/Linden/Resources/LindenModules.addin.xml b/OpenSim/Client/Linden/Resources/LindenModules.addin.xml deleted file mode 100644 index af41e98cea..0000000000 --- a/OpenSim/Client/Linden/Resources/LindenModules.addin.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/prebuild.xml b/prebuild.xml index 0d6d6fb08d..cbe539ea17 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1991,7 +1991,6 @@ - @@ -2023,45 +2022,6 @@ - - - - ../../../bin/ - - - - - ../../../bin/ - - - - ../../../bin/ - - - - - - - - - - - - - - - - - - - - - - - - - - From 5f3f7c3405e94ef6d7ea83a89083ab16bcef5719 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 22:48:49 +0000 Subject: [PATCH 71/79] minor: remove unnecessary newline from "show throttles" information --- .../OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs index 9a5f2ed927..87d067c961 100644 --- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs +++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs @@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden report.Append(GetColumnEntry(isChild ? "Cd" : "Rt", maxTypeLength, columnPadding)); report.AppendFormat( - "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}\n", + "{0,7} {1,8} {2,7} {3,7} {4,7} {5,7} {6,9} {7,7}", (ci.totalThrottle * 8) / 1000, (ci.resendThrottle * 8) / 1000, (ci.landThrottle * 8) / 1000, From bf5ec8cb88219c8fefd7b396d5bd03110d3fa0e5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 22:51:52 +0000 Subject: [PATCH 72/79] remove some mono compiler warnings and unnecessary dictionary instantiations --- .../Server/Handlers/Grid/GridInfoServerInConnector.cs | 2 +- OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs | 3 ++- .../Handlers/Hypergrid/GatekeeperServerConnector.cs | 6 +++--- .../Handlers/Hypergrid/UserAgentServerConnector.cs | 6 +++--- .../Server/Handlers/Inventory/XInventoryInConnector.cs | 9 --------- .../Handlers/Presence/PresenceServerPostHandler.cs | 2 -- .../Handlers/Simulation/SimulationServiceInConnector.cs | 2 +- 7 files changed, 10 insertions(+), 20 deletions(-) diff --git a/OpenSim/Server/Handlers/Grid/GridInfoServerInConnector.cs b/OpenSim/Server/Handlers/Grid/GridInfoServerInConnector.cs index c9e80d980e..8472d34f1c 100644 --- a/OpenSim/Server/Handlers/Grid/GridInfoServerInConnector.cs +++ b/OpenSim/Server/Handlers/Grid/GridInfoServerInConnector.cs @@ -39,7 +39,7 @@ namespace OpenSim.Server.Handlers.Grid { public class GridInfoServerInConnector : ServiceConnector { - private string m_ConfigName = "GridInfoService"; +// private string m_ConfigName = "GridInfoService"; public GridInfoServerInConnector(IConfigSource config, IHttpServer server, string configName) : base(config, server, configName) diff --git a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs index 31eefb1a6e..f3f81b07c9 100644 --- a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs @@ -51,7 +51,8 @@ namespace OpenSim.Server.Handlers.Hypergrid { public class GatekeeperAgentHandler : OpenSim.Server.Handlers.Simulation.AgentHandler { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private IGatekeeperService m_GatekeeperService; public GatekeeperAgentHandler(IGatekeeperService gatekeeper, bool proxy) diff --git a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs index 49de8b1c66..3d0967f2de 100644 --- a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs @@ -41,9 +41,9 @@ namespace OpenSim.Server.Handlers.Hypergrid { public class GatekeeperServiceInConnector : ServiceConnector { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); private IGatekeeperService m_GatekeeperService; public IGatekeeperService GateKeeper diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index e5f6a5def5..0e8ce800a7 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs @@ -47,9 +47,9 @@ namespace OpenSim.Server.Handlers.Hypergrid { public class UserAgentServerConnector : ServiceConnector { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); private IUserAgentService m_HomeUsersService; diff --git a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs index 00f035c883..899f9c0979 100644 --- a/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs +++ b/OpenSim/Server/Handlers/Inventory/XInventoryInConnector.cs @@ -347,7 +347,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleAddFolder(Dictionary request) { - Dictionary result = new Dictionary(); InventoryFolderBase folder = BuildFolder(request); if (m_InventoryService.AddFolder(folder)) @@ -358,7 +357,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleUpdateFolder(Dictionary request) { - Dictionary result = new Dictionary(); InventoryFolderBase folder = BuildFolder(request); if (m_InventoryService.UpdateFolder(folder)) @@ -369,7 +367,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleMoveFolder(Dictionary request) { - Dictionary result = new Dictionary(); UUID parentID = UUID.Zero; UUID.TryParse(request["ParentID"].ToString(), out parentID); UUID folderID = UUID.Zero; @@ -387,7 +384,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleDeleteFolders(Dictionary request) { - Dictionary result = new Dictionary(); UUID principal = UUID.Zero; UUID.TryParse(request["PRINCIPAL"].ToString(), out principal); List slist = (List)request["FOLDERS"]; @@ -408,7 +404,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandlePurgeFolder(Dictionary request) { - Dictionary result = new Dictionary(); UUID folderID = UUID.Zero; UUID.TryParse(request["ID"].ToString(), out folderID); @@ -421,7 +416,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleAddItem(Dictionary request) { - Dictionary result = new Dictionary(); InventoryItemBase item = BuildItem(request); if (m_InventoryService.AddItem(item)) @@ -432,7 +426,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleUpdateItem(Dictionary request) { - Dictionary result = new Dictionary(); InventoryItemBase item = BuildItem(request); if (m_InventoryService.UpdateItem(item)) @@ -443,7 +436,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleMoveItems(Dictionary request) { - Dictionary result = new Dictionary(); List idlist = (List)request["IDLIST"]; List destlist = (List)request["DESTLIST"]; UUID principal = UUID.Zero; @@ -482,7 +474,6 @@ namespace OpenSim.Server.Handlers.Asset byte[] HandleDeleteItems(Dictionary request) { - Dictionary result = new Dictionary(); UUID principal = UUID.Zero; UUID.TryParse(request["PRINCIPAL"].ToString(), out principal); List slist = (List)request["ITEMS"]; diff --git a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs index 3104917f83..85bf96e930 100644 --- a/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs +++ b/OpenSim/Server/Handlers/Presence/PresenceServerPostHandler.cs @@ -129,8 +129,6 @@ namespace OpenSim.Server.Handlers.Presence byte[] LogoutAgent(Dictionary request) { UUID session = UUID.Zero; - Vector3 position = Vector3.Zero; - Vector3 lookat = Vector3.Zero; if (!request.ContainsKey("SessionID")) return FailureResult(); diff --git a/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs b/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs index 50d6fb207b..f33eda7f03 100644 --- a/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs +++ b/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs @@ -38,7 +38,7 @@ namespace OpenSim.Server.Handlers.Simulation public class SimulationServiceInConnector : ServiceConnector { private ISimulationService m_LocalSimulationService; - private IAuthenticationService m_AuthenticationService; +// private IAuthenticationService m_AuthenticationService; public SimulationServiceInConnector(IConfigSource config, IHttpServer server, IScene scene) : base(config, server, String.Empty) From 43f948d6913ab33a9f5e11c631b0d64b2ef73b04 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 23:05:53 +0000 Subject: [PATCH 73/79] add current console log level to "show info" --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 865a0ed02f..6eb7686f0e 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -371,8 +371,7 @@ namespace OpenSim.Framework.Servers switch (showParams[0]) { case "info": - Notice("Version: " + m_version); - Notice("Startup directory: " + m_startupDirectory); + ShowInfo(); break; case "stats": @@ -395,6 +394,14 @@ namespace OpenSim.Framework.Servers break; } } + + protected void ShowInfo() + { + Notice("Version: " + m_version); + Notice("Startup directory: " + m_startupDirectory); + if (null != m_consoleAppender) + Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); + } /// /// Console output is only possible if a console has been established. From e44ceaaea3ec42fad63c5437e57e8c96a74e64e0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 23:07:19 +0000 Subject: [PATCH 74/79] make "show info" and "show version" show the same version text --- OpenSim/Framework/Servers/BaseOpenSimServer.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 6eb7686f0e..147fbd5091 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -388,20 +388,23 @@ namespace OpenSim.Framework.Servers break; case "version": - Notice( - String.Format( - "Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion)); + Notice(GetVersionText()); break; } } protected void ShowInfo() { - Notice("Version: " + m_version); + Notice(GetVersionText()); Notice("Startup directory: " + m_startupDirectory); if (null != m_consoleAppender) Notice(String.Format("Console log level: {0}", m_consoleAppender.Threshold)); } + + protected string GetVersionText() + { + return String.Format("Version: {0} (interface version {1})", m_version, VersionInfo.MajorInterfaceVersion); + } /// /// Console output is only possible if a console has been established. From 41105948bdb21d8f53ad3aeeb8cfdddb8aa7367c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 23:19:44 +0000 Subject: [PATCH 75/79] remove some mono compiler warnings --- .../Agent/AssetTransaction/AgentAssetsTransactions.cs | 4 ++-- OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs | 5 +++-- .../Assets/NewFileAgentInventoryVariablePriceModule.cs | 5 +++-- OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs | 5 +++-- .../Avatar/ObjectCaps/UploadObjectAssetModule.cs | 6 ++---- .../CoreModules/World/Estate/EstateManagementModule.cs | 6 ++++-- OpenSim/Region/CoreModules/World/Sound/SoundModule.cs | 2 +- OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs | 4 +--- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index c66a4ea26b..771038e1af 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -41,8 +41,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// public class AgentAssetTransactions { - private static readonly ILog m_log = LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); // Fields private bool m_dumpAssetsToFile; diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs index 8347e35ac9..878242a447 100644 --- a/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetMeshModule.cs @@ -49,8 +49,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class GetMeshModule : INonSharedRegionModule { - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Scene m_scene; private IAssetService m_assetService; diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs index 63fad88dd2..542af25b87 100644 --- a/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Assets/NewFileAgentInventoryVariablePriceModule.cs @@ -50,8 +50,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Assets [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] public class NewFileAgentInventoryVariablePriceModule : INonSharedRegionModule { - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Scene m_scene; private IAssetService m_assetService; private bool m_dumpAssetsToFile = false; diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs index 008233bf55..a0d72ede22 100644 --- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs +++ b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/ObjectAdd.cs @@ -43,8 +43,9 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps { public class ObjectAdd : IRegionModule { - private static readonly ILog m_log = - LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private Scene m_scene; #region IRegionModule Members diff --git a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs index e11e2524ce..3114d7ff59 100644 --- a/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/ObjectCaps/UploadObjectAssetModule.cs @@ -174,7 +174,7 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps Vector3 pos = avatar.AbsolutePosition + (Vector3.UnitX * avatar.Rotation); Quaternion rot = Quaternion.Identity; Vector3 rootpos = Vector3.Zero; - Quaternion rootrot = Quaternion.Identity; +// Quaternion rootrot = Quaternion.Identity; SceneObjectGroup rootGroup = null; SceneObjectGroup[] allparts = new SceneObjectGroup[message.Objects.Length]; @@ -186,11 +186,9 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps if (i == 0) { rootpos = obj.Position; - rootrot = obj.Rotation; - +// rootrot = obj.Rotation; } - // Combine the extraparams data into it's ugly blob again.... //int bytelength = 0; //for (int extparams = 0; extparams < obj.ExtraParams.Length; extparams++) diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index ddae20f21c..b0563c5ff1 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -767,6 +767,7 @@ namespace OpenSim.Region.CoreModules.World.Estate LookupUUIDS icon = (LookupUUIDS)iar.AsyncState; icon.EndInvoke(iar); } + private void LookupUUID(List uuidLst) { LookupUUIDS d = LookupUUIDsAsync; @@ -775,6 +776,7 @@ namespace OpenSim.Region.CoreModules.World.Estate LookupUUIDSCompleted, d); } + private void LookupUUIDsAsync(List uuidLst) { UUID[] uuidarr; @@ -789,12 +791,12 @@ namespace OpenSim.Region.CoreModules.World.Estate // string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]); IUserManagement userManager = m_scene.RequestModuleInterface(); - string userName = "Unkown User"; if (userManager != null) - userName = userManager.GetUserName(uuidarr[i]); + userManager.GetUserName(uuidarr[i]); // we drop it. It gets cached though... so we're ready for the next request. // diva commnent 11/21/2010: uh?!? wft? + // justincc comment 21/01/2011: A side effect of userManager.GetUserName() I presume. } } #endregion diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index 8df44feb8c..09c0ebb17f 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs @@ -38,7 +38,7 @@ namespace OpenSim.Region.CoreModules.World.Sound { public class SoundModule : IRegionModule, ISoundModule { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); protected Scene m_scene; diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs index af59d7a1ba..522a7eb120 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Perlin.cs @@ -85,9 +85,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap public static float noise1(float arg) { int bx0, bx1; - float rx0, rx1, sx, t, u, v, a; - - a = arg; + float rx0, rx1, sx, t, u, v; t = arg + N; bx0 = ((int)t) & BM; From cb14e1d2720fdee0c77280d7c397c02116c278ca Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 21 Jan 2011 23:59:55 +0000 Subject: [PATCH 76/79] Update the "config get
" command to "config get [
] []" The config get command shows a current config value on the console. Now, if is omitted then all the values for the given section are printed. If
is ommitted then all sections and all keys are printed. Current config can also be dumped to a file using "config save ". This can be handy for resolving or eliminating config issues --- OpenSim/Framework/Console/ConsoleBase.cs | 5 ++ .../Framework/Servers/BaseOpenSimServer.cs | 14 ++++ OpenSim/Region/Application/OpenSim.cs | 70 ++++++++++++------- 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/OpenSim/Framework/Console/ConsoleBase.cs b/OpenSim/Framework/Console/ConsoleBase.cs index 22ce88060c..3ef76cf588 100755 --- a/OpenSim/Framework/Console/ConsoleBase.cs +++ b/OpenSim/Framework/Console/ConsoleBase.cs @@ -75,6 +75,11 @@ namespace OpenSim.Framework.Console { System.Console.WriteLine(text); } + + public virtual void OutputFormat(string format, params string[] components) + { + Output(string.Format(format, components)); + } public string CmdPrompt(string p) { diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 147fbd5091..b28ad69a5e 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -411,6 +411,7 @@ namespace OpenSim.Framework.Servers /// That is something that cannot be determined within this class. So /// all attempts to use the console MUST be verified. ///
+ /// protected void Notice(string msg) { if (m_console != null) @@ -418,6 +419,19 @@ namespace OpenSim.Framework.Servers m_console.Output(msg); } } + + /// + /// Console output is only possible if a console has been established. + /// That is something that cannot be determined within this class. So + /// all attempts to use the console MUST be verified. + /// + /// + /// + protected void Notice(string format, params string[] components) + { + if (m_console != null) + m_console.OutputFormat(format, components); + } /// /// Enhance the version string with extra information if it's available. diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 00a97be415..ed4b6203c7 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -324,16 +324,19 @@ namespace OpenSim "Restart all sims in this instance", RunCommand); m_console.Commands.AddCommand("region", false, "config set", - "config set
", - "Set a config option", HandleConfig); + "config set
", + "Set a config option. In most cases this is not useful since changed parameters are not dynamically reloaded. Neither do changed parameters persist - you will have to change a config file manually and restart.", HandleConfig); m_console.Commands.AddCommand("region", false, "config get", - "config get
", - "Read a config option", HandleConfig); + "config get [
] []", + "Show a config option", + "If neither section nor field are specified, then the whole current configuration is printed." + Environment.NewLine + + "If a section is given but not a field, then all fields in that section are printed.", + HandleConfig); m_console.Commands.AddCommand("region", false, "config save", - "config save", - "Save current configuration", HandleConfig); + "config save ", + "Save current configuration to a file at the given path", HandleConfig); m_console.Commands.AddCommand("region", false, "command-script", "command-script