Spin off terrain save into a new thread and make it so that it uses the old

values for places where NaN are found.
avinationmerge
Melanie 2011-12-13 12:58:28 +01:00
parent 6d1d1c0dbf
commit df65245671
1 changed files with 35 additions and 30 deletions

View File

@ -561,6 +561,10 @@ namespace OpenSim.Data.MySQL
public virtual void StoreTerrain(double[,] ter, UUID regionID)
{
Util.FireAndForget(delegate(object x)
{
double[,] oldTerrain = LoadTerrain(regionID);
m_log.Info("[REGION DB]: Storing terrain");
lock (m_dbLock)
@ -583,23 +587,20 @@ namespace OpenSim.Data.MySQL
"1, ?Heightfield)";
cmd2.Parameters.AddWithValue("RegionUUID", regionID.ToString());
cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter));
cmd2.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter, oldTerrain));
ExecuteNonQuery(cmd);
ExecuteNonQuery(cmd2);
}
catch
catch (Exception e)
{
// If we get here there is a NaN in the terrain
// and the terrain can't be saved. A crash here
// is much better than losing all the work
m_log.ErrorFormat("[DATA]: Unable to save terrain. Stopping simulator to prevent data loss");
Environment.Exit(1);
m_log.ErrorFormat(e.ToString());
}
}
}
}
}
});
}
public virtual double[,] LoadTerrain(UUID regionID)
@ -1411,7 +1412,7 @@ namespace OpenSim.Data.MySQL
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
private static Array SerializeTerrain(double[,] val)
private static Array SerializeTerrain(double[,] val, double[,] oldTerrain)
{
MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
BinaryWriter bw = new BinaryWriter(str);
@ -1420,7 +1421,11 @@ namespace OpenSim.Data.MySQL
for (int x = 0; x < (int)Constants.RegionSize; x++)
for (int y = 0; y < (int)Constants.RegionSize; y++)
{
double height = val[x, y];
double height = 20.0;
if (oldTerrain != null)
height = oldTerrain[x, y];
if (!double.IsNaN(val[x, y]))
height = val[x, y];
if (height == 0.0)
height = double.Epsilon;