aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenGridServices.GridServer
diff options
context:
space:
mode:
authorAdam Frisby2007-05-14 16:52:52 +0000
committerAdam Frisby2007-05-14 16:52:52 +0000
commitc99593a47ccdb77531362ace2281342cb539e15e (patch)
tree77e16adea084badb24e5f479c18210c489d1c612 /OpenGridServices.GridServer
parentCheck if we have arguments before processing them. (diff)
downloadopensim-SC-c99593a47ccdb77531362ace2281342cb539e15e.zip
opensim-SC-c99593a47ccdb77531362ace2281342cb539e15e.tar.gz
opensim-SC-c99593a47ccdb77531362ace2281342cb539e15e.tar.bz2
opensim-SC-c99593a47ccdb77531362ace2281342cb539e15e.tar.xz
* Added new "fast mode" region neighbour establishment. Reduces query count by 88% when connecting a new sim to the grid. Only compatible with the MySQL data provider right now - disabled by default. Reenable on line 181 of GridManager.cs
Diffstat (limited to '')
-rw-r--r--OpenGridServices.GridServer/GridManager.cs74
1 files changed, 61 insertions, 13 deletions
diff --git a/OpenGridServices.GridServer/GridManager.cs b/OpenGridServices.GridServer/GridManager.cs
index cfccd02..77c22e5 100644
--- a/OpenGridServices.GridServer/GridManager.cs
+++ b/OpenGridServices.GridServer/GridManager.cs
@@ -90,6 +90,31 @@ namespace OpenGridServices.GridServer
90 return null; 90 return null;
91 } 91 }
92 92
93 public Dictionary<ulong, SimProfileData> getRegions(uint xmin, uint ymin, uint xmax, uint ymax)
94 {
95 Dictionary<ulong, SimProfileData> regions = new Dictionary<ulong, SimProfileData>();
96
97 SimProfileData[] neighbours;
98
99 foreach (KeyValuePair<string, IGridData> kvp in _plugins)
100 {
101 try
102 {
103 neighbours = kvp.Value.GetProfilesInRange(xmin, ymin, xmax, ymax);
104 foreach (SimProfileData neighbour in neighbours)
105 {
106 regions[neighbour.regionHandle] = neighbour;
107 }
108 }
109 catch (Exception e)
110 {
111 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.NORMAL, "Storage: Unable to query regionblock via " + kvp.Key);
112 }
113 }
114
115 return regions;
116 }
117
93 /// <summary> 118 /// <summary>
94 /// Returns a XML String containing a list of the neighbouring regions 119 /// Returns a XML String containing a list of the neighbouring regions
95 /// </summary> 120 /// </summary>
@@ -152,22 +177,45 @@ namespace OpenGridServices.GridServer
152 177
153 SimProfileData neighbour; 178 SimProfileData neighbour;
154 Hashtable NeighbourBlock; 179 Hashtable NeighbourBlock;
155 for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++)
156 {
157 if (getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)) != null)
158 {
159 neighbour = getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256));
160 180
161 NeighbourBlock = new Hashtable(); 181 bool fastMode = false; // Only compatible with MySQL right now
162 NeighbourBlock["sim_ip"] = neighbour.serverIP;
163 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
164 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
165 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
166 NeighbourBlock["UUID"] = neighbour.UUID.ToString();
167 182
168 if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock); 183 if (fastMode)
169 } 184 {
185 Dictionary<ulong, SimProfileData> neighbours = getRegions(TheSim.regionLocX - 256, TheSim.regionLocY - 256, TheSim.regionLocX + 256, TheSim.regionLocY + 256);
186
187 foreach (KeyValuePair<ulong, SimProfileData> aSim in neighbours)
188 {
189 NeighbourBlock = new Hashtable();
190 NeighbourBlock["sim_ip"] = aSim.Value.serverIP.ToString();
191 NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString();
192 NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
193 NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
194 NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
195
196 if (aSim.Value.UUID != TheSim.UUID)
197 SimNeighboursData.Add(NeighbourBlock);
170 } 198 }
199 }
200 else
201 {
202 for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++)
203 {
204 if (getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)) != null)
205 {
206 neighbour = getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256));
207
208 NeighbourBlock = new Hashtable();
209 NeighbourBlock["sim_ip"] = neighbour.serverIP;
210 NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
211 NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
212 NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
213 NeighbourBlock["UUID"] = neighbour.UUID.ToString();
214
215 if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock);
216 }
217 }
218 }
171 219
172 responseData["UUID"] = TheSim.UUID.ToString(); 220 responseData["UUID"] = TheSim.UUID.ToString();
173 responseData["region_locx"] = TheSim.regionLocX.ToString(); 221 responseData["region_locx"] = TheSim.regionLocX.ToString();