diff options
author | Tleiades Hax | 2007-10-18 15:10:43 +0000 |
---|---|---|
committer | Tleiades Hax | 2007-10-18 15:10:43 +0000 |
commit | 05df8571323c535b5c1ce1b0532e88236b143b7e (patch) | |
tree | 6f275d5b682231906315363514e98b7b06557fda /OpenSim/Region/Communications/OGS1 | |
parent | * Removed some comments (diff) | |
download | opensim-SC-05df8571323c535b5c1ce1b0532e88236b143b7e.zip opensim-SC-05df8571323c535b5c1ce1b0532e88236b143b7e.tar.gz opensim-SC-05df8571323c535b5c1ce1b0532e88236b143b7e.tar.bz2 opensim-SC-05df8571323c535b5c1ce1b0532e88236b143b7e.tar.xz |
Possible fix for: Remoting exceptions with adjacent non-running sims.
Bugs 449, 454, 408, 244, 197
implemented InformClientOfNeighbours as an asynchroneous process, handling timeouts without blocking the main thread.
Improved logging of errors, removed catch all in try catch
Diffstat (limited to 'OpenSim/Region/Communications/OGS1')
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 1264052..1a9584a 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | |||
@@ -30,9 +30,12 @@ using System; | |||
30 | using System.Collections; | 30 | using System.Collections; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Net; | 32 | using System.Net; |
33 | using System.Net.Sockets; | ||
33 | using System.Runtime.Remoting; | 34 | using System.Runtime.Remoting; |
34 | using System.Runtime.Remoting.Channels; | 35 | using System.Runtime.Remoting.Channels; |
35 | using System.Runtime.Remoting.Channels.Tcp; | 36 | using System.Runtime.Remoting.Channels.Tcp; |
37 | using System.Security.Authentication; | ||
38 | |||
36 | using libsecondlife; | 39 | using libsecondlife; |
37 | using Nwc.XmlRpc; | 40 | using Nwc.XmlRpc; |
38 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
@@ -78,7 +81,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
78 | // Login / Authentication | 81 | // Login / Authentication |
79 | 82 | ||
80 | GridParams["authkey"] = serversInfo.GridSendKey; | 83 | GridParams["authkey"] = serversInfo.GridSendKey; |
81 | GridParams["UUID"] = regionInfo.SimUUID.ToStringHyphenated(); | 84 | GridParams["UUID"] = regionInfo.RegionID.ToStringHyphenated(); |
82 | GridParams["sim_ip"] = regionInfo.ExternalHostName; | 85 | GridParams["sim_ip"] = regionInfo.ExternalHostName; |
83 | GridParams["sim_port"] = regionInfo.InternalEndPoint.Port.ToString(); | 86 | GridParams["sim_port"] = regionInfo.InternalEndPoint.Port.ToString(); |
84 | GridParams["region_locx"] = regionInfo.RegionLocX.ToString(); | 87 | GridParams["region_locx"] = regionInfo.RegionLocX.ToString(); |
@@ -115,12 +118,12 @@ namespace OpenSim.Region.Communications.OGS1 | |||
115 | /// </summary> | 118 | /// </summary> |
116 | /// <param name="regionInfo"></param> | 119 | /// <param name="regionInfo"></param> |
117 | /// <returns></returns> | 120 | /// <returns></returns> |
118 | public List<RegionInfo> RequestNeighbours(RegionInfo regionInfo) | 121 | public List<SimpleRegionInfo> RequestNeighbours(uint x, uint y) |
119 | { | 122 | { |
120 | 123 | ||
121 | Hashtable respData = MapBlockQuery((int)regionInfo.RegionLocX - 1, (int)regionInfo.RegionLocY - 1, (int)regionInfo.RegionLocX + 1, (int)regionInfo.RegionLocY + 1); | 124 | Hashtable respData = MapBlockQuery((int)x - 1, (int)y - 1, (int)x + 1, (int)y + 1); |
122 | 125 | ||
123 | List<RegionInfo> neighbours = new List<RegionInfo>(); | 126 | List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>(); |
124 | 127 | ||
125 | foreach (ArrayList neighboursList in respData.Values) | 128 | foreach (ArrayList neighboursList in respData.Values) |
126 | { | 129 | { |
@@ -128,27 +131,20 @@ namespace OpenSim.Region.Communications.OGS1 | |||
128 | { | 131 | { |
129 | uint regX = Convert.ToUInt32(neighbourData["x"]); | 132 | uint regX = Convert.ToUInt32(neighbourData["x"]); |
130 | uint regY = Convert.ToUInt32(neighbourData["y"]); | 133 | uint regY = Convert.ToUInt32(neighbourData["y"]); |
131 | if ((regionInfo.RegionLocX != regX) || (regionInfo.RegionLocY != regY)) | 134 | if ((x != regX) || (y != regY)) |
132 | { | 135 | { |
136 | |||
133 | string simIp = (string)neighbourData["sim_ip"]; | 137 | string simIp = (string)neighbourData["sim_ip"]; |
134 | 138 | ||
135 | uint port = Convert.ToUInt32(neighbourData["sim_port"]); | 139 | int port = Convert.ToInt32(neighbourData["sim_port"]); |
136 | string externalUri = (string)neighbourData["sim_uri"]; | 140 | string externalUri = (string)neighbourData["sim_uri"]; |
137 | 141 | ||
138 | string externalIpStr = OpenSim.Framework.Utilities.Util.GetHostFromDNS(simIp).ToString(); | 142 | string externalIpStr = OpenSim.Framework.Utilities.Util.GetHostFromDNS(simIp).ToString(); |
139 | IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(externalIpStr), (int)port); | 143 | SimpleRegionInfo sri = new SimpleRegionInfo(regX, regY, simIp, port); |
140 | string neighbourExternalUri = externalUri; | 144 | sri.RemotingPort = Convert.ToUInt32(neighbourData["remoting_port"]); |
141 | RegionInfo neighbour = new RegionInfo(regX, regY, neighbourInternalEndPoint, externalIpStr); | 145 | sri.RegionID = new LLUUID((string)neighbourData["uuid"]); |
142 | |||
143 | //OGS1 | ||
144 | //neighbour.RegionHandle = (ulong)n["regionhandle"]; is now calculated locally | ||
145 | |||
146 | neighbour.RegionName = (string)neighbourData["name"]; | ||
147 | 146 | ||
148 | //OGS1+ | 147 | neighbours.Add(sri); |
149 | neighbour.SimUUID = new LLUUID((string)neighbourData["uuid"]); | ||
150 | |||
151 | neighbours.Add(neighbour); | ||
152 | } | 148 | } |
153 | } | 149 | } |
154 | } | 150 | } |
@@ -199,7 +195,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
199 | regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]); | 195 | regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]); |
200 | regionInfo.RemotingAddress = internalIpStr; | 196 | regionInfo.RemotingAddress = internalIpStr; |
201 | 197 | ||
202 | regionInfo.SimUUID = new LLUUID((string)responseData["region_UUID"]); | 198 | regionInfo.RegionID = new LLUUID((string)responseData["region_UUID"]); |
203 | regionInfo.RegionName = (string)responseData["region_name"]; | 199 | regionInfo.RegionName = (string)responseData["region_name"]; |
204 | 200 | ||
205 | return regionInfo; | 201 | return regionInfo; |
@@ -365,6 +361,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
365 | OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( | 361 | OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( |
366 | typeof(OGS1InterRegionRemoting), | 362 | typeof(OGS1InterRegionRemoting), |
367 | "tcp://" + regInfo.RemotingAddress + ":" + regInfo.RemotingPort + "/InterRegions"); | 363 | "tcp://" + regInfo.RemotingAddress + ":" + regInfo.RemotingPort + "/InterRegions"); |
364 | |||
368 | if (remObject != null) | 365 | if (remObject != null) |
369 | { | 366 | { |
370 | retValue = remObject.InformRegionOfChildAgent(regionHandle, agentData); | 367 | retValue = remObject.InformRegionOfChildAgent(regionHandle, agentData); |
@@ -386,10 +383,27 @@ namespace OpenSim.Region.Communications.OGS1 | |||
386 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); | 383 | MainLog.Instance.Error("Remoting Error: Unable to connect to remote region.\n" + e.ToString()); |
387 | return false; | 384 | return false; |
388 | } | 385 | } |
389 | catch | 386 | catch (SocketException e) |
387 | { | ||
388 | MainLog.Instance.Error("Socket Error: Unable to connect to remote region.\n" + e.ToString()); | ||
389 | return false; | ||
390 | } | ||
391 | catch (InvalidCredentialException e) | ||
392 | { | ||
393 | MainLog.Instance.Error("Invalid Credentials: Unable to connect to remote region.\n" + e.ToString()); | ||
394 | return false; | ||
395 | } | ||
396 | catch (AuthenticationException e) | ||
397 | { | ||
398 | MainLog.Instance.Error("Authentication exception: Unable to connect to remote region.\n" + e.ToString()); | ||
399 | return false; | ||
400 | } | ||
401 | catch (Exception e) | ||
390 | { | 402 | { |
403 | MainLog.Instance.Error("Unknown exception: Unable to connect to remote region.\n" + e.ToString()); | ||
391 | return false; | 404 | return false; |
392 | } | 405 | } |
406 | return true; | ||
393 | } | 407 | } |
394 | 408 | ||
395 | /// <summary> | 409 | /// <summary> |