aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorTeravus Ovares2007-11-29 02:07:19 +0000
committerTeravus Ovares2007-11-29 02:07:19 +0000
commit81ba94fde8871df86e304a3dad7846059fd32045 (patch)
treee69bf4f58fe2a18576eac64f677de196d0f31278 /OpenSim
parentset svn:eol-style (diff)
downloadopensim-SC_OLD-81ba94fde8871df86e304a3dad7846059fd32045.zip
opensim-SC_OLD-81ba94fde8871df86e304a3dad7846059fd32045.tar.gz
opensim-SC_OLD-81ba94fde8871df86e304a3dad7846059fd32045.tar.bz2
opensim-SC_OLD-81ba94fde8871df86e304a3dad7846059fd32045.tar.xz
* Fixed about 7 issues with restarting sims and resolved interRegion comms issues. This includes the issue that MW described this morning.
There's a lot of little nit picky changes that make a world of difference.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/Communications/IInterRegionCommunications.cs2
-rw-r--r--OpenSim/Region/Communications/Local/LocalBackEndServices.cs29
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs183
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs60
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs56
6 files changed, 206 insertions, 134 deletions
diff --git a/OpenSim/Framework/Communications/IInterRegionCommunications.cs b/OpenSim/Framework/Communications/IInterRegionCommunications.cs
index a492c51..e025223 100644
--- a/OpenSim/Framework/Communications/IInterRegionCommunications.cs
+++ b/OpenSim/Framework/Communications/IInterRegionCommunications.cs
@@ -35,7 +35,7 @@ namespace OpenSim.Framework.Communications
35 string rdebugRegionName{ get; set; } 35 string rdebugRegionName{ get; set; }
36 bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData); 36 bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData);
37 bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData); 37 bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData);
38 bool RegionUp(SearializableRegionInfo region); 38 bool RegionUp(SearializableRegionInfo region, ulong regionhandle);
39 39
40 bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying); 40 bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying);
41 bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isFlying); 41 bool ExpectPrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isFlying);
diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
index 0f3ec73..17989d4 100644
--- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
+++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs
@@ -194,34 +194,35 @@ namespace OpenSim.Region.Communications.Local
194 return mapBlocks; 194 return mapBlocks;
195 } 195 }
196 196
197 /// <summary> 197
198 /// </summary> 198 public bool RegionUp(SearializableRegionInfo sregion, ulong regionhandle)
199 /// <param name="regionHandle"></param>
200 /// <param name="agentData"></param>
201 /// <returns></returns>
202 ///
203 public bool RegionUp(SearializableRegionInfo sregion)
204 { 199 {
205 RegionInfo region = new RegionInfo(sregion); 200 RegionInfo region = new RegionInfo(sregion);
206 foreach (RegionCommsListener listener in m_regionListeners.Values) 201 if (m_regionListeners.ContainsKey(regionhandle))
207 { 202 {
208 listener.TriggerRegionUp(region); 203 return m_regionListeners[regionhandle].TriggerRegionUp(region);
209 } 204 }
210 205
211 return false; 206 return false;
212 } 207 }
213 208
214 public bool TriggerRegionUp(RegionInfo region) 209 public bool TriggerRegionUp(RegionInfo region, ulong regionhandle)
215 { 210 {
216 211
217 foreach (RegionCommsListener listener in m_regionListeners.Values) 212 if (m_regionListeners.ContainsKey(regionhandle))
218 { 213 {
219 listener.TriggerRegionUp(region); 214 return m_regionListeners[regionhandle].TriggerRegionUp(region);
220 } 215 }
221 216
222 return true; 217 return false;
223 } 218 }
224 219
220 /// <summary>
221 /// </summary>
222 /// <param name="regionHandle"></param>
223 /// <param name="agentData"></param>
224 /// <returns></returns>
225 ///
225 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData) 226 public bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData)
226 //should change from agentCircuitData 227 //should change from agentCircuitData
227 { 228 {
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index b0442d2..b91f4c2 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -248,39 +248,47 @@ namespace OpenSim.Region.Communications.OGS1
248 } 248 }
249 else 249 else
250 { 250 {
251 Hashtable requestData = new Hashtable(); 251 try
252 requestData["region_handle"] = regionHandle.ToString(); 252 {
253 requestData["authkey"] = serversInfo.GridSendKey; 253 Hashtable requestData = new Hashtable();
254 ArrayList SendParams = new ArrayList(); 254 requestData["region_handle"] = regionHandle.ToString();
255 SendParams.Add(requestData); 255 requestData["authkey"] = serversInfo.GridSendKey;
256 XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams); 256 ArrayList SendParams = new ArrayList();
257 XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000); 257 SendParams.Add(requestData);
258 XmlRpcRequest GridReq = new XmlRpcRequest("simulator_data_request", SendParams);
259 XmlRpcResponse GridResp = GridReq.Send(serversInfo.GridURL, 3000);
258 260
259 Hashtable responseData = (Hashtable) GridResp.Value; 261 Hashtable responseData = (Hashtable)GridResp.Value;
260 262
261 if (responseData.ContainsKey("error")) 263 if (responseData.ContainsKey("error"))
262 { 264 {
263 Console.WriteLine("error received from grid server" + responseData["error"]); 265 Console.WriteLine("error received from grid server" + responseData["error"]);
264 return null; 266 return null;
265 } 267 }
266 268
267 uint regX = Convert.ToUInt32((string) responseData["region_locx"]); 269 uint regX = Convert.ToUInt32((string)responseData["region_locx"]);
268 uint regY = Convert.ToUInt32((string) responseData["region_locy"]); 270 uint regY = Convert.ToUInt32((string)responseData["region_locy"]);
269 string internalIpStr = (string) responseData["sim_ip"]; 271 string internalIpStr = (string)responseData["sim_ip"];
270 uint port = Convert.ToUInt32(responseData["sim_port"]); 272 uint port = Convert.ToUInt32(responseData["sim_port"]);
271 string externalUri = (string) responseData["sim_uri"]; 273 string externalUri = (string)responseData["sim_uri"];
272 274
273 IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int) port); 275 IPEndPoint neighbourInternalEndPoint = new IPEndPoint(IPAddress.Parse(internalIpStr), (int)port);
274 string neighbourExternalUri = externalUri; 276 string neighbourExternalUri = externalUri;
275 regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr); 277 regionInfo = new RegionInfo(regX, regY, neighbourInternalEndPoint, internalIpStr);
276 278
277 regionInfo.RemotingPort = Convert.ToUInt32((string) responseData["remoting_port"]); 279 regionInfo.RemotingPort = Convert.ToUInt32((string)responseData["remoting_port"]);
278 regionInfo.RemotingAddress = internalIpStr; 280 regionInfo.RemotingAddress = internalIpStr;
279 281
280 regionInfo.RegionID = new LLUUID((string) responseData["region_UUID"]); 282 regionInfo.RegionID = new LLUUID((string)responseData["region_UUID"]);
281 regionInfo.RegionName = (string) responseData["region_name"]; 283 regionInfo.RegionName = (string)responseData["region_name"];
282 284
283 m_remoteRegionInfoCache.Add(regionHandle, regionInfo); 285 m_remoteRegionInfoCache.Add(regionHandle, regionInfo);
286 }
287 catch (System.Net.WebException)
288 {
289 MainLog.Instance.Error("GRID", "Region lookup failed for: " + regionHandle.ToString() + " - Is the GridServer down?");
290 return null;
291 }
284 } 292 }
285 293
286 return regionInfo; 294 return regionInfo;
@@ -540,34 +548,33 @@ namespace OpenSim.Region.Communications.OGS1
540 } 548 }
541 549
542 // UGLY! 550 // UGLY!
543 public bool RegionUp(SearializableRegionInfo region) 551 public bool RegionUp(SearializableRegionInfo region, ulong regionhandle)
544 { 552 {
545 553 SearializableRegionInfo regInfo = null;
546 // This is stupid. For this to work, when the region registers it must request nearby map blocks. 554 try
547 // In addition to filling the map blocks, it fills a 'known regions' list.
548
549 // This known regions list then gets queried on here to get the remoting data from the neighbors.
550 // *Pull yourself up by your bootstraps?*
551
552 if (m_localBackend.RegionUp(region))
553 { 555 {
554 return true; 556 // You may ask why this is in here...
555 } 557 // The region asking the grid services about itself..
556 558 // And, surprisingly, the reason is.. it doesn't know
557 foreach (SimpleRegionInfo knownregion in m_knownRegions) 559 // it's own remoting port! How special.
558 { 560 region = new SearializableRegionInfo(RequestNeighbourInfo(region.RegionHandle));
559 561 region.RemotingAddress = region.ExternalHostName;
560 SearializableRegionInfo regInfo = new SearializableRegionInfo(RequestNeighbourInfo(knownregion.RegionID)); 562 region.RemotingPort = (uint) NetworkServersInfo.RemotingListenerPort;
561 563 if (m_localBackend.RegionUp(region,regionhandle))
562 try 564 {
563 { 565 return true;
564 566 }
565 if ((!(regInfo.Equals(null)) && regInfo.RemotingAddress.Length > 0)) 567
568 regInfo = new SearializableRegionInfo(RequestNeighbourInfo(regionhandle));
569 if (regInfo != null)
570 {
571 // If we're not trying to remote to ourselves.
572 if (regInfo.RemotingAddress != region.RemotingAddress && region.RemotingAddress != null)
566 { 573 {
567 //don't want to be creating a new link to the remote instance every time like we are here 574 //don't want to be creating a new link to the remote instance every time like we are here
568 bool retValue = false; 575 bool retValue = false;
569 576
570 577
571 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( 578 OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject(
572 typeof(OGS1InterRegionRemoting), 579 typeof(OGS1InterRegionRemoting),
573 "tcp://" + regInfo.RemotingAddress + 580 "tcp://" + regInfo.RemotingAddress +
@@ -576,49 +583,59 @@ namespace OpenSim.Region.Communications.OGS1
576 583
577 if (remObject != null) 584 if (remObject != null)
578 { 585 {
579 retValue = remObject.RegionUp(region); 586 retValue = remObject.RegionUp(region, regionhandle);
580 } 587 }
581 else 588 else
582 { 589 {
583 Console.WriteLine("remoting object not found"); 590 Console.WriteLine("remoting object not found");
584 } 591 }
585 remObject = null; 592 remObject = null;
586 MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to NotifyRegionUp for " + regInfo.RegionLocX + "," + regInfo.RegionLocY); 593 MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to inform region I'm up");
587 594
595 return retValue;
596 }
597 else
598 {
599 // We're trying to inform ourselves via remoting.
600 // This is here because we're looping over the listeners before we get here.
601 // Odd but it should work.
602 return true;
588 } 603 }
589
590 }
591 catch (RemotingException e)
592 {
593 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
594 MainLog.Instance.Debug(e.ToString());
595 //return false;
596 }
597 catch (SocketException e)
598 {
599 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
600 MainLog.Instance.Debug(e.ToString());
601 //return false;
602 }
603 catch (InvalidCredentialException e)
604 {
605 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
606 MainLog.Instance.Debug(e.ToString());
607 //return false;
608 }
609 catch (AuthenticationException e)
610 {
611 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
612 MainLog.Instance.Debug(e.ToString());
613 //return false;
614 }
615 catch (Exception e)
616 {
617 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
618 MainLog.Instance.Debug(e.ToString());
619 //return false;
620 } 604 }
605
606 return false;
607 }
608 catch (RemotingException e)
609 {
610 MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
611 MainLog.Instance.Debug(e.ToString());
612 return false;
613 }
614 catch (SocketException e)
615 {
616 MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
617 MainLog.Instance.Debug(e.ToString());
618 return false;
621 } 619 }
620 catch (InvalidCredentialException e)
621 {
622 MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
623 MainLog.Instance.Debug(e.ToString());
624 return false;
625 }
626 catch (AuthenticationException e)
627 {
628 MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
629 MainLog.Instance.Debug(e.ToString());
630 return false;
631 }
632 catch (Exception e)
633 {
634 MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionLocX + "," + regInfo.RegionLocY);
635 MainLog.Instance.Debug(e.ToString());
636 return false;
637 }
638
622 return true; 639 return true;
623 } 640 }
624 /// <summary> 641 /// <summary>
@@ -837,13 +854,13 @@ namespace OpenSim.Region.Communications.OGS1
837 } 854 }
838 } 855 }
839 856
840 public bool TriggerRegionUp(SearializableRegionInfo regionData) 857 public bool TriggerRegionUp(SearializableRegionInfo regionData, ulong regionhandle)
841 { 858 {
842 MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 RegionUpReport: " + regionData.RegionLocX + "," + regionData.RegionLocY); 859 MainLog.Instance.Verbose("INTER", gdebugRegionName + ": Incoming OGS1 RegionUpReport: " + regionData.RegionLocX + "," + regionData.RegionLocY);
843 860
844 try 861 try
845 { 862 {
846 return m_localBackend.TriggerRegionUp(new RegionInfo(regionData)); 863 return m_localBackend.TriggerRegionUp(new RegionInfo(regionData), regionhandle);
847 } 864 }
848 865
849 catch (RemotingException e) 866 catch (RemotingException e)
diff --git a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs
index 2f7e591..d55528c 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs
@@ -41,7 +41,7 @@ namespace OpenSim.Region.Communications.OGS1
41 41
42 public delegate bool PrimGroupArrival(ulong regionHandle, LLUUID primID, string objData); 42 public delegate bool PrimGroupArrival(ulong regionHandle, LLUUID primID, string objData);
43 43
44 public delegate bool RegionUp (SearializableRegionInfo region); 44 public delegate bool RegionUp (SearializableRegionInfo region, ulong regionhandle);
45 45
46 public sealed class InterRegionSingleton 46 public sealed class InterRegionSingleton
47 { 47 {
@@ -76,12 +76,12 @@ namespace OpenSim.Region.Communications.OGS1
76 return false; 76 return false;
77 } 77 }
78 78
79 public bool RegionUp(SearializableRegionInfo sregion) 79 public bool RegionUp(SearializableRegionInfo sregion, ulong regionhandle)
80 { 80 {
81 81
82 if (OnRegionUp != null) 82 if (OnRegionUp != null)
83 { 83 {
84 return OnRegionUp(sregion); 84 return OnRegionUp(sregion, regionhandle);
85 } 85 }
86 return false; 86 return false;
87 } 87 }
@@ -130,11 +130,11 @@ namespace OpenSim.Region.Communications.OGS1
130 return false; 130 return false;
131 } 131 }
132 } 132 }
133 public bool RegionUp(SearializableRegionInfo region) 133 public bool RegionUp(SearializableRegionInfo region, ulong regionhandle)
134 { 134 {
135 try 135 try
136 { 136 {
137 return InterRegionSingleton.Instance.RegionUp(region); 137 return InterRegionSingleton.Instance.RegionUp(region, regionhandle);
138 } 138 }
139 catch (RemotingException e) 139 catch (RemotingException e)
140 { 140 {
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 68af360..3309431 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -277,15 +277,41 @@ namespace OpenSim.Region.Environment.Scenes
277 // This fails to get the desired effect and needs further work. 277 // This fails to get the desired effect and needs further work.
278 if (RegionInfo.RegionHandle != otherRegion.RegionHandle) 278 if (RegionInfo.RegionHandle != otherRegion.RegionHandle)
279 { 279 {
280 if (!(m_regionRestartNotifyList.Contains(otherRegion))) 280 if (Math.Abs(otherRegion.RegionLocX - RegionInfo.RegionLocX) <= 1 || Math.Abs(otherRegion.RegionLocY - RegionInfo.RegionLocY) <= 1)
281 { 281 {
282 m_regionRestartNotifyList.Add(otherRegion); 282 try
283 283 {
284 m_restartWaitTimer = new Timer(20000); 284
285 m_restartWaitTimer.AutoReset = false; 285 ForEachScenePresence(delegate(ScenePresence agent)
286 m_restartWaitTimer.Elapsed += new ElapsedEventHandler(restart_Notify_Wait_Elapsed); 286 {
287 m_restartWaitTimer.Start(); 287 if (!(agent.IsChildAgent))
288 {
289 //agent.ControllingClient.new
290 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
291 InformClientOfNeighbor(agent, otherRegion);
292 }
293 }
294
295 );
296 }
297 catch (System.NullReferenceException)
298 {
299 // This means that we're not booted up completely yet.
300 }
301 }
302 else
303 {
304 MainLog.Instance.Verbose("INTERGRID", "Got notice about Region at X:" + otherRegion.RegionLocX.ToString() + " Y:" + otherRegion.RegionLocY.ToString() + " but it was too far away to send to the client");
288 } 305 }
306 //if (!(m_regionRestartNotifyList.Contains(otherRegion)))
307 //{
308 //m_regionRestartNotifyList.Add(otherRegion);
309
310 //m_restartWaitTimer = new Timer(20000);
311 //m_restartWaitTimer.AutoReset = false;
312 // m_restartWaitTimer.Elapsed += new ElapsedEventHandler(restart_Notify_Wait_Elapsed);
313 //m_restartWaitTimer.Start();
314 //}
289 } 315 }
290 return true; 316 return true;
291 } 317 }
@@ -342,25 +368,7 @@ namespace OpenSim.Region.Environment.Scenes
342 m_restartWaitTimer.Stop(); 368 m_restartWaitTimer.Stop();
343 foreach (RegionInfo region in m_regionRestartNotifyList) 369 foreach (RegionInfo region in m_regionRestartNotifyList)
344 { 370 {
345 try 371
346 {
347
348 ForEachScenePresence(delegate(ScenePresence agent)
349 {
350 if (!(agent.IsChildAgent))
351 {
352 //agent.ControllingClient.new
353 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
354 InformClientOfNeighbor(agent, region);
355 }
356 }
357
358 );
359 }
360 catch (System.NullReferenceException)
361 {
362 // This means that we're not booted up completely yet.
363 }
364 } 372 }
365 // Reset list to nothing. 373 // Reset list to nothing.
366 m_regionRestartNotifyList = new List<RegionInfo>(); 374 m_regionRestartNotifyList = new List<RegionInfo>();
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index 892bf81..aad78d5 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -58,6 +58,7 @@ namespace OpenSim.Region.Environment.Scenes
58 //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString()); 58 //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString());
59 59
60 regionCommsHost.debugRegionName = _debugRegionName; 60 regionCommsHost.debugRegionName = _debugRegionName;
61
61 regionCommsHost.OnExpectUser += NewUserConnection; 62 regionCommsHost.OnExpectUser += NewUserConnection;
62 regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; 63 regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
63 regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing; 64 regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing;
@@ -222,7 +223,56 @@ namespace OpenSim.Region.Environment.Scenes
222 } 223 }
223 224
224 #endregion 225 #endregion
226 public delegate void InformNeighbourThatRegionUpDelegate(RegionInfo region, ulong regionhandle);
227
228 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
229 {
230 InformNeighbourThatRegionUpDelegate icon = (InformNeighbourThatRegionUpDelegate)iar.AsyncState;
231 icon.EndInvoke(iar);
232 }
233
234
235 private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle)
236 {
237 MainLog.Instance.Notice("INTERGRID", "Starting to inform neighbors that I'm here");
238 bool regionAccepted = m_commsProvider.InterRegion.RegionUp((new SearializableRegionInfo(region)), regionhandle);
239
240 if (regionAccepted)
241 {
242 MainLog.Instance.Notice("INTERGRID", "Completed informing neighbors that I'm here");
243 }
244 else
245 {
246 MainLog.Instance.Notice("INTERGRID", "Failed to inform neighbors that I'm here");
247 }
248 }
225 249
250 public void InformNeighborsThatRegionisUp(RegionInfo region)
251 {
252 //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
253 List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>();
254
255 lock (neighbours)
256 {
257 neighbours = m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
258 if (neighbours != null)
259 {
260 for (int i = 0; i < neighbours.Count; i++)
261 {
262
263 InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync;
264 // race condition! Arg! I hate race conditions.
265 lock (d)
266 {
267 d.BeginInvoke(region, neighbours[i].RegionHandle,
268 InformNeighborsThatRegionisUpCompleted,
269 d);
270 }
271 }
272 }
273 }
274 //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region));
275 }
226 /// <summary> 276 /// <summary>
227 /// 277 ///
228 /// </summary> 278 /// </summary>
@@ -320,11 +370,7 @@ namespace OpenSim.Region.Environment.Scenes
320 return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying); 370 return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying);
321 } 371 }
322 372
323 public void InformNeighborsThatRegionisUp(RegionInfo region) 373
324 {
325 //MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
326 bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region));
327 }
328 374
329 public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, LLVector3 position, bool isPhysical) 375 public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, LLVector3 position, bool isPhysical)
330 { 376 {