* 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
parent
c7a6d627f2
commit
c99593a47c
|
@ -90,6 +90,31 @@ namespace OpenGridServices.GridServer
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Dictionary<ulong, SimProfileData> getRegions(uint xmin, uint ymin, uint xmax, uint ymax)
|
||||||
|
{
|
||||||
|
Dictionary<ulong, SimProfileData> regions = new Dictionary<ulong, SimProfileData>();
|
||||||
|
|
||||||
|
SimProfileData[] neighbours;
|
||||||
|
|
||||||
|
foreach (KeyValuePair<string, IGridData> kvp in _plugins)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
neighbours = kvp.Value.GetProfilesInRange(xmin, ymin, xmax, ymax);
|
||||||
|
foreach (SimProfileData neighbour in neighbours)
|
||||||
|
{
|
||||||
|
regions[neighbour.regionHandle] = neighbour;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.NORMAL, "Storage: Unable to query regionblock via " + kvp.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a XML String containing a list of the neighbouring regions
|
/// Returns a XML String containing a list of the neighbouring regions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -152,22 +177,45 @@ namespace OpenGridServices.GridServer
|
||||||
|
|
||||||
SimProfileData neighbour;
|
SimProfileData neighbour;
|
||||||
Hashtable NeighbourBlock;
|
Hashtable NeighbourBlock;
|
||||||
for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++)
|
|
||||||
|
bool fastMode = false; // Only compatible with MySQL right now
|
||||||
|
|
||||||
|
if (fastMode)
|
||||||
|
{
|
||||||
|
Dictionary<ulong, SimProfileData> neighbours = getRegions(TheSim.regionLocX - 256, TheSim.regionLocY - 256, TheSim.regionLocX + 256, TheSim.regionLocY + 256);
|
||||||
|
|
||||||
|
foreach (KeyValuePair<ulong, SimProfileData> aSim in neighbours)
|
||||||
{
|
{
|
||||||
if (getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)) != null)
|
NeighbourBlock = new Hashtable();
|
||||||
{
|
NeighbourBlock["sim_ip"] = aSim.Value.serverIP.ToString();
|
||||||
neighbour = getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256));
|
NeighbourBlock["sim_port"] = aSim.Value.serverPort.ToString();
|
||||||
|
NeighbourBlock["region_locx"] = aSim.Value.regionLocX.ToString();
|
||||||
|
NeighbourBlock["region_locy"] = aSim.Value.regionLocY.ToString();
|
||||||
|
NeighbourBlock["UUID"] = aSim.Value.UUID.ToString();
|
||||||
|
|
||||||
NeighbourBlock = new Hashtable();
|
if (aSim.Value.UUID != TheSim.UUID)
|
||||||
NeighbourBlock["sim_ip"] = neighbour.serverIP;
|
SimNeighboursData.Add(NeighbourBlock);
|
||||||
NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
|
|
||||||
NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
|
|
||||||
NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
|
|
||||||
NeighbourBlock["UUID"] = neighbour.UUID.ToString();
|
|
||||||
|
|
||||||
if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int x = -1; x < 2; x++) for (int y = -1; y < 2; y++)
|
||||||
|
{
|
||||||
|
if (getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256)) != null)
|
||||||
|
{
|
||||||
|
neighbour = getRegion(Helpers.UIntsToLong((uint)((TheSim.regionLocX + x) * 256), (uint)(TheSim.regionLocY + y) * 256));
|
||||||
|
|
||||||
|
NeighbourBlock = new Hashtable();
|
||||||
|
NeighbourBlock["sim_ip"] = neighbour.serverIP;
|
||||||
|
NeighbourBlock["sim_port"] = neighbour.serverPort.ToString();
|
||||||
|
NeighbourBlock["region_locx"] = neighbour.regionLocX.ToString();
|
||||||
|
NeighbourBlock["region_locy"] = neighbour.regionLocY.ToString();
|
||||||
|
NeighbourBlock["UUID"] = neighbour.UUID.ToString();
|
||||||
|
|
||||||
|
if (neighbour.UUID != TheSim.UUID) SimNeighboursData.Add(NeighbourBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
responseData["UUID"] = TheSim.UUID.ToString();
|
responseData["UUID"] = TheSim.UUID.ToString();
|
||||||
responseData["region_locx"] = TheSim.regionLocX.ToString();
|
responseData["region_locx"] = TheSim.regionLocX.ToString();
|
||||||
|
|
Loading…
Reference in New Issue