diff options
Diffstat (limited to 'OpenSim/Region/Communications')
-rw-r--r-- | OpenSim/Region/Communications/Local/LocalBackEndServices.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | 183 |
2 files changed, 191 insertions, 50 deletions
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index 746a19a..6e807ec 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs | |||
@@ -42,6 +42,28 @@ namespace OpenSim.Region.Communications.Local | |||
42 | 42 | ||
43 | private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); | 43 | private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); |
44 | 44 | ||
45 | public string _gdebugRegionName = ""; | ||
46 | |||
47 | public string gdebugRegionName | ||
48 | { | ||
49 | get { return _gdebugRegionName; } | ||
50 | set | ||
51 | { | ||
52 | _gdebugRegionName = value; | ||
53 | |||
54 | } | ||
55 | } | ||
56 | public string _rdebugRegionName = ""; | ||
57 | |||
58 | public string rdebugRegionName | ||
59 | { | ||
60 | get { return _rdebugRegionName; } | ||
61 | set | ||
62 | { | ||
63 | _rdebugRegionName = value; | ||
64 | |||
65 | } | ||
66 | } | ||
45 | public LocalBackEndServices() | 67 | public LocalBackEndServices() |
46 | { | 68 | { |
47 | } | 69 | } |
@@ -54,18 +76,36 @@ namespace OpenSim.Region.Communications.Local | |||
54 | public RegionCommsListener RegisterRegion(RegionInfo regionInfo) | 76 | public RegionCommsListener RegisterRegion(RegionInfo regionInfo) |
55 | { | 77 | { |
56 | //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); | 78 | //Console.WriteLine("CommsManager - Region " + regionInfo.RegionHandle + " , " + regionInfo.RegionLocX + " , "+ regionInfo.RegionLocY +" is registering"); |
57 | if (!m_regions.ContainsKey( regionInfo.RegionHandle)) | 79 | if (!m_regions.ContainsKey(regionInfo.RegionHandle)) |
58 | { | 80 | { |
59 | //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); | 81 | //Console.WriteLine("CommsManager - Adding Region " + regionInfo.RegionHandle ); |
60 | m_regions.Add(regionInfo.RegionHandle, regionInfo); | 82 | m_regions.Add(regionInfo.RegionHandle, regionInfo); |
61 | 83 | ||
62 | RegionCommsListener regionHost = new RegionCommsListener(); | 84 | RegionCommsListener regionHost = new RegionCommsListener(); |
85 | if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) | ||
86 | { | ||
87 | OpenSim.Framework.Console.MainLog.Instance.Error("INTERREGION", "Error:Region registered twice as an Events listener for Interregion Communications but not as a listed region. In Standalone mode this will cause BIG issues. In grid mode, it means a region went down and came back up."); | ||
88 | m_regionListeners.Remove(regionInfo.RegionHandle); | ||
89 | } | ||
63 | m_regionListeners.Add(regionInfo.RegionHandle, regionHost); | 90 | m_regionListeners.Add(regionInfo.RegionHandle, regionHost); |
64 | 91 | ||
65 | return regionHost; | 92 | return regionHost; |
66 | } | 93 | } |
94 | else | ||
95 | { | ||
96 | // Already in our list, so the region went dead and restarted. | ||
97 | m_regions.Remove(regionInfo.RegionHandle); | ||
98 | OpenSim.Framework.Console.MainLog.Instance.Warn("INTERREGION", "Region registered twice. Region went down and came back up."); | ||
67 | 99 | ||
68 | //already in our list of regions so for now lets return null | 100 | RegionCommsListener regionHost = new RegionCommsListener(); |
101 | if (m_regionListeners.ContainsKey(regionInfo.RegionHandle)) | ||
102 | { | ||
103 | m_regionListeners.Remove(regionInfo.RegionHandle); | ||
104 | } | ||
105 | m_regionListeners.Add(regionInfo.RegionHandle, regionHost); | ||
106 | |||
107 | return regionHost; | ||
108 | } | ||
69 | return null; | 109 | return null; |
70 | } | 110 | } |
71 | 111 | ||
@@ -168,7 +208,7 @@ namespace OpenSim.Region.Communications.Local | |||
168 | listener.TriggerRegionUp(region); | 208 | listener.TriggerRegionUp(region); |
169 | } | 209 | } |
170 | 210 | ||
171 | return true; | 211 | return false; |
172 | } | 212 | } |
173 | 213 | ||
174 | public bool TriggerRegionUp(RegionInfo region) | 214 | public bool TriggerRegionUp(RegionInfo region) |
@@ -181,10 +221,14 @@ namespace OpenSim.Region.Communications.Local | |||
181 | //should change from agentCircuitData | 221 | //should change from agentCircuitData |
182 | { | 222 | { |
183 | //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); | 223 | //Console.WriteLine("CommsManager- Trying to Inform a region to expect child agent"); |
224 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Trying to inform region of child agent: " + agentData.firstname + " " + agentData.lastname); | ||
225 | |||
184 | if (m_regionListeners.ContainsKey(regionHandle)) | 226 | if (m_regionListeners.ContainsKey(regionHandle)) |
185 | { | 227 | { |
186 | // Console.WriteLine("CommsManager- Informing a region to expect child agent"); | 228 | // Console.WriteLine("CommsManager- Informing a region to expect child agent"); |
187 | m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData); | 229 | m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agentData); |
230 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Got Listener trigginering local event: " + agentData.firstname + " " + agentData.lastname); | ||
231 | |||
188 | return true; | 232 | return true; |
189 | } | 233 | } |
190 | return false; | 234 | return false; |
@@ -277,8 +321,12 @@ namespace OpenSim.Region.Communications.Local | |||
277 | 321 | ||
278 | public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) | 322 | public void TriggerExpectUser(ulong regionHandle, AgentCircuitData agent) |
279 | { | 323 | { |
324 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other region is sending child agent our way: " + agent.firstname + " " + agent.lastname); | ||
325 | |||
280 | if (m_regionListeners.ContainsKey(regionHandle)) | 326 | if (m_regionListeners.ContainsKey(regionHandle)) |
281 | { | 327 | { |
328 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: FoundLocalRegion To send it to: " + agent.firstname + " " + agent.lastname); | ||
329 | |||
282 | m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent); | 330 | m_regionListeners[regionHandle].TriggerExpectUser(regionHandle, agent); |
283 | } | 331 | } |
284 | } | 332 | } |
@@ -327,8 +375,12 @@ namespace OpenSim.Region.Communications.Local | |||
327 | 375 | ||
328 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) | 376 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) |
329 | { | 377 | { |
378 | // OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: Other local region is sending child agent our way: " + agentData.firstname + " " + agentData.lastname); | ||
379 | |||
330 | if (m_regionListeners.ContainsKey(regionHandle)) | 380 | if (m_regionListeners.ContainsKey(regionHandle)) |
331 | { | 381 | { |
382 | //OpenSim.Framework.Console.MainLog.Instance.Verbose("INTER", rdebugRegionName + ":Local BackEnd: found local region to trigger event on: " + agentData.firstname + " " + agentData.lastname); | ||
383 | |||
332 | TriggerExpectUser(regionHandle, agentData); | 384 | TriggerExpectUser(regionHandle, agentData); |
333 | return true; | 385 | return true; |
334 | } | 386 | } |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index a0d6bd3..282b720 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs | |||
@@ -49,11 +49,33 @@ namespace OpenSim.Region.Communications.OGS1 | |||
49 | { | 49 | { |
50 | private LocalBackEndServices m_localBackend = new LocalBackEndServices(); | 50 | private LocalBackEndServices m_localBackend = new LocalBackEndServices(); |
51 | private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); | 51 | private Dictionary<ulong, RegionInfo> m_remoteRegionInfoCache = new Dictionary<ulong, RegionInfo>(); |
52 | private List<SimpleRegionInfo> m_knownRegions = new List<SimpleRegionInfo>(); | ||
52 | 53 | ||
53 | public BaseHttpServer httpListener; | 54 | public BaseHttpServer httpListener; |
54 | public NetworkServersInfo serversInfo; | 55 | public NetworkServersInfo serversInfo; |
55 | public BaseHttpServer httpServer; | 56 | public BaseHttpServer httpServer; |
57 | public string _gdebugRegionName = ""; | ||
56 | 58 | ||
59 | public string gdebugRegionName | ||
60 | { | ||
61 | get { return _gdebugRegionName; } | ||
62 | set | ||
63 | { | ||
64 | _gdebugRegionName = value; | ||
65 | |||
66 | } | ||
67 | } | ||
68 | public string _rdebugRegionName = ""; | ||
69 | |||
70 | public string rdebugRegionName | ||
71 | { | ||
72 | get { return _rdebugRegionName; } | ||
73 | set | ||
74 | { | ||
75 | _rdebugRegionName = value; | ||
76 | |||
77 | } | ||
78 | } | ||
57 | /// <summary> | 79 | /// <summary> |
58 | /// | 80 | /// |
59 | /// </summary> | 81 | /// </summary> |
@@ -105,10 +127,19 @@ namespace OpenSim.Region.Communications.OGS1 | |||
105 | // Process Response | 127 | // Process Response |
106 | if (GridRespData.ContainsKey("error")) | 128 | if (GridRespData.ContainsKey("error")) |
107 | { | 129 | { |
108 | string errorstring = (string) GridRespData["error"]; | 130 | string errorstring = (string)GridRespData["error"]; |
109 | MainLog.Instance.Error("Unable to connect to grid: " + errorstring); | 131 | MainLog.Instance.Error("Unable to connect to grid: " + errorstring); |
110 | return null; | 132 | return null; |
111 | } | 133 | } |
134 | else | ||
135 | { | ||
136 | //m_knownRegions = RequestNeighbours(regionInfo.RegionLocX, regionInfo.RegionLocY); | ||
137 | |||
138 | |||
139 | } | ||
140 | //SimpleRegionInfo regiondata = new SimpleRegionInfo(); | ||
141 | //regiondata.RegionID = griddatahash["UUID"]; | ||
142 | //regiondata.RemotingAddress = | ||
112 | 143 | ||
113 | return m_localBackend.RegisterRegion(regionInfo); | 144 | return m_localBackend.RegisterRegion(regionInfo); |
114 | } | 145 | } |
@@ -155,7 +186,53 @@ namespace OpenSim.Region.Communications.OGS1 | |||
155 | return neighbours; | 186 | return neighbours; |
156 | } | 187 | } |
157 | 188 | ||
189 | /// <summary> | ||
190 | /// | ||
191 | /// </summary> | ||
192 | /// <param name="regionHandle"></param> | ||
193 | /// <returns></returns> | ||
194 | public RegionInfo RequestNeighbourInfo(LLUUID Region_UUID) | ||
195 | { | ||
196 | RegionInfo regionInfo; | ||
197 | Hashtable requestData = new Hashtable(); | ||
198 | requestData["region_UUID"] = Region_UUID.ToStringHyphenated(); | ||
199 | requestData["authkey"] = serversInfo.GridSendKey; | ||
200 | ArrayList SendParams = new ArrayList(); | ||
201 | SendParams.Add(requestData); | ||
202 | XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); | ||
203 | XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000); | ||
204 | |||
205 | Hashtable responseData = (Hashtable)GridResp.Value; | ||
158 | 206 | ||
207 | if (responseData.ContainsKey("error")) | ||
208 | { | ||
209 | Console.WriteLine("error received from grid server" + responseData["error"]); | ||
210 | return null; | ||
211 | } | ||
212 | |||
213 | uint regX = Convert.ToUInt32((string)responseData["region_locx"]); | ||
214 | uint regY = Convert.ToUInt32((string)responseData["region_locy"]); | ||
215 | string internalIpStr = (string)responseData["sim_ip"]; | ||
216 | uint port = Convert.ToUInt32(responseData["sim_port"]); | ||
217 | string externalUri = (string)responseData["sim_uri"]; | ||
218 | |||
219 | IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port); | ||
220 | string neighbourExternalUri = externalUri; | ||
221 | regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr); | ||
222 | |||
223 | regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]); | ||
224 | regionInfo.RemotingAddress = internalIpStr; | ||
225 | |||
226 | regionInfo.RegionID = new LLUUID((string)responseData["region_UUID"]); | ||
227 | regionInfo.RegionName = (string)responseData["region_name"]; | ||
228 | |||
229 | if (requestData.ContainsKey("regionHandle")) | ||
230 | { | ||
231 | m_remoteRegionInfoCache.Add(Convert.ToUInt64((string)requestData["regionHandle"]), regionInfo); | ||
232 | } | ||
233 | |||
234 | return regionInfo; | ||
235 | } | ||
159 | /// <summary> | 236 | /// <summary> |
160 | /// | 237 | /// |
161 | /// </summary> | 238 | /// </summary> |
@@ -381,7 +458,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
381 | InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim; | 458 | InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim; |
382 | InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing; | 459 | InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing; |
383 | InterRegionSingleton.Instance.OnRegionUp += TriggerRegionUp; | 460 | InterRegionSingleton.Instance.OnRegionUp += TriggerRegionUp; |
384 | 461 | InterRegionSingleton.Instance.OnRegionUp += RegionUp; | |
385 | } | 462 | } |
386 | 463 | ||
387 | #region Methods called by regions in this instance | 464 | #region Methods called by regions in this instance |
@@ -427,7 +504,7 @@ namespace OpenSim.Region.Communications.OGS1 | |||
427 | Console.WriteLine("remoting object not found"); | 504 | Console.WriteLine("remoting object not found"); |
428 | } | 505 | } |
429 | remObject = null; | 506 | remObject = null; |
430 | 507 | MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " + agentData.firstname + " " + agentData.lastname + " and got " + retValue.ToString()); | |
431 | 508 | ||
432 | return retValue; | 509 | return retValue; |
433 | } | 510 | } |
@@ -470,17 +547,27 @@ namespace OpenSim.Region.Communications.OGS1 | |||
470 | // UGLY! | 547 | // UGLY! |
471 | public bool RegionUp(RegionInfo region) | 548 | public bool RegionUp(RegionInfo region) |
472 | { | 549 | { |
473 | RegionInfo regInfo = null; | 550 | |
474 | try | 551 | // This is stupid. For this to work, when the region registers it must request nearby map blocks. |
552 | // In addition to filling the map blocks, it fills a 'known regions' list. | ||
553 | |||
554 | // This known regions list then gets queried on here to get the remoting data from the neighbors. | ||
555 | // *Pull yourself up by your bootstraps?* | ||
556 | |||
557 | if (m_localBackend.RegionUp(region)) | ||
475 | { | 558 | { |
476 | if (m_localBackend.RegionUp(region)) | 559 | return true; |
477 | { | 560 | } |
478 | return true; | 561 | return true; |
479 | } | 562 | foreach (SimpleRegionInfo knownregion in m_knownRegions) |
480 | foreach (RegionInfo remoteInfo in m_remoteRegionInfoCache.Values) | 563 | { |
481 | { | 564 | // Wha? |
482 | regInfo = RequestNeighbourInfo(remoteInfo.RegionHandle); | 565 | RegionInfo regInfo = RequestNeighbourInfo(knownregion.RegionID); |
483 | if (regInfo != null) | 566 | |
567 | try | ||
568 | { | ||
569 | |||
570 | if ((!(regInfo.Equals(null)) && regInfo.RemotingAddress.Length > 0)) | ||
484 | { | 571 | { |
485 | //don't want to be creating a new link to the remote instance every time like we are here | 572 | //don't want to be creating a new link to the remote instance every time like we are here |
486 | bool retValue = false; | 573 | bool retValue = false; |
@@ -501,43 +588,41 @@ namespace OpenSim.Region.Communications.OGS1 | |||
501 | Console.WriteLine("remoting object not found"); | 588 | Console.WriteLine("remoting object not found"); |
502 | } | 589 | } |
503 | remObject = null; | 590 | remObject = null; |
591 | //MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to NotifyRegionUp for " + region.RegionName + " and got " + retValue.ToString()); | ||
504 | 592 | ||
505 | } | 593 | } |
506 | 594 | ||
507 | } | 595 | } |
508 | 596 | catch (RemotingException e) | |
509 | 597 | { | |
510 | return true; | 598 | MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); |
511 | } | 599 | MainLog.Instance.Debug(e.ToString()); |
512 | catch (RemotingException e) | 600 | //return false; |
513 | { | 601 | } |
514 | MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); | 602 | catch (SocketException e) |
515 | MainLog.Instance.Debug(e.ToString()); | 603 | { |
516 | return false; | 604 | MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); |
517 | } | 605 | MainLog.Instance.Debug(e.ToString()); |
518 | catch (SocketException e) | 606 | //return false; |
519 | { | 607 | } |
520 | MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); | 608 | catch (InvalidCredentialException e) |
521 | MainLog.Instance.Debug(e.ToString()); | 609 | { |
522 | return false; | 610 | MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); |
523 | } | 611 | MainLog.Instance.Debug(e.ToString()); |
524 | catch (InvalidCredentialException e) | 612 | //return false; |
525 | { | 613 | } |
526 | MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); | 614 | catch (AuthenticationException e) |
527 | MainLog.Instance.Debug(e.ToString()); | 615 | { |
528 | return false; | 616 | MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); |
529 | } | 617 | MainLog.Instance.Debug(e.ToString()); |
530 | catch (AuthenticationException e) | 618 | //return false; |
531 | { | 619 | } |
532 | MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); | 620 | catch (Exception e) |
533 | MainLog.Instance.Debug(e.ToString()); | 621 | { |
534 | return false; | 622 | MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); |
535 | } | 623 | MainLog.Instance.Debug(e.ToString()); |
536 | catch (Exception e) | 624 | //return false; |
537 | { | 625 | } |
538 | MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); | ||
539 | MainLog.Instance.Debug(e.ToString()); | ||
540 | return false; | ||
541 | } | 626 | } |
542 | return true; | 627 | return true; |
543 | } | 628 | } |
@@ -745,19 +830,23 @@ namespace OpenSim.Region.Communications.OGS1 | |||
745 | /// <returns></returns> | 830 | /// <returns></returns> |
746 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) | 831 | public bool IncomingChildAgent(ulong regionHandle, AgentCircuitData agentData) |
747 | { | 832 | { |
833 | //MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 Agent " + agentData.firstname + " " + agentData.lastname); | ||
834 | |||
748 | try | 835 | try |
749 | { | 836 | { |
750 | return m_localBackend.IncomingChildAgent(regionHandle, agentData); | 837 | return m_localBackend.IncomingChildAgent(regionHandle, agentData); |
751 | } | 838 | } |
752 | catch (RemotingException e) | 839 | catch (RemotingException e) |
753 | { | 840 | { |
754 | MainLog.Instance.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString()); | 841 | //MainLog.Instance.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString()); |
755 | return false; | 842 | return false; |
756 | } | 843 | } |
757 | } | 844 | } |
758 | 845 | ||
759 | public bool TriggerRegionUp(RegionInfo regionData) | 846 | public bool TriggerRegionUp(RegionInfo regionData) |
760 | { | 847 | { |
848 | //MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 RegionUpReport " + regionData.RegionName); | ||
849 | |||
761 | try | 850 | try |
762 | { | 851 | { |
763 | return m_localBackend.TriggerRegionUp(regionData); | 852 | return m_localBackend.TriggerRegionUp(regionData); |